Class: Pincerna::Server

Inherits:
Goliath::API
  • Object
show all
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

Instance Method Summary collapse

Class Method Details

.enqueue_requestObject

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.

Returns:

  • (Boolean)

    true if the request was the last arrived and therefore must be performed, false otherwise.



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.

Parameters:

  • type (String)

    The type of request.

  • args (Hash)

    The parameters of the request.

Returns:

  • (Array)

    A response complaint to Rack interface.



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_stopArray

Schedule the server's stop.

Returns:

  • (Array)

    A response complaint to Rack interface.



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.

Parameters:

  • env (Goliath::Env)

    The environment of the request.

Returns:

  • (Array)

    A response complaint to Rack interface.



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.message, "Content-Type" => "text/plain"}, e.backtrace.join("\n")]
  end
end