hatetepe 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/hatetepe/app.rb +18 -13
 - data/lib/hatetepe/body.rb +4 -4
 - data/lib/hatetepe/builder.rb +2 -2
 - data/lib/hatetepe/client.rb +21 -25
 - data/lib/hatetepe/events.rb +4 -4
 - data/lib/hatetepe/parser.rb +6 -6
 - data/lib/hatetepe/pipeline.rb +27 -0
 - data/lib/hatetepe/proxy.rb +2 -2
 - data/lib/hatetepe/request.rb +5 -5
 - data/lib/hatetepe/response.rb +2 -2
 - data/lib/hatetepe/server.rb +47 -41
 - data/lib/hatetepe/version.rb +1 -1
 - data/lib/hatetepe.rb +0 -1
 - data/lib/rack/handler/hatetepe.rb +2 -2
 - data/spec/unit/app_spec.rb +12 -6
 - data/spec/unit/client_spec.rb +2 -19
 - data/spec/unit/server_spec.rb +4 -2
 - metadata +21 -20
 
    
        data/lib/hatetepe/app.rb
    CHANGED
    
    | 
         @@ -17,7 +17,7 @@ module Hatetepe 
     | 
|
| 
       17 
17 
     | 
    
         
             
                # Initializes a new App object.
         
     | 
| 
       18 
18 
     | 
    
         
             
                #
         
     | 
| 
       19 
19 
     | 
    
         
             
                # @param [#call] app
         
     | 
| 
       20 
     | 
    
         
            -
                #   The Rack app
         
     | 
| 
      
 20 
     | 
    
         
            +
                #   The Rack app.
         
     | 
| 
       21 
21 
     | 
    
         
             
                #
         
     | 
| 
       22 
22 
     | 
    
         
             
                def initialize(app)
         
     | 
| 
       23 
23 
     | 
    
         
             
                  @app = app
         
     | 
| 
         @@ -30,43 +30,48 @@ module Hatetepe 
     | 
|
| 
       30 
30 
     | 
    
         
             
                # 500 response if the Rack app raises an error.
         
     | 
| 
       31 
31 
     | 
    
         
             
                #
         
     | 
| 
       32 
32 
     | 
    
         
             
                # @param [Hash] env
         
     | 
| 
       33 
     | 
    
         
            -
                #   The Rack environment
         
     | 
| 
      
 33 
     | 
    
         
            +
                #   The Rack environment.
         
     | 
| 
       34 
34 
     | 
    
         
             
                #
         
     | 
| 
       35 
35 
     | 
    
         
             
                def call(env)
         
     | 
| 
       36 
     | 
    
         
            -
                  env["async.callback"] = proc  
     | 
| 
      
 36 
     | 
    
         
            +
                  env["async.callback"] = proc do |response|
         
     | 
| 
       37 
37 
     | 
    
         
             
                    postprocess env, response
         
     | 
| 
       38 
     | 
    
         
            -
                   
     | 
| 
      
 38 
     | 
    
         
            +
                  end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
       40 
40 
     | 
    
         
             
                  response = ASYNC_RESPONSE
         
     | 
| 
       41 
     | 
    
         
            -
                  catch 
     | 
| 
      
 41 
     | 
    
         
            +
                  catch :async do
         
     | 
| 
       42 
42 
     | 
    
         
             
                    response = app.call(env) rescue ERROR_RESPONSE
         
     | 
| 
       43 
     | 
    
         
            -
                   
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
                  
         
     | 
| 
       44 
45 
     | 
    
         
             
                  postprocess env, response
         
     | 
| 
       45 
46 
     | 
    
         
             
                end
         
     | 
| 
       46 
47 
     | 
    
         | 
| 
       47 
48 
     | 
    
         
             
                # Sends the response.
         
     | 
| 
       48 
49 
     | 
    
         
             
                #
         
     | 
| 
       49 
50 
     | 
    
         
             
                # Does nothing if response status is indicating an asynchronous response.
         
     | 
| 
       50 
     | 
    
         
            -
                # This is the case if the response Array's first element equals -1.
         
     | 
| 
      
 51 
     | 
    
         
            +
                # This is the case if the response +Array+'s first element equals -1.
         
     | 
| 
       51 
52 
     | 
    
         
             
                # Otherwise it will start sending the response (status and headers).
         
     | 
| 
       52 
53 
     | 
    
         
             
                #
         
     | 
| 
       53 
54 
     | 
    
         
             
                # If the body indicates streaming it will return after sending the status
         
     | 
| 
       54 
     | 
    
         
            -
                # and headers. This happens if the body equals Rack::STREAMING 
     | 
| 
       55 
     | 
    
         
            -
                # it sends each body chunk and then closes the response 
     | 
| 
      
 55 
     | 
    
         
            +
                # and headers. This happens if the body equals +Rack::STREAMING+ or isn't
         
     | 
| 
      
 56 
     | 
    
         
            +
                # set. Otherwise it sends each body chunk and then closes the response
         
     | 
| 
      
 57 
     | 
    
         
            +
                # stream.
         
     | 
| 
      
 58 
     | 
    
         
            +
                #
         
     | 
| 
      
 59 
     | 
    
         
            +
                # Sending an empty body is as simple as passing an object that responds to
         
     | 
| 
      
 60 
     | 
    
         
            +
                # +each+ but doesn't actually yield anything.
         
     | 
| 
       56 
61 
     | 
    
         
             
                #
         
     | 
| 
       57 
62 
     | 
    
         
             
                # @param [Hash] env
         
     | 
| 
       58 
     | 
    
         
            -
                #   The Rack environment
         
     | 
| 
      
 63 
     | 
    
         
            +
                #   The Rack environment.
         
     | 
| 
       59 
64 
     | 
    
         
             
                # @param [Array] response
         
     | 
| 
       60 
     | 
    
         
            -
                #   An array of 1..3 length containing the status, headers, body
         
     | 
| 
      
 65 
     | 
    
         
            +
                #   An array of 1..3 length containing the status, headers, body.
         
     | 
| 
       61 
66 
     | 
    
         
             
                #
         
     | 
| 
       62 
67 
     | 
    
         
             
                def postprocess(env, response)
         
     | 
| 
       63 
68 
     | 
    
         
             
                  return if response[0] == ASYNC_RESPONSE[0]
         
     | 
| 
       64 
69 
     | 
    
         | 
| 
       65 
70 
     | 
    
         
             
                  env["stream.start"].call response[0..1]
         
     | 
| 
       66 
     | 
    
         
            -
                  return if response[2] == Rack::STREAMING
         
     | 
