mirror of
https://gitea.invidious.io/iv-org/shard-kemal.git
synced 2024-08-15 00:53:36 +00:00
Improve param parsing and remove url_params from HTTP::Request
This commit is contained in:
parent
ad5dc053c4
commit
d2ef57a128
8 changed files with 41 additions and 55 deletions
|
@ -13,8 +13,8 @@ describe "Kemal::FilterHandler" do
|
||||||
|
|
||||||
test_filter.modified.should eq("false")
|
test_filter.modified.should eq("false")
|
||||||
request = HTTP::Request.new("GET", "/greetings")
|
request = HTTP::Request.new("GET", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("true")
|
client_response.body.should eq("true")
|
||||||
end
|
end
|
||||||
|
@ -33,14 +33,14 @@ describe "Kemal::FilterHandler" do
|
||||||
test_filter.modified.should eq("false")
|
test_filter.modified.should eq("false")
|
||||||
|
|
||||||
request = HTTP::Request.new("GET", "/greetings")
|
request = HTTP::Request.new("GET", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("true")
|
client_response.body.should eq("true")
|
||||||
|
|
||||||
request = HTTP::Request.new("POST", "/greetings")
|
request = HTTP::Request.new("POST", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("true")
|
client_response.body.should eq("true")
|
||||||
end
|
end
|
||||||
|
@ -61,14 +61,14 @@ describe "Kemal::FilterHandler" do
|
||||||
test_filter.modified.should eq("false")
|
test_filter.modified.should eq("false")
|
||||||
|
|
||||||
request = HTTP::Request.new("GET", "/greetings")
|
request = HTTP::Request.new("GET", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("false")
|
client_response.body.should eq("false")
|
||||||
|
|
||||||
request = HTTP::Request.new("POST", "/greetings")
|
request = HTTP::Request.new("POST", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("false")
|
client_response.body.should eq("false")
|
||||||
end
|
end
|
||||||
|
@ -85,8 +85,8 @@ describe "Kemal::FilterHandler" do
|
||||||
|
|
||||||
test_filter.modified.should eq("false")
|
test_filter.modified.should eq("false")
|
||||||
request = HTTP::Request.new("GET", "/greetings")
|
request = HTTP::Request.new("GET", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("true")
|
client_response.body.should eq("true")
|
||||||
end
|
end
|
||||||
|
@ -105,14 +105,14 @@ describe "Kemal::FilterHandler" do
|
||||||
test_filter.modified.should eq("false")
|
test_filter.modified.should eq("false")
|
||||||
|
|
||||||
request = HTTP::Request.new("GET", "/greetings")
|
request = HTTP::Request.new("GET", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("true")
|
client_response.body.should eq("true")
|
||||||
|
|
||||||
request = HTTP::Request.new("POST", "/greetings")
|
request = HTTP::Request.new("POST", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("true")
|
client_response.body.should eq("true")
|
||||||
end
|
end
|
||||||
|
@ -132,14 +132,14 @@ describe "Kemal::FilterHandler" do
|
||||||
|
|
||||||
test_filter.modified.should eq("false")
|
test_filter.modified.should eq("false")
|
||||||
request = HTTP::Request.new("GET", "/greetings")
|
request = HTTP::Request.new("GET", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("false")
|
client_response.body.should eq("false")
|
||||||
|
|
||||||
request = HTTP::Request.new("POST", "/greetings")
|
request = HTTP::Request.new("POST", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("false")
|
client_response.body.should eq("false")
|
||||||
end
|
end
|
||||||
|
@ -166,20 +166,20 @@ describe "Kemal::FilterHandler" do
|
||||||
test_filter_second.modified.should eq("false")
|
test_filter_second.modified.should eq("false")
|
||||||
test_filter_third.modified.should eq("false")
|
test_filter_third.modified.should eq("false")
|
||||||
request = HTTP::Request.new("GET", "/greetings")
|
request = HTTP::Request.new("GET", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("true")
|
client_response.body.should eq("true")
|
||||||
|
|
||||||
request = HTTP::Request.new("POST", "/greetings")
|
request = HTTP::Request.new("POST", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("false")
|
client_response.body.should eq("false")
|
||||||
|
|
||||||
request = HTTP::Request.new("PUT", "/greetings")
|
request = HTTP::Request.new("PUT", "/greetings")
|
||||||
create_request_and_return_io(filter_middleware, request)
|
create_request_and_return_io_and_context(filter_middleware, request)
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||||
client_response.body.should eq("true")
|
client_response.body.should eq("true")
|
||||||
end
|
end
|
||||||
|
|
|
@ -28,8 +28,8 @@ describe "ParamParser" do
|
||||||
end
|
end
|
||||||
request = HTTP::Request.new("POST", "/hello/cemal")
|
request = HTTP::Request.new("POST", "/hello/cemal")
|
||||||
# Radix tree MUST be run to parse url params.
|
# Radix tree MUST be run to parse url params.
|
||||||
create_request_and_return_io(kemal, request)
|
context = create_request_and_return_io_and_context(kemal, request)[1]
|
||||||
url_params = Kemal::ParamParser.new(request).url
|
url_params = Kemal::ParamParser.new(request, context.route_lookup.params).url
|
||||||
url_params["hasan"].should eq "cemal"
|
url_params["hasan"].should eq "cemal"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -43,8 +43,8 @@ describe "ParamParser" do
|
||||||
end
|
end
|
||||||
request = HTTP::Request.new("POST", "/hello/sam%2Bspec%40gmail.com/%2419.99/a%C3%B1o")
|
request = HTTP::Request.new("POST", "/hello/sam%2Bspec%40gmail.com/%2419.99/a%C3%B1o")
|
||||||
# Radix tree MUST be run to parse url params.
|
# Radix tree MUST be run to parse url params.
|
||||||
create_request_and_return_io(kemal, request)
|
context = create_request_and_return_io_and_context(kemal, request)[1]
|
||||||
url_params = Kemal::ParamParser.new(request).url
|
url_params = Kemal::ParamParser.new(request, context.route_lookup.params).url
|
||||||
url_params["email"].should eq "sam+spec@gmail.com"
|
url_params["email"].should eq "sam+spec@gmail.com"
|
||||||
url_params["money"].should eq "$19.99"
|
url_params["money"].should eq "$19.99"
|
||||||
url_params["spanish"].should eq "año"
|
url_params["spanish"].should eq "año"
|
||||||
|
|
|
@ -29,17 +29,17 @@ end
|
||||||
add_context_storage_type(TestContextStorageType)
|
add_context_storage_type(TestContextStorageType)
|
||||||
add_context_storage_type(AnotherContextStorageType)
|
add_context_storage_type(AnotherContextStorageType)
|
||||||
|
|
||||||
def create_request_and_return_io(handler, request)
|
def create_request_and_return_io_and_context(handler, request)
|
||||||
io = IO::Memory.new
|
io = IO::Memory.new
|
||||||
response = HTTP::Server::Response.new(io)
|
response = HTTP::Server::Response.new(io)
|
||||||
context = HTTP::Server::Context.new(request, response)
|
context = HTTP::Server::Context.new(request, response)
|
||||||
handler.call(context)
|
handler.call(context)
|
||||||
response.close
|
response.close
|
||||||
io.rewind
|
io.rewind
|
||||||
io
|
{io, context}
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_ws_request_and_return_io(handler, request)
|
def create_ws_request_and_return_io_and_context(handler, request)
|
||||||
io = IO::Memory.new
|
io = IO::Memory.new
|
||||||
response = HTTP::Server::Response.new(io)
|
response = HTTP::Server::Response.new(io)
|
||||||
context = HTTP::Server::Context.new(request, response)
|
context = HTTP::Server::Context.new(request, response)
|
||||||
|
@ -49,6 +49,7 @@ def create_ws_request_and_return_io(handler, request)
|
||||||
# Raises because the IO::Memory is empty
|
# Raises because the IO::Memory is empty
|
||||||
end
|
end
|
||||||
io.rewind
|
io.rewind
|
||||||
|
{io, context}
|
||||||
end
|
end
|
||||||
|
|
||||||
def call_request_on_app(request)
|
def call_request_on_app(request)
|
||||||
|
|
|
@ -32,13 +32,13 @@ describe "Kemal::WebSocketHandler" do
|
||||||
}
|
}
|
||||||
request = HTTP::Request.new("GET", "/", headers)
|
request = HTTP::Request.new("GET", "/", headers)
|
||||||
|
|
||||||
io_with_context = create_ws_request_and_return_io(handler, request)
|
io_with_context = create_ws_request_and_return_io_and_context(handler, request)[0]
|
||||||
io_with_context.to_s.should eq("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n\x81\u0005Match")
|
io_with_context.to_s.should eq("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n\x81\u0005Match")
|
||||||
end
|
end
|
||||||
|
|
||||||
it "fetches named url parameters" do
|
it "fetches named url parameters" do
|
||||||
handler = Kemal::WebSocketHandler::INSTANCE
|
handler = Kemal::WebSocketHandler::INSTANCE
|
||||||
ws "/:id" { |_, c| c.params.url["id"] }
|
ws "/:id" { |_, c| c.ws_route_lookup.params["id"] }
|
||||||
headers = HTTP::Headers{
|
headers = HTTP::Headers{
|
||||||
"Upgrade" => "websocket",
|
"Upgrade" => "websocket",
|
||||||
"Connection" => "Upgrade",
|
"Connection" => "Upgrade",
|
||||||
|
@ -46,7 +46,7 @@ describe "Kemal::WebSocketHandler" do
|
||||||
"Sec-WebSocket-Version" => "13",
|
"Sec-WebSocket-Version" => "13",
|
||||||
}
|
}
|
||||||
request = HTTP::Request.new("GET", "/1234", headers)
|
request = HTTP::Request.new("GET", "/1234", headers)
|
||||||
io_with_context = create_ws_request_and_return_io(handler, request)
|
io_with_context = create_ws_request_and_return_io_and_context(handler, request)[0]
|
||||||
io_with_context.to_s.should eq("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n")
|
io_with_context.to_s.should eq("HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n\r\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -14,9 +14,7 @@ class HTTP::Server
|
||||||
end
|
end
|
||||||
|
|
||||||
def params
|
def params
|
||||||
@request.url_params ||= route_lookup.params
|
@params ||= Kemal::ParamParser.new(@request, route_lookup.params)
|
||||||
@params ||= Kemal::ParamParser.new(@request)
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def redirect(url : String, status_code : Int32 = 302)
|
def redirect(url : String, status_code : Int32 = 302)
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
class HTTP::Request
|
|
||||||
property url_params : Hash(String, String)?
|
|
||||||
|
|
||||||
def content_type
|
|
||||||
@headers["Content-Type"]?
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -11,8 +11,7 @@ module Kemal
|
||||||
alias AllParamTypes = Nil | String | Int64 | Float64 | Bool | Hash(String, JSON::Any) | Array(JSON::Any)
|
alias AllParamTypes = Nil | String | Int64 | Float64 | Bool | Hash(String, JSON::Any) | Array(JSON::Any)
|
||||||
getter files
|
getter files
|
||||||
|
|
||||||
def initialize(@request : HTTP::Request)
|
def initialize(@request : HTTP::Request, @url : Hash(String, String) = {} of String => String)
|
||||||
@url = {} of String => String
|
|
||||||
@query = HTTP::Params.new({} of String => Array(String))
|
@query = HTTP::Params.new({} of String => Array(String))
|
||||||
@body = HTTP::Params.new({} of String => Array(String))
|
@body = HTTP::Params.new({} of String => Array(String))
|
||||||
@json = {} of String => AllParamTypes
|
@json = {} of String => AllParamTypes
|
||||||
|
@ -42,7 +41,7 @@ module Kemal
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
private def parse_body
|
private def parse_body
|
||||||
content_type = @request.content_type
|
content_type = @request.headers["Content-Type"]?
|
||||||
return unless content_type
|
return unless content_type
|
||||||
if content_type.try(&.starts_with?(URL_ENCODED_FORM))
|
if content_type.try(&.starts_with?(URL_ENCODED_FORM))
|
||||||
@body = parse_part(@request.body)
|
@body = parse_part(@request.body)
|
||||||
|
@ -59,11 +58,7 @@ module Kemal
|
||||||
end
|
end
|
||||||
|
|
||||||
private def parse_url
|
private def parse_url
|
||||||
if params = @request.url_params
|
@url.each { |key, value| @url[key] = unescape_url_param(value) }
|
||||||
params.each do |key, value|
|
|
||||||
@url[key] = unescape_url_param(value)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private def parse_file_upload
|
private def parse_file_upload
|
||||||
|
|
|
@ -11,7 +11,6 @@ module Kemal
|
||||||
|
|
||||||
def call(context : HTTP::Server::Context)
|
def call(context : HTTP::Server::Context)
|
||||||
return call_next(context) unless context.ws_route_defined? && websocket_upgrade_request?(context)
|
return call_next(context) unless context.ws_route_defined? && websocket_upgrade_request?(context)
|
||||||
context.request.url_params ||= context.ws_route_lookup.params
|
|
||||||
content = context.websocket.call(context)
|
content = context.websocket.call(context)
|
||||||
context.response.print(content)
|
context.response.print(content)
|
||||||
context
|
context
|
||||||
|
|
Loading…
Reference in a new issue