Class: Rack::Handler::Mongrel

Inherits:
Mongrel::HttpHandler
  • Object
show all
Defined in:
lib/rack/handler/mongrel.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Mongrel

Returns a new instance of Mongrel.



50
51
52
# File 'lib/rack/handler/mongrel.rb', line 50

def initialize(app)
  @app = app
end

Class Method Details

.run(app, options = {}) {|server| ... } ⇒ Object

Yields:

  • (server)


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
# File 'lib/rack/handler/mongrel.rb', line 22

def self.run(app, options={})
  server = ::Mongrel::HttpServer.new(options[:Host] || '0.0.0.0',
                                     options[:Port] || 8080)
  # Acts like Rack::URLMap, utilizing Mongrel's own path finding methods.
  # Use is similar to #run, replacing the app argument with a hash of 
  # { path=>app, ... } or an instance of Rack::URLMap.
  if options[:map]
    if app.is_a? Hash
      app.each do |path, appl|
        path = '/'+path unless path[0] == ?/
        server.register(path, Rack::Handler::Mongrel.new(appl))
      end
    elsif app.is_a? URLMap
      app.instance_variable_get(:@mapping).each do |(host, path, appl)|
       next if !host.nil? && !options[:Host].nil? && options[:Host] != host
       path = '/'+path unless path[0] == ?/
       server.register(path, Rack::Handler::Mongrel.new(appl))
      end
    else
      raise ArgumentError, "first argument should be a Hash or URLMap"
    end
  else
    server.register('/', Rack::Handler::Mongrel.new(app))
  end
  yield server  if block_given?
  server.run.join
end

Instance Method Details

#process(request, response) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/rack/handler/mongrel.rb', line 54

def process(request, response)
  env = {}.replace(request.params)
  env.delete "HTTP_CONTENT_TYPE"
  env.delete "HTTP_CONTENT_LENGTH"

  env["SCRIPT_NAME"] = ""  if env["SCRIPT_NAME"] == "/"

  env.update({"rack.version" => [0,1],
               "rack.input" => request.body || StringIO.new(""),
               "rack.errors" => STDERR,

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

               "rack.url_scheme" => "http",
             })
  env["QUERY_STRING"] ||= ""
  env.delete "PATH_INFO"  if env["PATH_INFO"] == ""

  status, headers, body = @app.call(env)

  begin
    response.status = status.to_i
    headers.each { |k, vs|
      vs.each { |v|
        response.header[k] = v
      }
    }
    if body.respond_to? :each
      body.each { |part|
        response.body << part
      }
    else
      body.call(response)
    end
    response.finished
  ensure
    body.close  if body.respond_to? :close
  end
end