| 
      
 71 
     | 
    
         
            +
                  return if !response[2] || response[2] == Rack::STREAMING
         
     | 
| 
       67 
72 
     | 
    
         | 
| 
       68 
73 
     | 
    
         
             
                  begin
         
     | 
| 
       69 
     | 
    
         
            -
                    response[2].each  
     | 
| 
      
 74 
     | 
    
         
            +
                    response[2].each &env["stream.send"]
         
     | 
| 
       70 
75 
     | 
    
         
             
                  ensure
         
     | 
| 
       71 
76 
     | 
    
         
             
                    env["stream.close"].call
         
     | 
| 
       72 
77 
     | 
    
         
             
                  end
         
     | 
    
        data/lib/hatetepe/body.rb
    CHANGED
    
    | 
         @@ -98,7 +98,7 @@ module Hatetepe 
     | 
|
| 
       98 
98 
     | 
    
         
             
                # Immediately yields all data that has already arrived. Blocks until the
         
     | 
| 
       99 
99 
     | 
    
         
             
                # Body is write-closed and yields for each call to #write until then.
         
     | 
| 
       100 
100 
     | 
    
         
             
                #
         
     | 
| 
       101 
     | 
    
         
            -
                # @yield [String] Block to execute for each incoming data chunk
         
     | 
| 
      
 101 
     | 
    
         
            +
                # @yield [String] Block to execute for each incoming data chunk.
         
     | 
| 
       102 
102 
     | 
    
         
             
                #
         
     | 
| 
       103 
103 
     | 
    
         
             
                # @return [undefined]
         
     | 
| 
       104 
104 
     | 
    
         
             
                def each(&block)
         
     | 
| 
         @@ -152,15 +152,15 @@ module Hatetepe 
     | 
|
| 
       152 
152 
     | 
    
         
             
                # number of bytes written.
         
     | 
| 
       153 
153 
     | 
    
         
             
                #
         
     | 
| 
       154 
154 
     | 
    
         
             
                # @param [String] data
         
     | 
| 
       155 
     | 
    
         
            -
                #   The data to append
         
     | 
| 
      
 155 
     | 
    
         
            +
                #   The data to append.
         
     | 
| 
       156 
156 
     | 
    
         
             
                #
         
     | 
| 
       157 
157 
     | 
    
         
             
                # @return [Fixnum]
         
     | 
| 
       158 
158 
     | 
    
         
             
                #   The number of bytes written.
         
     | 
| 
       159 
159 
     | 
    
         
             
                def write(data)
         
     | 
| 
       160 
160 
     | 
    
         
             
                  ret = io.write data
         
     | 
| 
       161 
     | 
    
         
            -
                  Fiber.new  
     | 
| 
      
 161 
     | 
    
         
            +
                  Fiber.new do
         
     | 
| 
       162 
162 
     | 
    
         
             
                    @receivers.each {|r| r.call data }
         
     | 
| 
       163 
     | 
    
         
            -
                   
     | 
| 
      
 163 
     | 
    
         
            +
                  end.resume
         
     | 
| 
       164 
164 
     | 
    
         
             
                  ret
         
     | 
| 
       165 
165 
     | 
    
         
             
                end
         
     | 
| 
       166 
166 
     | 
    
         
             
              end
         
     | 
    
        data/lib/hatetepe/builder.rb
    CHANGED
    
    | 
         @@ -158,9 +158,9 @@ module Hatetepe 
     | 
|
| 
       158 
158 
     | 
    
         
             
                def error(message)
         
     | 
| 
       159 
159 
     | 
    
         
             
                  exception = BuilderError.new(message)
         
     | 
| 
       160 
160 
     | 
    
         
             
                  unless on_error.empty?
         
     | 
| 
       161 
     | 
    
         
            -
                    on_error.each {|blk| blk.call 
     | 
| 
      
 161 
     | 
    
         
            +
                    on_error.each {|blk| blk.call exception }
         
     | 
| 
       162 
162 
     | 
    
         
             
                  else
         
     | 
| 
       163 
     | 
    
         
            -
                    raise 
     | 
| 
      
 163 
     | 
    
         
            +
                    raise exception
         
     | 
| 
       164 
164 
     | 
    
         
             
                  end
         
     | 
| 
       165 
165 
     | 
    
         
             
                end
         
     | 
| 
       166 
166 
     | 
    
         
             
              end
         
     | 
    
        data/lib/hatetepe/client.rb
    CHANGED
    
    | 
         @@ -21,24 +21,25 @@ module Hatetepe 
     | 
|
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
                  headers["User-Agent"] ||= "hatetepe/#{VERSION}"
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                   
     | 
| 
      
 24 
     | 
    
         
            +
                  Request.new(verb, uri.request_uri).tap do |req|
         
     | 
| 
       25 
25 
     | 
    
         
             
                    req.headers = headers
         
     | 
| 
       26 
26 
     | 
    
         
             
                    req.body = body || Body.new.tap {|b| b.close_write }
         
     | 
| 
       27 
27 
     | 
    
         
             
                    client << req
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
                    EM::Synchrony.sync req
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end.response
         
     | 
| 
       29 
30 
     | 
    
         
             
                end
         
     | 
| 
       30 
31 
     | 
    
         | 
| 
       31 
32 
     | 
    
         
             
                class << self
         
     | 
| 
       32 
     | 
    
         
            -
                  [:get, :head].each  
     | 
| 
       33 
     | 
    
         
            -
                    define_method 
     | 
| 
      
 33 
     | 
    
         
            +
                  [:get, :head].each do |verb|
         
     | 
| 
      
 34 
     | 
    
         
            +
                    define_method verb do |uri, headers = {}|
         
     | 
| 
       34 
35 
     | 
    
         
             
                      request verb.to_s.upcase, uri, headers
         
     | 
| 
       35 
     | 
    
         
            -
                     
     | 
| 
       36 
     | 
    
         
            -
                   
     | 
| 
       37 
     | 
    
         
            -
                  [:options, :post, :put, :delete, :trace, :connect].each  
     | 
| 
       38 
     | 
    
         
            -
                    define_method 
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
                  [:options, :post, :put, :delete, :trace, :connect].each do |verb|
         
     | 
| 
      
 39 
     | 
    
         
            +
                    define_method verb do |uri, headers = {}, body = nil|
         
     | 
| 
       39 
40 
     | 
    
         
             
                      request verb.to_s.upcase, uri, headers, body
         
     | 
| 
       40 
     | 
    
         
            -
                     
     | 
| 
       41 
     | 
    
         
            -
                   
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
                  end
         
     | 
| 
       42 
43 
     | 
    
         
             
                end
         
     | 
| 
       43 
44 
     | 
    
         | 
| 
       44 
45 
     | 
    
         
             
                attr_reader :config
         
     | 
| 
         @@ -52,17 +53,16 @@ module Hatetepe 
     | 
|
| 
       52 
53 
     | 
    
         
             
                end
         
     | 
| 
       53 
54 
     | 
    
         | 
| 
       54 
55 
     | 
    
         
             
                def post_init
         
     | 
| 
       55 
     | 
    
         
            -
                  parser.on_response  
     | 
| 
      
 56 
     | 
    
         
            +
                  parser.on_response do |response|
         
     | 
| 
       56 
57 
     | 
    
         
             
                    requests.find {|req| !req.response }.response = response
         
     | 
| 
       57 
     | 
    
         
            -
                   
     | 
| 
      
 58 
     | 
    
         
            +
                  end
         
     | 
| 
       58 
59 
     | 
    
         | 
| 
       59 
     | 
    
         
            -
                  parser.on_headers  
     | 
| 
       60 
     | 
    
         
            -
                    requests.reverse.find {|req| !!req.response }.tap  
     | 
| 
      
 60 
     | 
    
         
            +
                  parser.on_headers do
         
     | 
| 
      
 61 
     | 
    
         
            +
                    requests.reverse.find {|req| !!req.response }.tap do |req|
         
     | 
| 
      
 62 
     | 
    
         
            +
                      req.response.body.source = self
         
     | 
| 
       61 
63 
     | 
    
         
             
                      req.succeed req.response
         
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                    }
         
     | 
