Class: Webmachine::Adapters::Reel
- Inherits:
-
Webmachine::Adapter
- Object
- Webmachine::Adapter
- Webmachine::Adapters::Reel
- Defined in:
- lib/webmachine/adapters/reel.rb
Constant Summary collapse
- DEFAULT_OPTIONS =
Used to override default Reel server options (useful in testing)
{}
Instance Attribute Summary
Attributes inherited from Webmachine::Adapter
Instance Method Summary collapse
- #fixup_callable_encoder(response) ⇒ Object
- #fixup_headers(response) ⇒ Object
- #process(connection) ⇒ Object
- #request_uri(path, headers, extra_query_params = nil) ⇒ Object
- #run ⇒ Object
Methods inherited from Webmachine::Adapter
Constructor Details
This class inherits a constructor from Webmachine::Adapter
Instance Method Details
#fixup_callable_encoder(response) ⇒ Object
106 107 108 109 110 |
# File 'lib/webmachine/adapters/reel.rb', line 106 def fixup_callable_encoder(response) if response.body.is_a?(Streaming::CallableEncoder) response.body = [response.body.call] end end |
#fixup_headers(response) ⇒ Object
98 99 100 101 102 103 104 |
# File 'lib/webmachine/adapters/reel.rb', line 98 def fixup_headers(response) response.headers.each do |key, value| if value.is_a?(Array) response.headers[key] = value.join(", ") end end end |
#process(connection) ⇒ Object
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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/webmachine/adapters/reel.rb', line 40 def process(connection) connection.each_request do |request| # Users of the adapter can configure a custom WebSocket handler if request.websocket? if handler = [:websocket_handler] handler.call(request.websocket) else # Pretend we don't know anything about the WebSocket protocol # FIXME: This isn't strictly what RFC 6455 would have us do request.respond :bad_request, "WebSockets not supported" end next end # Optional support for e.g. WebDAV verbs not included in Webmachine's # state machine. Do the "Railsy" thing and handle them like POSTs # with a magical parameter if @extra_verbs.include?(request.method) method = POST_METHOD param = "_method=#{request.method}" uri = request_uri(request.url, request.headers, param) else method = request.method uri = request_uri(request.url, request.headers) end wm_headers = Webmachine::Headers[request.headers.dup] wm_request = Webmachine::Request.new(method, uri, wm_headers, request.body) wm_response = Webmachine::Response.new application.dispatcher.dispatch(wm_request, wm_response) fixup_headers(wm_response) fixup_callable_encoder(wm_response) request.respond ::Reel::Response.new(wm_response.code, wm_response.headers, wm_response.body) end end |
#request_uri(path, headers, extra_query_params = nil) ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/webmachine/adapters/reel.rb', line 82 def request_uri(path, headers, extra_query_params = nil) path_parts = path.split('?') uri_hash = {path: path_parts.first} uri_hash[:query] = path_parts.last if path_parts.length == 2 if extra_query_params if uri_hash[:query] uri_hash[:query] << "&#{extra_query_params}" else uri_hash[:query] = extra_query_params end end URI::HTTP.build(uri_hash) end |
#run ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/webmachine/adapters/reel.rb', line 16 def run = DEFAULT_OPTIONS.merge({ :port => application.configuration.port, :host => application.configuration.ip }).merge(application.configuration.) if extra_verbs = application.configuration.[:extra_verbs] @extra_verbs = Set.new(extra_verbs.map(&:to_s).map(&:upcase)) else @extra_verbs = Set.new end if [:ssl] unless [:ssl][:cert] && [:ssl][:key] raise ArgumentError, 'Certificate or Private key missing for HTTPS Server' end @server = ::Reel::Server::HTTPS.supervise([:host], [:port], [:ssl], &method(:process)) else @server = ::Reel::Server::HTTP.supervise([:host], [:port], &method(:process)) end Celluloid::Actor.join(@server) end |