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

- (Mongrel) initialize(app)

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

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

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

+ (Object) stop(block = true)

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

- (Object) process(request, response)



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