| 
       65 
     | 
    
         
            -
                  }
         
     | 
| 
      
 64 
     | 
    
         
            +
                    end
         
     | 
| 
      
 65 
     | 
    
         
            +
                  end
         
     | 
| 
       66 
66 
     | 
    
         | 
| 
       67 
67 
     | 
    
         
             
                  #builder.on_write {|chunk|
         
     | 
| 
       68 
68 
     | 
    
         
             
                  # ap "-> #{chunk}"
         
     | 
| 
         @@ -74,7 +74,7 @@ module Hatetepe 
     | 
|
| 
       74 
74 
     | 
    
         
             
                  request.headers["Host"] = "#{config[:host]}:#{config[:port]}"
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
                  requests << request
         
     | 
| 
       77 
     | 
    
         
            -
                  Fiber.new  
     | 
| 
      
 77 
     | 
    
         
            +
                  Fiber.new do
         
     | 
| 
       78 
78 
     | 
    
         
             
                    builder.request_line request.verb, request.uri
         
     | 
| 
       79 
79 
     | 
    
         | 
| 
       80 
80 
     | 
    
         
             
                    if request.headers["Content-Type"] == "application/x-www-form-urlencoded"
         
     | 
| 
         @@ -96,7 +96,7 @@ module Hatetepe 
     | 
|
| 
       96 
96 
     | 
    
         
             
                    end
         
     | 
| 
       97 
97 
     | 
    
         | 
| 
       98 
98 
     | 
    
         
             
                    builder.complete
         
     | 
| 
       99 
     | 
    
         
            -
                   
     | 
| 
      
 99 
     | 
    
         
            +
                  end.resume
         
     | 
| 
       100 
100 
     | 
    
         
             
                end
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
       102 
102 
     | 
    
         
             
                def receive_data(data)
         
     | 
| 
         @@ -105,11 +105,7 @@ module Hatetepe 
     | 
|
| 
       105 
105 
     | 
    
         
             
                end
         
     | 
| 
       106 
106 
     | 
    
         | 
| 
       107 
107 
     | 
    
         
             
                def stop
         
     | 
| 
       108 
     | 
    
         
            -
                   
     | 
| 
       109 
     | 
    
         
            -
                end
         
     | 
| 
       110 
     | 
    
         
            -
                
         
     | 
| 
       111 
     | 
    
         
            -
                def responses
         
     | 
| 
       112 
     | 
    
         
            -
                  requests.map(&:response).compact
         
     | 
| 
      
 108 
     | 
    
         
            +
                  close_connection
         
     | 
| 
       113 
109 
     | 
    
         
             
                end
         
     | 
| 
       114 
110 
     | 
    
         
             
              end
         
     | 
| 
       115 
111 
     | 
    
         
             
            end
         
     | 
    
        data/lib/hatetepe/events.rb
    CHANGED
    
    | 
         @@ -12,23 +12,23 @@ module Hatetepe 
     | 
|
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
                def event!(name, *args)
         
     | 
| 
       14 
14 
     | 
    
         
             
                  @state = name
         
     | 
| 
       15 
     | 
    
         
            -
                  event 
     | 
| 
      
 15 
     | 
    
         
            +
                  event name, *args
         
     | 
| 
       16 
16 
     | 
    
         
             
                end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
                module ClassMethods
         
     | 
| 
       19 
19 
     | 
    
         
             
                  def event(name, *more_names)
         
     | 
| 
       20 
     | 
    
         
            -
                    define_method 
     | 
| 
      
 20 
     | 
    
         
            +
                    define_method :"on_#{name}" do |&block|
         
     | 
| 
       21 
21 
     | 
    
         
             
                      ivar = :"@on_#{name}"
         
     | 
| 
       22 
22 
     | 
    
         
             
                      store = instance_variable_get(ivar)
         
     | 
| 
       23 
23 
     | 
    
         
             
                      store ||= instance_variable_set(ivar, [])
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                      return store unless block
         
     | 
| 
       26 
26 
     | 
    
         
             
                      store << block
         
     | 
| 
       27 
     | 
    
         
            -
                     
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                    define_method(:"#{name}?") { state == name }
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
                    more_names.each  
     | 
| 
      
 31 
     | 
    
         
            +
                    more_names.each &method(:event)
         
     | 
| 
       32 
32 
     | 
    
         
             
                  end
         
     | 
| 
       33 
33 
     | 
    
         
             
                end
         
     | 
| 
       34 
34 
     | 
    
         
             
              end
         
     | 
    
        data/lib/hatetepe/parser.rb
    CHANGED
    
    | 
         @@ -19,8 +19,8 @@ module Hatetepe 
     | 
|
| 
       19 
19 
     | 
    
         
             
                attr_reader :message
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
                def initialize(&block)
         
     | 
| 
       22 
     | 
    
         
            -
                  @parser = HTTP::Parser.new.tap  
     | 
| 
       23 
     | 
    
         
            -
                    p.on_headers_complete = proc  
     | 
