Class: Reel::Rack::Server

Inherits:
Server
  • Object
show all
Includes:
Celluloid::Logger
Defined in:
lib/reel/rack/server.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, options) ⇒ Server

Returns a new instance of Server.

Raises:

  • (ArgumentError)


14
15
16
17
18
19
20
21
22
23
# File 'lib/reel/rack/server.rb', line 14

def initialize(app, options)
  raise ArgumentError, "no host given" unless options[:host]
  raise ArgumentError, "no port given" unless options[:port]

  info  "A Reel good HTTP server! (Codename \"#{::Reel::CODENAME}\")"
  info "Listening on http://#{options[:host]}:#{options[:port]}"

  super(options[:host], options[:port], &method(:on_connection))
  @app = app
end

Instance Attribute Details

#appObject (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)
  options = {
    :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, options)

  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