Class: Merb::Rack::Handler::Mongrel

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Mongrel

Parameters

app<Merb::Rack::Application>

The app that Mongrel should handle.



48
49
50
# File 'lib/merb-core/rack/handler/mongrel.rb', line 48

def initialize(app)
  @app = app
end

Class Method Details

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

Runs the server and yields it to a block.

Parameters

app<Merb::Rack::Application>

The app that Mongrel should handle.

options<Hash>

Options to pass to Mongrel (see below).

Block parameters

server<Mongrel::HttpServer>

The server to run.

Options (options)

:Host<String>

The hostname on which the app should run. Defaults to “0.0.0.0”

:Port<Fixnum>

The port for the app. Defaults to 8080.

Yields:

  • (@server)


34
35
36
37
38
39
40
# File 'lib/merb-core/rack/handler/mongrel.rb', line 34

def self.run(app, options={})
  @server = ::Mongrel::HttpServer.new(options[:Host] || '0.0.0.0',
                                     options[:Port] || 8080)
  @server.register('/', ::Merb::Rack::Handler::Mongrel.new(app))
  yield @server  if block_given?
  @server.run.join
end

.stop(block = true) ⇒ Object



42
43
44
# File 'lib/merb-core/rack/handler/mongrel.rb', line 42

def self.stop(block = true)
  @server.stop
end

Instance Method Details

#process(request, response) ⇒ Object

Parameters

request<Merb::Request>

The HTTP request to handle.

response<HTTPResponse>

The response object to write response to.



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

def process(request, response)
  env = {}.replace(request.params)
  env.delete Merb::Const::HTTP_CONTENT_TYPE
  env.delete Merb::Const::HTTP_CONTENT_LENGTH
  
  env[Merb::Const::SCRIPT_NAME] = Merb::Const::EMPTY_STRING if env[Merb::Const::SCRIPT_NAME] == Merb::Const::SLASH
  
  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[Merb::Const::QUERY_STRING] ||= ""
  env.delete Merb::Const::PATH_INFO  if env[Merb::Const::PATH_INFO] == Merb::Const::EMPTY_STRING
  
  status, headers, body = @app.call(env)
  
  begin
    response.status = status.to_i
    headers.each { |k, vs|
      vs.each { |v|
        response.header[k] = v
      }
    }
    
    body.each { |part|
      response.body << part
    }
    response.finished
  ensure
    body.close  if body.respond_to? :close
  end
end