| 
      
 22 
     | 
    
         
            +
                  @parser = HTTP::Parser.new.tap do |p|
         
     | 
| 
      
 23 
     | 
    
         
            +
                    p.on_headers_complete = proc do
         
     | 
| 
       24 
24 
     | 
    
         
             
                      version = p.http_version.join(".")
         
     | 
| 
       25 
25 
     | 
    
         
             
                      if p.http_method
         
     | 
| 
       26 
26 
     | 
    
         
             
                        @message = Request.new(p.http_method, p.request_url, version)
         
     | 
| 
         @@ -35,14 +35,14 @@ module Hatetepe 
     | 
|
| 
       35 
35 
     | 
    
         | 
| 
       36 
36 
     | 
    
         
             
                      event! :body, message.body
         
     | 
| 
       37 
37 
     | 
    
         
             
                      nil
         
     | 
| 
       38 
     | 
    
         
            -
                     
     | 
| 
      
 38 
     | 
    
         
            +
                    end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
                    p.on_body = proc  
     | 
| 
      
 40 
     | 
    
         
            +
                    p.on_body = proc do |chunk|
         
     | 
| 
       41 
41 
     | 
    
         
             
                      message.body.write chunk unless message.body.closed_write?
         
     | 
| 
       42 
     | 
    
         
            -
                     
     | 
| 
      
 42 
     | 
    
         
            +
                    end
         
     | 
| 
       43 
43 
     | 
    
         | 
| 
       44 
44 
     | 
    
         
             
                    p.on_message_complete = method(:complete)
         
     | 
| 
       45 
     | 
    
         
            -
                   
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
       46 
46 
     | 
    
         | 
| 
       47 
47 
     | 
    
         
             
                  reset
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Hatetepe
         
     | 
| 
      
 2 
     | 
    
         
            +
              # TODO move specs from server_spec.rb to pipeline_spec.rb
         
     | 
| 
      
 3 
     | 
    
         
            +
              class Pipeline
         
     | 
| 
      
 4 
     | 
    
         
            +
                attr_reader :app
         
     | 
| 
      
 5 
     | 
    
         
            +
                
         
     | 
| 
      
 6 
     | 
    
         
            +
                def initialize(app)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @app = app
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
                
         
     | 
| 
      
 10 
     | 
    
         
            +
                def call(env)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  previous, request = env["hatetepe.connection"].requests.values_at(-2, -1)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  blocks = env.values_at("stream.start", "stream.close")
         
     | 
| 
      
 13 
     | 
    
         
            +
                  
         
     | 
| 
      
 14 
     | 
    
         
            +
                  env["stream.start"] = proc do |response|
         
     | 
| 
      
 15 
     | 
    
         
            +
                    EM::Synchrony.sync previous if previous
         
     | 
| 
      
 16 
     | 
    
         
            +
                    blocks[0].call response
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
                  
         
     | 
| 
      
 19 
     | 
    
         
            +
                  env["stream.close"] = proc do
         
     | 
| 
      
 20 
     | 
    
         
            +
                    blocks[1].call
         
     | 
| 
      
 21 
     | 
    
         
            +
                    request.succeed
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                  
         
     | 
| 
      
 24 
     | 
    
         
            +
                  app.call env
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/hatetepe/proxy.rb
    CHANGED
    
    | 
         @@ -27,12 +27,12 @@ module Hatetepe 
     | 
|
| 
       27 
27 
     | 
    
         
             
                  build_request(env, target).tap do |req|
         
     | 
| 
       28 
28 
     | 
    
         
             
                    cl << req
         
     | 
| 
       29 
29 
     | 
    
         
             
                    EM::Synchrony.sync req
         
     | 
| 
       30 
     | 
    
         
            -
                    cl.stop unless client
         
     | 
| 
      
 30 
     | 
    
         
            +
                    req.response.body.callback { cl.stop } unless client
         
     | 
| 
       31 
31 
     | 
    
         
             
                    env["proxy.callback"].call req.response
         
     | 
| 
       32 
32 
     | 
    
         
             
                  end
         
     | 
| 
       33 
33 
     | 
    
         
             
                end
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
                # TODO only  
     | 
| 
      
 35 
     | 
    
         
            +
                # TODO use only +env+ to build the request
         
     | 
| 
       36 
36 
     | 
    
         
             
                def build_request(env, target)
         
     | 
| 
       37 
37 
     | 
    
         
             
                  unless base = env["hatetepe.request"]
         
     | 
| 
       38 
38 
     | 
    
         
             
                    raise ArgumentError, "Proxying requires env[hatetepe.request] to be set"
         
     | 
    
        data/lib/hatetepe/request.rb
    CHANGED
    
    | 
         @@ -18,16 +18,16 @@ module Hatetepe 
     | 
|
| 
       18 
18 
     | 
    
         
             
                    "rack.input" => body,
         
     | 
| 
       19 
19 
     | 
    
         
             
                    "REQUEST_METHOD" => verb.dup,
         
     | 
| 
       20 
20 
     | 
    
         
             
                    "REQUEST_URI" => uri.dup
         
     | 
| 
       21 
     | 
    
         
            -
                  }.tap  
     | 
| 
       22 
     | 
    
         
            -
                    headers.each  
     | 
| 
      
 21 
     | 
    
         
            +
                  }.tap do |hsh|
         
     | 
| 
      
 22 
     | 
    
         
            +
                    headers.each do |key, value|
         
     | 
| 
       23 
23 
     | 
    
         
             
                      key = key.upcase.gsub! /[^A-Z]/, "_"
         
     | 
| 
       24 
24 
     | 
    
         
             
                      key = "HTTP_#{key}" unless key =~ /^CONTENT_(TYPE|LENGTH)$/
         
     | 
| 
       25 
     | 
    
         
            -
                      hsh[key] = value
         
     | 
| 
       26 
     | 
    
         
            -
                     
     | 
| 
      
 25 
     | 
    
         
            +
                      hsh[key] = value.dup
         
     | 
| 
      
 26 
     | 
    
         
            +
                    end
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
                    hsh["REQUEST_PATH"], qm, hsh["QUERY_STRING"] = uri.partition("?")
         
     | 
| 
       29 
29 
     | 
    
         
             
                    hsh["PATH_INFO"], hsh["SCRIPT_NAME"] = hsh["REQUEST_PATH"].dup, ""
         
     | 
| 
       30 
     | 
    
         
            -
                   
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
       31 
31 
     | 
    
         
             
                end
         
     | 
| 
       32 
32 
     | 
    
         
             
              end
         
     | 
| 
       33 
