Parent

Class/Module Index [+]

Quicksearch

Merb::Rack::Handler::Mongrel

Public Class Methods

new(app) click to toggle source

Parameters

app<Merb::Rack::Application>

The app that Mongrel should handle.

:api: plugin

# File lib/merb-core/rack/handler/mongrel.rb, line 53
def initialize(app)
  @app = app
end
run(app, options={}) click to toggle source

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.

:api: plugin

# File lib/merb-core/rack/handler/mongrel.rb, line 36
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) click to toggle source

:api: private

# File lib/merb-core/rack/handler/mongrel.rb, line 45
def self.stop(block = true)
  @server.stop
end

Public Instance Methods

process(request, response) click to toggle source

Parameters

request<Merb::Request>

The HTTP request to handle.

response<HTTPResponse>

The response object to write response to.

:api: plugin

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

[Validate]

Generated with the Darkfish Rdoc Generator 2.