From 9bd24caf7e20bc7c1274daa6d94f29074fe25588 Mon Sep 17 00:00:00 2001 From: Chao Yang Date: Wed, 29 Jun 2022 05:25:40 -0500 Subject: [PATCH] Closes response by default in HTTP::Server::Context#redirect (#641) --- spec/route_handler_spec.cr | 36 ++++++++++++++++++++++++++++++++++++ src/kemal/ext/context.cr | 3 ++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/spec/route_handler_spec.cr b/spec/route_handler_spec.cr index 93cf0f0..81d447f 100644 --- a/spec/route_handler_spec.cr +++ b/spec/route_handler_spec.cr @@ -143,4 +143,40 @@ describe "Kemal::RouteHandler" do client_response.body.should eq("Redirecting to /login") client_response.headers.has_key?("Location").should eq(true) end + + it "redirects and closes response in before filter" do + filter_handler = Kemal::FilterHandler.new + filter_handler._add_route_filter("GET", "/", :before) do |env| + env.redirect "/login" + end + Kemal.config.add_filter_handler(filter_handler) + + get "/" do |env| + "home page" + end + + request = HTTP::Request.new("GET", "/") + client_response = call_request_on_app(request) + client_response.status_code.should eq(302) + client_response.body.should eq("") + client_response.headers.has_key?("Location").should eq(true) + end + + it "redirects in before filter without closing response" do + filter_handler = Kemal::FilterHandler.new + filter_handler._add_route_filter("GET", "/", :before) do |env| + env.redirect "/login", close: false + end + Kemal.config.add_filter_handler(filter_handler) + + get "/" do |env| + "home page" + end + + request = HTTP::Request.new("GET", "/") + client_response = call_request_on_app(request) + client_response.status_code.should eq(302) + client_response.body.should eq("home page") + client_response.headers.has_key?("Location").should eq(true) + end end diff --git a/src/kemal/ext/context.cr b/src/kemal/ext/context.cr index c2e51c6..70787b6 100644 --- a/src/kemal/ext/context.cr +++ b/src/kemal/ext/context.cr @@ -17,10 +17,11 @@ class HTTP::Server @params ||= Kemal::ParamParser.new(@request, route_lookup.params) end - def redirect(url : String, status_code : Int32 = 302, *, body : String? = nil) + def redirect(url : String, status_code : Int32 = 302, *, body : String? = nil, close : Bool = true) @response.headers.add "Location", url @response.status_code = status_code @response.print(body) if body + @response.close if close end def route