33 
     | 
    
         
             
            end
         
     | 
    
        data/lib/hatetepe/response.rb
    CHANGED
    
    
    
        data/lib/hatetepe/server.rb
    CHANGED
    
    | 
         @@ -5,14 +5,15 @@ require "rack" 
     | 
|
| 
       5 
5 
     | 
    
         
             
            require "hatetepe/app"
         
     | 
| 
       6 
6 
     | 
    
         
             
            require "hatetepe/builder"
         
     | 
| 
       7 
7 
     | 
    
         
             
            require "hatetepe/parser"
         
     | 
| 
      
 8 
     | 
    
         
            +
            require "hatetepe/pipeline"
         
     | 
| 
      
 9 
     | 
    
         
            +
            require "hatetepe/proxy"
         
     | 
| 
       8 
10 
     | 
    
         
             
            require "hatetepe/request"
         
     | 
| 
       9 
11 
     | 
    
         
             
            require "hatetepe/version"
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
13 
     | 
    
         
             
            module Hatetepe
         
     | 
| 
       12 
14 
     | 
    
         
             
              class Server < EM::Connection
         
     | 
| 
       13 
15 
     | 
    
         
             
                def self.start(config)
         
     | 
| 
       14 
     | 
    
         
            -
                   
     | 
| 
       15 
     | 
    
         
            -
                  #Prefork.run server if config[:prefork]
         
     | 
| 
      
 16 
     | 
    
         
            +
                  EM.start_server config[:host], config[:port], self, config
         
     | 
| 
       16 
17 
     | 
    
         
             
                end
         
     | 
| 
       17 
18 
     | 
    
         | 
| 
       18 
19 
     | 
    
         
             
                attr_reader :app, :config, :errors
         
     | 
| 
         @@ -21,12 +22,13 @@ module Hatetepe 
     | 
|
| 
       21 
22 
     | 
    
         
             
                def initialize(config)
         
     | 
| 
       22 
23 
     | 
    
         
             
                  @config = config
         
     | 
| 
       23 
24 
     | 
    
         
             
                  @errors = config[:errors] || $stderr
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                  @app = Rack::Builder.new.tap  
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  @app = Rack::Builder.new.tap do |b|
         
     | 
| 
      
 27 
     | 
    
         
            +
                    b.use Hatetepe::Pipeline
         
     | 
| 
       26 
28 
     | 
    
         
             
                    b.use Hatetepe::App
         
     | 
| 
       27 
29 
     | 
    
         
             
                    b.use Hatetepe::Proxy
         
     | 
| 
       28 
30 
     | 
    
         
             
                    b.run config[:app]
         
     | 
| 
       29 
     | 
    
         
            -
                   
     | 
| 
      
 31 
     | 
    
         
            +
                  end.to_app
         
     | 
| 
       30 
32 
     | 
    
         | 
| 
       31 
33 
     | 
    
         
             
                  super
         
     | 
| 
       32 
34 
     | 
    
         
             
                end
         
     | 
| 
         @@ -53,49 +55,53 @@ module Hatetepe 
     | 
|
| 
       53 
55 
     | 
    
         
             
                end
         
     | 
| 
       54 
56 
     | 
    
         | 
| 
       55 
57 
     | 
    
         
             
                def process(*)
         
     | 
| 
       56 
     | 
    
         
            -
                   
     | 
| 
      
 58 
     | 
    
         
            +
                  request = requests.last
         
     | 
| 
       57 
59 
     | 
    
         | 
| 
       58 
     | 
    
         
            -
                  env = request.to_hash.tap  
     | 
| 
       59 
     | 
    
         
            -
                    e 
     | 
| 
       60 
     | 
    
         
            -
                    e[" 
     | 
| 
       61 
     | 
    
         
            -
                    e["rack.input"].source = self
         
     | 
| 
       62 
     | 
    
         
            -
                    e["rack.errors"] = errors
         
     | 
| 
       63 
     | 
    
         
            -
                    
         
     | 
| 
       64 
     | 
    
         
            -
                    e["rack.multithread"] = false
         
     | 
| 
       65 
     | 
    
         
            -
                    e["rack.multiprocess"] = false
         
     | 
| 
       66 
     | 
    
         
            -
                    e["rack.run_once"] = false
         
     | 
| 
       67 
     | 
    
         
            -
                    
         
     | 
| 
       68 
     | 
    
         
            -
                    e["SERVER_NAME"] = config[:host].dup
         
     | 
| 
       69 
     | 
    
         
            -
                    e["SERVER_PORT"] = String(config[:port])
         
     | 
| 
       70 
     | 
    
         
            -
                    
         
     | 
| 
       71 
     | 
    
         
            -
                    host = e["HTTP_HOST"] || config[:host].dup
         
     | 
| 
       72 
     | 
    
         
            -
                    host += ":#{config[:port]}" unless host.include? ":"
         
     | 
| 
       73 
     | 
    
         
            -
                    e["HTTP_HOST"] = host
         
     | 
| 
       74 
     | 
    
         
            -
                    
         
     | 
| 
       75 
     | 
    
         
            -
                    e["stream.start"] = proc {|response|
         
     | 
| 
      
 60 
     | 
    
         
            +
                  env = request.to_hash.tap do |e|
         
     | 
| 
      
 61 
     | 
    
         
            +
                    inject_environment e
         
     | 
| 
      
 62 
     | 
    
         
            +
                    e["stream.start"] = proc do |response|
         
     | 
| 
       76 
63 
     | 
    
         
             
                      e.delete "stream.start"
         
     | 
| 
       77 
     | 
    
         
            -
                       
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                      builder.response_line response[0]
         
     | 
| 
       80 
     | 
    
         
            -
                      response[1]["Server"] = "hatetepe/#{VERSION}"
         
     | 
| 
       81 
     | 
    
         
            -
                      builder.headers response[1]
         
     | 
| 
       82 
     | 
    
         
            -
                    }
         
     | 
| 
       83 
     | 
    
         
            -
                    
         
     | 
| 
      
 64 
     | 
    
         
            +
                      start_response response
         
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
       84 
66 
     | 
    
         
             
                    e["stream.send"] = builder.method(:body_chunk)
         
     | 
| 
       85 
     | 
    
         
            -
                    
         
     | 
| 
       86 
     | 
    
         
            -
                    e["stream.close"] = proc {
         
     | 
| 
      
 67 
     | 
    
         
            +
                    e["stream.close"] = proc do
         
     | 
| 
       87 
68 
     | 
    
         
             
                      e.delete "stream.send"
         
     | 
| 
       88 
69 
     | 
    
         
             
                      e.delete "stream.close"
         
     | 
| 
       89 
     | 
    
         
            -
                      
         
     | 
| 
       90 
     | 
    
         
            -
             
     | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
                      request.succeed
         
     | 
| 
       93 
     | 
    
         
            -
                      
         
     | 
| 
       94 
     | 
    
         
            -
                      close_connection_after_writing if requests.empty?
         
     | 
| 
       95 
     | 
    
         
            -
                    }
         
     | 
| 
       96 
     | 
    
         
            -
                  }
         
     | 
