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