lib/plezi/router/route.rb in plezi-0.14.4 vs lib/plezi/router/route.rb in plezi-0.14.5

- old
+ new

@@ -1,113 +1,111 @@ require 'plezi/controller/controller' -require 'thread' -require 'rack' -require 'rack/query_parser.rb' module Plezi - module Base - class Route - attr_reader :prefix, :controller, :param_names + module Base + class Route + attr_reader :prefix, :controller, :param_names - def initialize(path, controller) - @route_id = "Route#{object_id.to_s(16)}".to_sym - m = path.match(/([^\:\(\*]*)(.*)/) - @prefix = m[1].chomp('/'.freeze) - if @prefix.nil? || @prefix == ''.freeze - @prefix = '/'.freeze - @prefix_length = 1 - else - @prefix = "/#{@prefix}" if @prefix[0] != '/'.freeze - @prefix_length = @prefix.length + 1 - end - @controller = controller - @param_names = [] - @origial = path.dup.freeze - prep_params(m[2]) - self.class.qp - case @controller - when Class - prep_controller - when Regexp - raise "Rewrite Routes can't contain more then one parameter to collect" if @param_names.length > 1 - else - raise 'Controller should be a class object' unless controller.is_a?(Class) - end - end + def initialize(path, controller) + @route_id = "Route#{object_id.to_s(16)}".to_sym + @params_range = (0..0) + m = path.match(/([^\:\(\*]*)(.*)/) + @prefix = m[1].chomp('/'.freeze) + if @prefix.nil? || @prefix == ''.freeze + @prefix = '/'.freeze + @prefix_length = 1 + else + @prefix = "/#{@prefix}" if @prefix[0] != '/'.freeze + @prefix_length = @prefix.length + 1 + end + @controller = controller + @param_names = [] + @origial = path.dup.freeze + prep_params(m[2]) + self.class.qp + case @controller + when Class + prep_controller + when Regexp + raise "Rewrite Routes can't contain more then one parameter to collect" if @param_names.length > 1 + else + raise 'Controller should be a class object' unless controller.is_a?(Class) + end + end - def call(request, response) - return nil unless match(request.path_info, request) - c = @controller.new - c._pl_respond(request, response, Thread.current[@route_id]) - end + def call(request, response) + return nil unless match(request.path_info, request) + c = @controller.new + c._pl_respond(request, response, Thread.current[@route_id]) + end - def fits_params(path, request) - params = (Thread.current[@route_id] ||= {}).clear - params.update request.params.to_h if request && request.params - # puts "cutting: #{path[(@prefix_length)..-1] ? path[(@prefix_length + 1)..-1] : 'nil'}" - pa = (path[@prefix_length..-1] || ''.freeze).split('/'.freeze) - # puts "check param count: #{pa}" - return false unless @params_range.include?(pa.length) - @param_names.each do |key| - next if pa[0].nil? - self.class.qp.normalize_params(params, Plezi.try_utf8!(Rack::Utils.unescape(key)), - Plezi.try_utf8!(Rack::Utils.unescape(pa.shift)), 100) - end - params['*'.freeze] = pa unless pa.empty? - true - end + def fits_params(path, request) + params = (Thread.current[@route_id] ||= {}).clear + params.update request.params.to_h if request && request.params + # puts "cutting: #{path[(@prefix_length)..-1] ? path[(@prefix_length + 1)..-1] : 'nil'}" + pa = (path[@prefix_length..-1] || ''.freeze).split('/'.freeze) + # puts "check param count: #{pa}" + return false unless @params_range.include?(pa.length) + @param_names.each do |key| + next if pa[0].nil? + self.class.qp.normalize_params(params, Plezi.try_utf8!(Rack::Utils.unescape(key)), + Plezi.try_utf8!(Rack::Utils.unescape(pa.shift)), 100) + end + params['*'.freeze] = pa unless pa.empty? + true + end - def match(req_path, request = nil) - # puts "#{req_path} starts with #{@prefix}? #{req_path.start_with?(@prefix)}" - req_path.start_with?(@prefix) && fits_params(req_path, request) - end + def match(req_path, request = nil) + # puts "#{req_path} starts with #{@prefix}? #{req_path.start_with?(@prefix)}" + req_path.start_with?(@prefix) && fits_params(req_path, request) + end - def prep_params(postfix) - pfa = postfix.split '/'.freeze - start = 0; stop = 0 - optional = false - while pfa.any? - name = pfa.shift - raise "#{name} is not a valid path section in #{@origial}" if /^((\:[\w\.\[\]]+)|(\(\:[\w\.\[\]]+\))|(\*))$/.match(name).nil? - if name[0] == ':' - raise "Cannot have a required parameter after an optional parameter in #{@origial}" if optional - @param_names << name[1..-1].freeze - elsif name[0] == '(' - optional = true - @param_names << name[2..-2].freeze - elsif name[0] == '*' - stop += 999_999 - break - else - raise "invalid path section #{name} in #{@origial}" - end - optional ? (stop += 1) : (start += 1) - end - unless (@param_names.include? 'id'.freeze) || stop >= 999_999 - @param_names << 'id'.freeze - stop += 1 - end - @params_range = (start..(start + stop)) - @param_names.freeze - @params_range.freeze - end + def prep_params(postfix) + pfa = postfix.split '/'.freeze + start = 0; stop = 0 + optional = false + while pfa.any? + name = pfa.shift + raise "#{name} is not a valid path section in #{@origial}" unless /^((\:[\w\.\[\]]+)|(\(\:[\w\.\[\]]+\))|(\*))$/.match(name) + if name[0] == ':' + raise "Cannot have a required parameter after an optional parameter in #{@origial}" if optional + @param_names << name[1..-1].freeze + elsif name[0] == '(' + optional = true + @param_names << name[2..-2].freeze + elsif name[0] == '*' + stop += 999_999 + break + else + raise "invalid path section #{name} in #{@origial}" + end + optional ? (stop += 1) : (start += 1) + end + unless (@param_names.include? 'id'.freeze) || stop >= 999_999 + @param_names << 'id'.freeze + stop += 1 + end + @params_range = (start..(start + stop)) + @param_names.freeze + @params_range.freeze + end - def prep_controller - @controller.include Plezi::Controller - end + def prep_controller + @controller.include Plezi::Controller + end - def self.qp - @qp ||= ::Rack::QueryParser.new(Hash, 65_536, 100) + def self.qp + @qp ||= ::Rack::QueryParser.new(Hash, 65_536, 100) + end end - end - class RouteRewrite < Route - def call(request, _response) - return nil unless match(request.path_info, request) - params = Thread.current[@route_id] - return nil unless controller =~ params[@param_names[0]] - request.path_info = "/#{params.delete('*'.freeze).to_a.join '/'}" - request.params.update params - nil + class RouteRewrite < Route + def call(request, _response) + return nil unless match(request.path_info, request) + params = Thread.current[@route_id] + return nil unless controller =~ params[@param_names[0]] + request.path_info = "/#{params.delete('*'.freeze).to_a.join '/'}" + request.params.update params + nil + end end - end - end + end end