| 
      
 70 
     | 
    
         
            +
                      close_response request
         
     | 
| 
      
 71 
     | 
    
         
            +
                    end
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end
         
     | 
| 
       97 
73 
     | 
    
         | 
| 
       98 
74 
     | 
    
         
             
                  Fiber.new { app.call env }.resume
         
     | 
| 
       99 
75 
     | 
    
         
             
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
                
         
     | 
| 
      
 77 
     | 
    
         
            +
                def start_response(response)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  builder.response_line response[0]
         
     | 
| 
      
 79 
     | 
    
         
            +
                  response[1]["Server"] = "hatetepe/#{VERSION}"
         
     | 
| 
      
 80 
     | 
    
         
            +
                  builder.headers response[1]
         
     | 
| 
      
 81 
     | 
    
         
            +
                end
         
     | 
| 
      
 82 
     | 
    
         
            +
                
         
     | 
| 
      
 83 
     | 
    
         
            +
                def close_response(request)
         
     | 
| 
      
 84 
     | 
    
         
            +
                  builder.complete
         
     | 
| 
      
 85 
     | 
    
         
            +
                  requests.delete request
         
     | 
| 
      
 86 
     | 
    
         
            +
                  close_connection_after_writing if requests.empty?
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
                  
         
     | 
| 
      
 89 
     | 
    
         
            +
                def inject_environment(env)
         
     | 
| 
      
 90 
     | 
    
         
            +
                  env["hatetepe.connection"] = self
         
     | 
| 
      
 91 
     | 
    
         
            +
                  env["rack.url_scheme"] = "http"
         
     | 
| 
      
 92 
     | 
    
         
            +
                  env["rack.input"].source = self
         
     | 
| 
      
 93 
     | 
    
         
            +
                  env["rack.errors"] = errors
         
     | 
| 
      
 94 
     | 
    
         
            +
                  
         
     | 
| 
      
 95 
     | 
    
         
            +
                  env["rack.multithread"] = false
         
     | 
| 
      
 96 
     | 
    
         
            +
                  env["rack.multiprocess"] = false
         
     | 
| 
      
 97 
     | 
    
         
            +
                  env["rack.run_once"] = false
         
     | 
| 
      
 98 
     | 
    
         
            +
                  
         
     | 
| 
      
 99 
     | 
    
         
            +
                  env["SERVER_NAME"] = config[:host].dup
         
     | 
| 
      
 100 
     | 
    
         
            +
                  env["SERVER_PORT"] = String(config[:port])
         
     | 
| 
      
 101 
     | 
    
         
            +
                  
         
     | 
| 
      
 102 
     | 
    
         
            +
                  host = env["HTTP_HOST"] || config[:host].dup
         
     | 
| 
      
 103 
     | 
    
         
            +
                  host += ":#{config[:port]}" unless host.include? ":"
         
     | 
| 
      
 104 
     | 
    
         
            +
                  env["HTTP_HOST"] = host
         
     | 
| 
      
 105 
     | 
    
         
            +
                end
         
     | 
| 
       100 
106 
     | 
    
         
             
              end
         
     | 
| 
       101 
107 
     | 
    
         
             
            end
         
     | 
    
        data/lib/hatetepe/version.rb
    CHANGED
    
    
    
        data/lib/hatetepe.rb
    CHANGED
    
    
    
        data/spec/unit/app_spec.rb
    CHANGED
    
    | 
         @@ -6,9 +6,9 @@ describe Hatetepe::App do 
     | 
|
| 
       6 
6 
     | 
    
         
             
              let(:app) { Hatetepe::App.new inner_app }
         
     | 
| 
       7 
7 
     | 
    
         
             
              let(:env) {
         
     | 
| 
       8 
8 
     | 
    
         
             
                {
         
     | 
| 
       9 
     | 
    
         
            -
                  "stream.start" =>  
     | 
| 
       10 
     | 
    
         
            -
                  "stream.send" =>  
     | 
| 
       11 
     | 
    
         
            -
                  "stream.close" =>  
     | 
| 
      
 9 
     | 
    
         
            +
                  "stream.start" => proc {},
         
     | 
| 
      
 10 
     | 
    
         
            +
                  "stream.send" => proc {},
         
     | 
| 
      
 11 
     | 
    
         
            +
                  "stream.close" => proc {}
         
     | 
| 
       12 
12 
     | 
    
         
             
                }
         
     | 
| 
       13 
13 
     | 
    
         
             
              }
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
         @@ -81,16 +81,22 @@ describe Hatetepe::App do 
     | 
|
| 
       81 
81 
     | 
    
         
             
                end
         
     | 
| 
       82 
82 
     | 
    
         | 
| 
       83 
83 
     | 
    
         
             
                it "streams the body" do
         
     | 
| 
       84 
     | 
    
         
            -
                   
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
      
 84 
     | 
    
         
            +
                  body.should_receive :each do |&blk|
         
     | 
| 
      
 85 
     | 
    
         
            +
                    blk.should equal(env["stream.send"])
         
     | 
| 
      
 86 
     | 
    
         
            +
                  end
         
     | 
| 
       86 
87 
     | 
    
         
             
                  app.postprocess env, [status, headers, body]
         
     | 
| 
       87 
88 
     | 
    
         
             
                end
         
     | 
| 
       88 
89 
     | 
    
         | 
| 
       89 
90 
     | 
    
         
             
                it "doesn't stream the body if it equals Rack::STREAMING" do
         
     | 
| 
       90 
     | 
    
         
            -
                   
     | 
| 
      
 91 
     | 
    
         
            +
                  body.should_not_receive :each
         
     | 
| 
       91 
92 
     | 
    
         
             
                  app.postprocess env, [status, headers, Rack::STREAMING]
         
     | 
| 
       92 
93 
     | 
    
         
             
                end
         
     | 
| 
       93 
94 
     | 
    
         | 
| 
      
 95 
     | 
    
         
            +
                it "doesn't try to stream a body that isn't set" do
         
     | 
| 
      
 96 
     | 
    
         
            +
                  body.should_not_receive :each
         
     | 
| 
      
 97 
     | 
    
         
            +
                  app.postprocess env, [status, headers]
         
     | 
