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