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

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Mongrel

Returns a new instance of Mongrel



48
49
50
# File 'merb-core/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.

Options Hash (options):

  • :Host (String)

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

  • :Post (Fixnum)

    The port for the app. Defaults to 8080.

Yield Parameters:

  • server (Mongrel::HttpServer)

    The server to run.



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

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

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



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

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

Instance Method Details

#process(request, response) ⇒ Object



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
95
96
97
98
# File 'merb-core/lib/merb-core/rack/handler/mongrel.rb', line 57

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
    response.send_status(nil)

    headers.each { |k, vs|
      vs.split(Merb::Const::NEWLINE).each { |v|
        response.header[k] = v
      }
    }
    response.send_header

    body.each { |part|
      response.write(part)
      response.socket.flush
    }
    response.done = true
  ensure
    body.close  if body.respond_to? :close
  end
end