diff --git a/hanami-router.gemspec b/hanami-router.gemspec index 8b24aeb..619d76b 100644 --- a/hanami-router.gemspec +++ b/hanami-router.gemspec @@ -19,8 +19,8 @@ Gem::Specification.new do |spec| spec.require_paths = ['lib'] spec.required_ruby_version = '>= 2.3.0' - spec.add_dependency 'rack', '~> 1.6' - spec.add_dependency 'http_router', '~> 0.11' + spec.add_dependency 'rack', '~> 2.0' + spec.add_dependency 'http_router', '0.11.2' spec.add_dependency 'hanami-utils', '~> 1.0.0.beta1' spec.add_development_dependency 'bundler', '~> 1.5' diff --git a/lib/hanami/routing/http_router.rb b/lib/hanami/routing/http_router.rb index 180f091..01c9f64 100644 --- a/lib/hanami/routing/http_router.rb +++ b/lib/hanami/routing/http_router.rb @@ -6,6 +6,7 @@ require 'hanami/routing/force_ssl' require 'hanami/routing/error' require 'hanami/utils/path_prefix' +require 'hanami/routing/http_router_monkey_patch' module Hanami module Routing diff --git a/lib/hanami/routing/http_router_monkey_patch.rb b/lib/hanami/routing/http_router_monkey_patch.rb new file mode 100644 index 0000000..35097bb --- /dev/null +++ b/lib/hanami/routing/http_router_monkey_patch.rb @@ -0,0 +1,35 @@ +# coding: utf-8 +# +# This monkey patches http_router to make it Rack 2.0 compatible. +# Details see: https://github.com/hanami/router/issues/136 +# +class HttpRouter + class Node + class Path < Node + def to_code + path_ivar = inject_root_ivar(self) + "#{"if !callback && request.path.size == 1 && request.path.first == '' && (request.rack_request.head? || request.rack_request.get?) && request.rack_request.path_info[-1] == ?/ + response = ::Rack::Response.new + response.redirect(request.rack_request.path_info[0, request.rack_request.path_info.size - 1], 302) + return response.finish + end" if router.redirect_trailing_slash?} + + #{"if request.#{router.ignore_trailing_slash? ? 'path_finished?' : 'path.empty?'}" unless route.match_partially} + if callback + request.called = true + callback.call(Response.new(request, #{path_ivar})) + else + env = request.rack_request.env + env['router.request'] = request + env['router.params'] ||= {} + #{"env['router.params'].merge!(Hash[#{param_names.inspect}.zip(request.params)])" if dynamic?} + @router.rewrite#{"_partial" if route.match_partially}_path_info(env, request) + response = @router.process_destination_path(#{path_ivar}, env) + return response unless router.pass_on_response(response) + end + #{"end" unless route.match_partially}" + end + + end + end +end