class Jebanni::RequestHandler

Attributes

request[R]
server[R]

Public Class Methods

new(request, server) click to toggle source
# File lib/jebanni/request_handler.rb, line 21
def initialize(request, server)
  @request = request
  @server = server
end
register_route(verb, path, options = {}, &process) click to toggle source
# File lib/jebanni/request_handler.rb, line 11
def self.register_route(verb, path, options = {}, &process)
  verb.downcase!
  @routes ||= {}
  @routes[verb] ||= []
  @routes[verb] << {
    matcher: Mustermann.new(path, options),
    process: process
  }
end

Public Instance Methods

find_route() click to toggle source
# File lib/jebanni/request_handler.rb, line 30
def find_route
  known = self.class.instance_variable_get(:@routes)
  found = known[request.method.downcase].find do |route|
    route[:matcher] === request.path
  end
  raise "not found" unless found
  found
end
indiferrent_keys(hash) click to toggle source
# File lib/jebanni/request_handler.rb, line 75
def indiferrent_keys(hash)
  # Either accessible params[:foo] or params["foo"]
  def hash.[](key)
    super(key.to_s) || begin
      # NOTE: Guard from DoS attack using Symbol:
      #       http://sequel.jeremyevans.net/2011/07/16/dangerous-reflection.html
      super(key.to_sym) if self.keys.map(&:to_s).include?(key.to_s)
    end
  end
  hash
end
params() click to toggle source
# File lib/jebanni/request_handler.rb, line 70
def params
  # NOTE: route params is prior than query params for don't accidentally override params with query
  indiferrent_keys request_params.merge(route_params)
end
processor() click to toggle source
# File lib/jebanni/request_handler.rb, line 39
def processor
  @processor ||=
    begin
      # Processor define class method internally, so avoid race condition for Class.new(Processor)
      processor = Class.new(Processor).new(self)
      processor.route = find_route
      processor.params = params
      processor
    end
end
request_params() click to toggle source
# File lib/jebanni/request_handler.rb, line 50
def request_params
  query = parse_nested_query(request.query_string)
  return query if %w(get head options).include?(request.method.downcase)

  content_type = request.headers.find do |(key, _)|
    key.downcase == "content-type"
  end
  if content_type && content_type.last.downcase == "application/json"
    json_params = JSON.parse(request.body.to_s) rescue {}
    query.merge! json_params
  else
    query.merge! parse_nested_query(request.body.to_s)
  end
  query
end
route!() click to toggle source
# File lib/jebanni/request_handler.rb, line 26
def route!
  processor.response
end
route_params() click to toggle source
# File lib/jebanni/request_handler.rb, line 66
def route_params
  find_route[:matcher].params(request.path)
end