Class: Pincerna::Server

Inherits:
Goliath::API
  • Object
show all
Defined in:
lib/pincerna/server.rb

Overview

Main HTTP server to handle requests.

Constant Summary

DELAY =

Delay before responding to a request.

0.05

Class Method Summary (collapse)

Instance Method Summary (collapse)

Class Method Details

+ (Object) enqueue_request

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

+ (Boolean) perform_request?

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

- (Array) handle_request(type, args)

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

- (Array) handle_stop

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

- (Array) response(env)

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