class MiddleSquid::Server
Manages the internal HTTP server.
Constants
- DEFAULT_HOST
- DEFAULT_PORT
- TOKEN_TIMEOUT
Attributes
host[R]
@return [String]
port[R]
@return [Fixnum]
Public Class Methods
new()
click to toggle source
# File lib/middle_squid/server.rb, line 18 def initialize @tokens = {} @thin = Thin::Server.new DEFAULT_HOST, DEFAULT_PORT, method(:handler), :backend => Backends::Thin, :signals => false end
Public Instance Methods
start()
click to toggle source
# File lib/middle_squid/server.rb, line 25 def start @thin.start sockname = EM.get_sockname @thin.backend.signature @port, @host = Socket.unpack_sockaddr_in sockname end
stop()
click to toggle source
# File lib/middle_squid/server.rb, line 32 def stop @thin.stop @port = @host = nil end
token_for(block)
click to toggle source
Creates a temporary token.
@param block [#call] called when the token is requested @return [String] random token
# File lib/middle_squid/server.rb, line 41 def token_for(block) token = SecureRandom.uuid @tokens[token] = block EM.add_timer(TOKEN_TIMEOUT) { @tokens.delete token } token end
Private Instance Methods
handler(env)
click to toggle source
# File lib/middle_squid/server.rb, line 53 def handler(env) callback = @tokens[env['PATH_INFO'][1..-1]] return [ 404, {'Content-Type' => 'text/plain'}, ['[MiddleSquid] Invalid Token'] ] unless callback request = Rack::Request.new env response = Thin::AsyncResponse.new env Fiber.new { retval = callback.call request, response if retval.is_a?(Array) && retval.size == 3 status, headers, body = retval headers.sanitize_headers! response.status = status response.headers.merge! headers response.write body end response.done }.resume response.finish end