Class: Webmachine::Adapters::Rack3

Inherits:
Adapter
  • Object
show all
Defined in:
lib/webmachine/adapters/rack3_adapter.rb

Direct Known Subclasses

Rack3Mapped

Defined Under Namespace

Classes: RackRequest, RequestBody

Constant Summary collapse

DEFAULT_OPTIONS =

Used to override default Rack server options (useful in testing)

{}
REQUEST_URI =
"REQUEST_URI".freeze
RACK_VERSION =
::Rack::RELEASE.match(/^(\d+\.\d+)/)[1]
VERSION_STRING =
"#{Webmachine::SERVER_STRING} Rack/#{RACK_VERSION}".freeze
NEWLINE =
"\n".freeze

Instance Method Summary collapse

Instance Method Details

#call(env) ⇒ Object

Handles a Rack-based request.

Parameters:

  • env (Hash)

    the Rack environment



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/webmachine/adapters/rack3_adapter.rb', line 37

def call(env)
  headers = Webmachine::Headers.from_cgi(env)

  rack_req = ::Rack::Request.new env
  request = build_webmachine_request(rack_req, headers)

  response = Webmachine::Response.new
  application.dispatcher.dispatch(request, response)

  response.headers[SERVER] = VERSION_STRING

  rack_body =
  case response.body
    when String # Strings are enumerable in ruby 1.8
      [response.body]
    else
      if (io_body = IO.try_convert(response.body))
        io_body
      elsif response.body.respond_to?(:call)
        response.body
      elsif response.body.respond_to?(:each)
        response.body
      else
        [response.body.to_s]
      end
  end

  rack_res = ::Rack::Response.new(rack_body, response.code, response.headers)
  rack_res.finish
end

#runObject

Start the Rack adapter



24
25
26
27
28
29
30
31
32
33
# File 'lib/webmachine/adapters/rack3_adapter.rb', line 24

def run
  options = DEFAULT_OPTIONS.merge({
                                    app: self,
                                    Port: application.configuration.port,
                                    Host: application.configuration.ip
                                  }).merge(application.configuration.adapter_options)

  @server = ::Rack::Server.new(options)
  @server.start
end