Class: Pincerna::Server
- Inherits:
-
Goliath::API
- Object
- Goliath::API
- Pincerna::Server
- Defined in:
- lib/pincerna/server.rb
Overview
Main HTTP server to handle requests.
Constant Summary collapse
- DELAY =
Delay before responding to a request.
0.05
Class Method Summary collapse
-
.enqueue_request ⇒ Object
Enqueues a request.
-
.perform_request? ⇒ Boolean
Enqueues a request.
Instance Method Summary collapse
-
#handle_request(type, args) ⇒ Array
Handles a valid request.
-
#handle_stop ⇒ Array
Schedule the server's stop.
-
#response(env) ⇒ Array
Send a response to a request.
Class Method Details
.enqueue_request ⇒ Object
Enqueues a request.
19 20 21 22 23 |
# File 'lib/pincerna/server.rb', line 19 def self.enqueue_request @requests ||= Queue.new @requests << Time.now.to_f EM::Synchrony.sleep(DELAY) end |
.perform_request? ⇒ Boolean
Enqueues a request.
28 29 30 31 |
# File 'lib/pincerna/server.rb', line 28 def self.perform_request? @requests.pop @requests.empty? end |
Instance Method Details
#handle_request(type, args) ⇒ Array
Handles a valid request.
38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/pincerna/server.rb', line 38 def handle_request(type, args) # Enqueue the request. This will wait to avoid too many requests. Server.enqueue_request # Execute the request, if none were added. response = Server.perform_request? ? Pincerna::Base.execute!(type, (args["q"] || "").strip, args["format"], args["debug"]) : false if response then [200, {"Content-Type" => response.format_content_type}, response.output] else [response.nil? ? 404 : 429, {"Content-Type" => "text/plain"}, ""] end end |
#handle_stop ⇒ Array
Schedule the server's stop.
54 55 56 57 |
# File 'lib/pincerna/server.rb', line 54 def handle_stop EM.add_timer(0.1) { stop_server } [200, {}, ""] end |
#response(env) ⇒ Array
Send a response to a request.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/pincerna/server.rb', line 63 def response(env) begin type = env["REQUEST_PATH"].gsub(/\//, "") case type when "quit" then handle_stop when "install" then handle_install when "uninstall" then handle_uninstall else handle_request(type, params) end rescue => e [500, {"X-Error" => e.class.to_s, "X-Error-Message" => e., "Content-Type" => "text/plain"}, e.backtrace.join("\n")] end end |