Class: HttpVanilli::Responders::Rack

Inherits:
Object
  • Object
show all
Includes:
AbstractResponder
Defined in:
lib/http_vanilli/responders/rack.rb

Constant Summary collapse

BadStatus =
999

Instance Method Summary collapse

Methods included from AbstractResponder

#response_for_request

Methods included from NetHttp::YieldResponse

#nh_yield_response

Constructor Details

#initialize(app_class, *args, &block) ⇒ Rack

Returns a new instance of Rack.



6
7
8
9
10
# File 'lib/http_vanilli/responders/rack.rb', line 6

def initialize(app_class,*args,&block)
  @app_class = app_class
  @args = args
  @block = block
end

Instance Method Details

#appObject



54
55
56
57
# File 'lib/http_vanilli/responders/rack.rb', line 54

def app
  inner_app = lambda {|l| [BadStatus,{'Content-Type' => 'text/plain'},['']]}
  @app_class.new(inner_app,*@args,&@block)
end

#match?(request) ⇒ Boolean

Returns:

  • (Boolean)


13
14
15
16
# File 'lib/http_vanilli/responders/rack.rb', line 13

def match?(request)
  rsp = rack_response(request)
  Array === rsp && rsp.first != BadStatus
end

#rack_response(request) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/http_vanilli/responders/rack.rb', line 18

def rack_response(request)
  uri = request.uri

  env = {
    'REQUEST_METHOD' => request.original_request.method,
    
    # this'll to for now
    'SCRIPT_NAME'    => "",
    'PATH_INFO'      => uri.path,

    'QUERY_STRING'   => uri.query,
    'SERVER_NAME'    => uri.host,
    'SERVER_PORT'    => uri.port
  }

  request.original_request.each_header {|k,v|
    env["HTTP_#{k.upcase}"] = v
  }

  rack_input = StringIO.new((request.body || '').to_s)
  rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding)

  env.update({"rack.version" => [1,1],
               "rack.input"  => rack_input,
               "rack.errors" => $stderr,

               "rack.multithread"  => true,
               "rack.multiprocess" => false,
               "rack.run_once"     => false,

               "rack.url_scheme" => request.uri.scheme
             })

  app.call(env)
end