| 
      
 98 
     | 
    
         
            +
                end
         
     | 
| 
      
 99 
     | 
    
         
            +
                
         
     | 
| 
       94 
100 
     | 
    
         
             
                it "closes the response stream after streaming the body" do
         
     | 
| 
       95 
101 
     | 
    
         
             
                  env["stream.close"].should_receive :call
         
     | 
| 
       96 
102 
     | 
    
         
             
                  app.postprocess env, [status, headers, body]
         
     | 
    
        data/spec/unit/client_spec.rb
    CHANGED
    
    | 
         @@ -162,7 +162,7 @@ describe Hatetepe::Client do 
     | 
|
| 
       162 
162 
     | 
    
         
             
                    }
         
     | 
| 
       163 
163 
     | 
    
         
             
                  }
         
     | 
| 
       164 
164 
     | 
    
         
             
                }
         
     | 
| 
       165 
     | 
    
         
            -
                let(:response) { stub "response" }
         
     | 
| 
      
 165 
     | 
    
         
            +
                let(:response) { stub "response", :body => Hatetepe::Body.new }
         
     | 
| 
       166 
166 
     | 
    
         | 
| 
       167 
167 
     | 
    
         
             
                before {
         
     | 
| 
       168 
168 
     | 
    
         
             
                  client.post_init
         
     | 
| 
         @@ -246,25 +246,8 @@ describe Hatetepe::Client do 
     | 
|
| 
       246 
246 
     | 
    
         | 
| 
       247 
247 
     | 
    
         
             
              context "#stop" do
         
     | 
| 
       248 
248 
     | 
    
         
             
                it "closes the connection" do
         
     | 
| 
       249 
     | 
    
         
            -
                  client.should_receive : 
     | 
| 
      
 249 
     | 
    
         
            +
                  client.should_receive :close_connection
         
     | 
| 
       250 
250 
     | 
    
         
             
                  client.stop
         
     | 
| 
       251 
251 
     | 
    
         
             
                end
         
     | 
| 
       252 
252 
     | 
    
         
             
              end
         
     | 
| 
       253 
     | 
    
         
            -
              
         
     | 
| 
       254 
     | 
    
         
            -
              context "#responses" do
         
     | 
| 
       255 
     | 
    
         
            -
                let(:requests) {
         
     | 
| 
       256 
     | 
    
         
            -
                  4.times.map {|i| stub "request##{i}", :response => responses[i] }
         
     | 
| 
       257 
     | 
    
         
            -
                }
         
     | 
| 
       258 
     | 
    
         
            -
                let(:responses) {
         
     | 
| 
       259 
     | 
    
         
            -
                  2.times.map {|i| stub "response##{i}" }
         
     | 
| 
       260 
     | 
    
         
            -
                }
         
     | 
| 
       261 
     | 
    
         
            -
                
         
     | 
| 
       262 
     | 
    
         
            -
                before {
         
     | 
| 
       263 
     | 
    
         
            -
                  client.stub :requests => requests
         
     | 
| 
       264 
     | 
    
         
            -
                }
         
     | 
| 
       265 
     | 
    
         
            -
                
         
     | 
| 
       266 
     | 
    
         
            -
                it "returns all requests' responses" do
         
     | 
| 
       267 
     | 
    
         
            -
                  client.responses.should == responses
         
     | 
| 
       268 
     | 
    
         
            -
                end
         
     | 
| 
       269 
     | 
    
         
            -
              end
         
     | 
| 
       270 
253 
     | 
    
         
             
            end
         
     | 
    
        data/spec/unit/server_spec.rb
    CHANGED
    
    | 
         @@ -40,16 +40,18 @@ describe Hatetepe::Server do 
     | 
|
| 
       40 
40 
     | 
    
         | 
| 
       41 
41 
     | 
    
         
             
              context "#initialize(config)" do
         
     | 
| 
       42 
42 
     | 
    
         
             
                let(:server) { Hatetepe::Server.allocate }
         
     | 
| 
       43 
     | 
    
         
            -
                let(:builder) { stub "app builder" }
         
     | 
| 
      
 43 
     | 
    
         
            +
                let(:builder) { stub "app builder", :to_app => to_app }
         
     | 
| 
      
 44 
     | 
    
         
            +
                let(:to_app) { stub "to_app" }
         
     | 
| 
       44 
45 
     | 
    
         | 
| 
       45 
46 
     | 
    
         
             
                it "builds the app" do
         
     | 
| 
       46 
47 
     | 
    
         
             
                  Rack::Builder.stub :new => builder
         
     | 
| 
      
 48 
     | 
    
         
            +
                  builder.should_receive(:use).with Hatetepe::Pipeline
         
     | 
| 
       47 
49 
     | 
    
         
             
                  builder.should_receive(:use).with Hatetepe::App
         
     | 
| 
       48 
50 
     | 
    
         
             
                  builder.should_receive(:use).with Hatetepe::Proxy
         
     | 
| 
       49 
51 
     | 
    
         
             
                  builder.should_receive(:run).with app
         
     | 
| 
       50 
52 
     | 
    
         | 
| 
       51 
53 
     | 
    
         
             
                  server.send :initialize, config
         
     | 
| 
       52 
     | 
    
         
            -
                  server.app.should equal( 
     | 
| 
      
 54 
     | 
    
         
            +
                  server.app.should equal(to_app)
         
     | 
| 
       53 
55 
     | 
    
         
             
                end
         
     | 
| 
       54 
56 
     | 
    
         | 
| 
       55 
57 
     | 
    
         
             
                it "sets up the error stream" do
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: hatetepe
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.3. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.3.1
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
         @@ -9,11 +9,11 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2011-11- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2011-11-05 00:00:00.000000000Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: http_parser.rb
         
     | 
| 
       16 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 16 
     | 
    
         
            +
              requirement: &83959440 !ruby/object:Gem::Requirement
         
     | 
| 
       17 
17 
     | 
    
         
             
                none: false
         
     | 
| 
       18 
18 
     | 
    
         
             
                requirements:
         
     | 
| 
       19 
19 
     | 
    
         
             
                - - ~>
         
     | 
| 
         @@ -21,10 +21,10 @@ dependencies: 
     | 
|
| 
       21 
21 
     | 
    
         
             
                    version: 0.5.3
         
     | 
| 
       22 
22 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       23 
23 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       24 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 24 
     | 
    
         
            +
              version_requirements: *83959440
         
     | 
| 
       25 
25 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       26 
26 
     | 
    
         
             
              name: eventmachine
         
     | 
| 
       27 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 27 
     | 
    
         
            +
              requirement: &83959120 !ruby/object:Gem::Requirement
         
     | 
| 
       28 
28 
     | 
    
         
             
                none: false
         
     | 
| 
       29 
29 
     | 
    
         
             
                requirements:
         
     | 
| 
       30 
30 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
         @@ -32,10 +32,10 @@ dependencies: 
     | 
|
| 
       32 
32 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       33 
33 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       34 
34 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       35 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 35 
     | 
    
         
            +
              version_requirements: *83959120
         
     | 
| 
       36 
36 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       37 
37 
     | 
    
         
             
              name: em-synchrony
         
     | 
| 
       38 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 38 
     | 
    
         
            +
              requirement: &83958600 !ruby/object:Gem::Requirement
         
     | 
| 
       39 
39 
     | 
    
         
             
                none: false
         
     | 
| 
       40 
40 
     | 
    
         
             
                requirements:
         
     | 
| 
       41 
41 
     | 
    
         
             
                - - ~>
         
     | 
| 
         @@ -43,10 +43,10 @@ dependencies: 
     | 
|
| 
       43 
43 
     | 
    
         
             
                    version: '1.0'
         
     | 
| 
       44 
44 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       45 
45 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       46 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 46 
     | 
    
         
            +
              version_requirements: *83958600
         
     | 
| 
       47 
47 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       48 
48 
     | 
    
         
             
              name: rack
         
     | 
| 
       49 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 49 
     | 
    
         
            +
              requirement: &83958210 !ruby/object:Gem::Requirement
         
     | 
| 
       50 
50 
     | 
    
         
             
                none: false
         
     | 
| 
       51 
51 
     | 
    
         
             
                requirements:
         
     | 
| 
       52 
52 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
         @@ -54,10 +54,10 @@ dependencies: 
     | 
|
| 
       54 
54 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       55 
55 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       56 
56 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       57 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 57 
     | 
    
         
            +
              version_requirements: *83958210
         
     | 
| 
       58 
58 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       59 
59 
     | 
    
         
             
              name: async-rack
         
     | 
| 
       60 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 60 
     | 
    
         
            +
              requirement: &83957590 !ruby/object:Gem::Requirement
         
     | 
| 
       61 
61 
     | 
    
         
             
                none: false
         
     | 
| 
       62 
62 
     | 
    
         
             
                requirements:
         
     | 
| 
       63 
63 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
         @@ -65,10 +65,10 @@ dependencies: 
     | 
|
| 
       65 
65 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       66 
66 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       67 
67 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       68 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 68 
     | 
    
         
            +
              version_requirements: *83957590
         
     | 
| 
       69 
69 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       70 
70 
     | 
    
         
             
              name: thor
         
     | 
| 
       71 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 71 
     | 
    
         
            +
              requirement: &83957070 !ruby/object:Gem::Requirement
         
     | 
| 
       72 
72 
     | 
    
         
             
                none: false
         
     | 
| 
       73 
73 
     | 
    
         
             
                requirements:
         
     | 
| 
       74 
74 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
         @@ -76,10 +76,10 @@ dependencies: 
     | 
|
| 
       76 
76 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       77 
77 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       78 
78 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       79 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 79 
     | 
    
         
            +
              version_requirements: *83957070
         
     | 
| 
       80 
80 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       81 
81 
     | 
    
         
             
              name: rspec
         
     | 
| 
       82 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 82 
     | 
    
         
            +
              requirement: &83956480 !ruby/object:Gem::Requirement
         
     | 
| 
       83 
83 
     | 
    
         
             
                none: false
         
     | 
| 
       84 
84 
     | 
    
         
             
                requirements:
         
     | 
| 
       85 
85 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
         @@ -87,10 +87,10 @@ dependencies: 
     | 
|
| 
       87 
87 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       88 
88 
     | 
    
         
             
              type: :development
         
     | 
| 
       89 
89 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       90 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 90 
     | 
    
         
            +
              version_requirements: *83956480
         
     | 
| 
       91 
91 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       92 
92 
     | 
    
         
             
              name: fakefs
         
     | 
| 
       93 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 93 
     | 
    
         
            +
              requirement: &83956060 !ruby/object:Gem::Requirement
         
     | 
| 
       94 
94 
     | 
    
         
             
                none: false
         
     | 
| 
       95 
95 
     | 
    
         
             
                requirements:
         
     | 
| 
       96 
96 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
         @@ -98,10 +98,10 @@ dependencies: 
     | 
|
| 
       98 
98 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       99 
99 
     | 
    
         
             
              type: :development
         
     | 
| 
       100 
100 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       101 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 101 
     | 
    
         
            +
              version_requirements: *83956060
         
     | 
| 
       102 
102 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       103 
103 
     | 
    
         
             
              name: em-http-request
         
     | 
| 
       104 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 104 
     | 
    
         
            +
              requirement: &83955480 !ruby/object:Gem::Requirement
         
     | 
| 
       105 
105 
     | 
    
         
             
                none: false
         
     | 
| 
       106 
106 
     | 
    
         
             
                requirements:
         
     | 
| 
       107 
107 
     | 
    
         
             
                - - ~>
         
     | 
| 
         @@ -109,7 +109,7 @@ dependencies: 
     | 
|
| 
       109 
109 
     | 
    
         
             
                    version: '1.0'
         
     | 
| 
       110 
110 
     | 
    
         
             
              type: :development
         
     | 
| 
       111 
111 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       112 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 112 
     | 
    
         
            +
              version_requirements: *83955480
         
     | 
| 
       113 
113 
     | 
    
         
             
            description: 
         
     | 
| 
       114 
114 
     | 
    
         
             
            email:
         
     | 
| 
       115 
115 
     | 
    
         
             
            - lars.gierth@gmail.com
         
     | 
| 
         @@ -136,6 +136,7 @@ files: 
     | 
|
| 
       136 
136 
     | 
    
         
             
            - lib/hatetepe/events.rb
         
     | 
| 
       137 
137 
     | 
    
         
             
            - lib/hatetepe/message.rb
         
     | 
| 
       138 
138 
     | 
    
         
             
            - lib/hatetepe/parser.rb
         
     | 
| 
      
 139 
     | 
    
         
            +
            - lib/hatetepe/pipeline.rb
         
     | 
| 
       139 
140 
     | 
    
         
             
            - lib/hatetepe/proxy.rb
         
     | 
| 
       140 
141 
     | 
    
         
             
            - lib/hatetepe/request.rb
         
     | 
| 
       141 
142 
     | 
    
         
             
            - lib/hatetepe/response.rb
         
     |