Class: Reel::Rack::Server
- Inherits:
-
Server
- Object
- Server
- Reel::Rack::Server
- Includes:
- Celluloid::Logger
- Defined in:
- lib/reel/rack/server.rb
Instance Attribute Summary collapse
-
#app ⇒ Object
readonly
Returns the value of attribute app.
Instance Method Summary collapse
- #convert_headers(headers) ⇒ Object
-
#initialize(app, options) ⇒ Server
constructor
A new instance of Server.
- #on_connection(connection) ⇒ Object
- #route_request(request) ⇒ Object
- #status_symbol(status) ⇒ Object
Constructor Details
#initialize(app, options) ⇒ Server
Returns a new instance of Server.
14 15 16 17 18 19 20 21 22 23 |
# File 'lib/reel/rack/server.rb', line 14 def initialize(app, ) raise ArgumentError, "no host given" unless [:host] raise ArgumentError, "no port given" unless [:port] info "A Reel good HTTP server! (Codename \"#{::Reel::CODENAME}\")" info "Listening on http://#{[:host]}:#{[:port]}" super([:host], [:port], &method(:on_connection)) @app = app end |
Instance Attribute Details
#app ⇒ Object (readonly)
Returns the value of attribute app.
12 13 14 |
# File 'lib/reel/rack/server.rb', line 12 def app @app end |
Instance Method Details
#convert_headers(headers) ⇒ Object
58 59 60 |
# File 'lib/reel/rack/server.rb', line 58 def convert_headers(headers) Hash[headers.map { |key, value| ['HTTP_' + key.upcase.gsub('-','_'),value ] }] end |
#on_connection(connection) ⇒ Object
25 26 27 28 29 30 31 32 33 |
# File 'lib/reel/rack/server.rb', line 25 def on_connection(connection) connection.each_request do |request| if request.websocket? request.respond :bad_request, "WebSockets not supported" else route_request request end end end |
#route_request(request) ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/reel/rack/server.rb', line 35 def route_request(request) = { :method => request.method, :input => request.body.to_s, "REMOTE_ADDR" => request.remote_addr }.merge(convert_headers(request.headers)) status, headers, body = app.call ::Rack::MockRequest.env_for(request.url, ) if body.respond_to?(:to_str) request.respond status_symbol(status), headers, body.to_str elsif body.respond_to?(:each) request.respond status_symbol(status), headers.merge(:transfer_encoding => :chunked) body.each { |chunk| request << chunk } request.finish_response else Logger.error("don't know how to render: #{body.inspect}") request.respond :internal_server_error, "An error occurred processing your request" end body.close if body.respond_to? :close end |
#status_symbol(status) ⇒ Object
62 63 64 65 66 67 68 |
# File 'lib/reel/rack/server.rb', line 62 def status_symbol(status) if status.is_a?(Fixnum) Http::Response::STATUS_CODES[status].downcase.gsub(/\s|-/, '_').to_sym else status.to_sym end end |