mirror of
https://gitea.invidious.io/iv-org/shard-kemal.git
synced 2024-08-15 00:53:36 +00:00
Rebased to master and update to Crystal 0.27.0
This commit is contained in:
parent
4fefd9cb5c
commit
678adaa375
12 changed files with 71 additions and 136 deletions
|
@ -1 +1 @@
|
|||
require "./*"
|
||||
# require "./*"
|
||||
|
|
|
@ -28,7 +28,8 @@ describe "Kemal::InitHandler" do
|
|||
io = IO::Memory.new
|
||||
response = HTTP::Server::Response.new(io)
|
||||
context = HTTP::Server::Context.new(request, response)
|
||||
Kemal::InitHandler::INSTANCE.call(context)
|
||||
init_handler = Kemal::InitHandler.new(Kemal::Base.new)
|
||||
init_handler.call(context)
|
||||
context.response.headers["X-Powered-By"]?.should be_nil
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
require "../spec_helper"
|
||||
require "../dsl_helper"
|
||||
|
||||
describe "Kemal::FilterHandler" do
|
||||
it "executes code before home request" do
|
||||
|
@ -13,8 +13,8 @@ describe "Kemal::FilterHandler" do
|
|||
|
||||
test_filter.modified.should eq("false")
|
||||
request = HTTP::Request.new("GET", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("true")
|
||||
end
|
||||
|
@ -33,14 +33,14 @@ describe "Kemal::FilterHandler" do
|
|||
test_filter.modified.should eq("false")
|
||||
|
||||
request = HTTP::Request.new("GET", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("true")
|
||||
|
||||
request = HTTP::Request.new("POST", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("true")
|
||||
end
|
||||
|
@ -61,14 +61,14 @@ describe "Kemal::FilterHandler" do
|
|||
test_filter.modified.should eq("false")
|
||||
|
||||
request = HTTP::Request.new("GET", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("false")
|
||||
|
||||
request = HTTP::Request.new("POST", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("false")
|
||||
end
|
||||
|
@ -85,14 +85,14 @@ describe "Kemal::FilterHandler" do
|
|||
|
||||
test_filter.modified.should eq("false")
|
||||
request = HTTP::Request.new("GET", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("true")
|
||||
end
|
||||
|
||||
it "executes code after GET home request but not POST home request" do
|
||||
test_filter = FilterTest.new
|
||||
test_filter = FilterTest.new
|
||||
test_filter.modified = "false"
|
||||
|
||||
filter_middleware = Kemal::FilterHandler.new(Kemal.application)
|
||||
|
@ -105,20 +105,20 @@ describe "Kemal::FilterHandler" do
|
|||
test_filter.modified.should eq("false")
|
||||
|
||||
request = HTTP::Request.new("GET", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("true")
|
||||
|
||||
request = HTTP::Request.new("POST", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("true")
|
||||
end
|
||||
|
||||
it "executes code after all GET/POST home request" do
|
||||
test_filter = FilterTest.new
|
||||
test_filter = FilterTest.new
|
||||
test_filter.modified = "false"
|
||||
|
||||
filter_middleware = Kemal::FilterHandler.new(Kemal.application)
|
||||
|
@ -132,14 +132,14 @@ describe "Kemal::FilterHandler" do
|
|||
|
||||
test_filter.modified.should eq("false")
|
||||
request = HTTP::Request.new("GET", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("false")
|
||||
|
||||
request = HTTP::Request.new("POST", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("false")
|
||||
end
|
||||
|
@ -166,20 +166,20 @@ describe "Kemal::FilterHandler" do
|
|||
test_filter_second.modified.should eq("false")
|
||||
test_filter_third.modified.should eq("false")
|
||||
request = HTTP::Request.new("GET", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("true")
|
||||
|
||||
request = HTTP::Request.new("POST", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("false")
|
||||
|
||||
request = HTTP::Request.new("PUT", "/greetings")
|
||||
create_request_and_return_io_and_context(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io_and_context(kemal, request)[0]
|
||||
create_request_and_return_io(filter_middleware, request)
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
client_response = HTTP::Client::Response.from_io(io_with_context, decompress: false)
|
||||
client_response.body.should eq("true")
|
||||
end
|
||||
|
|
|
@ -43,8 +43,8 @@ describe "ParamParser" do
|
|||
end
|
||||
request = HTTP::Request.new("POST", "/hello/sam%2Bspec%40gmail.com/%2419.99/a%C3%B1o")
|
||||
# Radix tree MUST be run to parse url params.
|
||||
context = create_request_and_return_io_and_context(kemal, request)[1]
|
||||
url_params = Kemal::ParamParser.new(request, context.route_lookup.params).url
|
||||
io_with_context = create_request_and_return_io(kemal, request)
|
||||
url_params = Kemal::ParamParser.new(request).url
|
||||
url_params["email"].should eq "sam+spec@gmail.com"
|
||||
url_params["money"].should eq "$19.99"
|
||||
url_params["spanish"].should eq "año"
|
||||
|
|
|
@ -46,7 +46,7 @@ describe "Kemal::WebSocketHandler" do
|
|||
request = HTTP::Request.new("GET", "/", headers)
|
||||
|
||||
io_with_context = create_ws_request_and_return_io(app.websocket_handler, request)
|
||||
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
|
||||
|
||||
it "fetches named url parameters" do
|
||||
|
@ -60,7 +60,7 @@ describe "Kemal::WebSocketHandler" do
|
|||
}
|
||||
request = HTTP::Request.new("GET", "/1234", headers)
|
||||
io_with_context = create_ws_request_and_return_io(app.websocket_handler, request)
|
||||
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
|
||||
|
||||
it "matches correct verb" do
|
||||
|
|
|
@ -2,6 +2,6 @@ def render_404
|
|||
Kemal.application.render_404
|
||||
end
|
||||
|
||||
def render_500(context, backtrace, verbosity)
|
||||
Kemal.application.render_500(context, backtrace, verbosity)
|
||||
def render_500(context, exception, verbosity)
|
||||
Kemal.application.render_500(context, exception, verbosity)
|
||||
end
|
||||
|
|
|
@ -21,7 +21,7 @@ module Kemal
|
|||
log("Exception: #{ex.inspect_with_backtrace}")
|
||||
return call_exception_with_status_code(context, ex, 500) if app.error_handlers.has_key?(500)
|
||||
verbosity = app.config.env == "production" ? false : true
|
||||
return app.render_500(context, ex.inspect_with_backtrace, verbosity)
|
||||
return app.render_500(context, ex, verbosity)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -10,11 +10,11 @@ class HTTP::Server
|
|||
|
||||
macro finished
|
||||
alias StoreTypes = Union({{ *STORE_MAPPINGS }})
|
||||
@store = {} of String => StoreTypes
|
||||
getter store = {} of String => StoreTypes
|
||||
end
|
||||
|
||||
def params
|
||||
@params ||= Kemal::ParamParser.new(@request, route_lookup.params)
|
||||
@params ||= Kemal::ParamParser.new(@request)
|
||||
end
|
||||
|
||||
def redirect(url : String, status_code : Int32 = 302)
|
||||
|
@ -22,30 +22,6 @@ class HTTP::Server
|
|||
@response.status_code = status_code
|
||||
end
|
||||
|
||||
def route
|
||||
route_lookup.payload
|
||||
end
|
||||
|
||||
def websocket
|
||||
ws_route_lookup.payload
|
||||
end
|
||||
|
||||
def route_lookup
|
||||
app.route_handler.lookup_route(@request.override_method.as(String), @request.path)
|
||||
end
|
||||
|
||||
def route_found?
|
||||
route_lookup.found?
|
||||
end
|
||||
|
||||
def ws_route_lookup
|
||||
app.websocket_handler.lookup_ws_route(@request.path)
|
||||
end
|
||||
|
||||
def ws_route_found?
|
||||
ws_route_lookup.found?
|
||||
end
|
||||
|
||||
def get(name : String)
|
||||
@store[name]
|
||||
end
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,28 +1,27 @@
|
|||
require "http"
|
||||
require "json"
|
||||
require "uri"
|
||||
require "./ext/*"
|
||||
require "./helpers/*"
|
||||
require "./application"
|
||||
require "./base_log_handler"
|
||||
require "./cli"
|
||||
require "./exception_handler"
|
||||
require "./log_handler"
|
||||
require "./config"
|
||||
require "./exceptions"
|
||||
require "./file_upload"
|
||||
require "./filter_handler"
|
||||
require "./handler"
|
||||
require "./init_handler"
|
||||
require "./null_log_handler"
|
||||
require "./param_parser"
|
||||
require "./response"
|
||||
require "./route"
|
||||
require "./route_handler"
|
||||
require "./ssl"
|
||||
require "./static_file_handler"
|
||||
require "./websocket"
|
||||
require "./websocket_handler"
|
||||
require "./ext/*"
|
||||
require "./helpers/*"
|
||||
|
||||
|
||||
module Kemal
|
||||
def self.application
|
||||
|
@ -35,7 +34,7 @@ module Kemal
|
|||
|
||||
# Overload of `self.run` with the default startup logging.
|
||||
def self.run(port : Int32? = nil)
|
||||
CLI.new(config)
|
||||
CLI.new(ARGV, config)
|
||||
|
||||
application.run(port)
|
||||
end
|
||||
|
@ -44,7 +43,7 @@ module Kemal
|
|||
# The port can be given to `#run` but is optional.
|
||||
# If not given Kemal will use `Kemal::Config#port`
|
||||
def self.run(port : Int32? = nil)
|
||||
CLI.new(config)
|
||||
CLI.new(ARGV, config)
|
||||
|
||||
application.run(port) do |application|
|
||||
yield application
|
||||
|
|
|
@ -10,8 +10,9 @@ module Kemal
|
|||
# :nodoc:
|
||||
alias AllParamTypes = Nil | String | Int64 | Float64 | Bool | Hash(String, JSON::Any) | Array(JSON::Any)
|
||||
getter files
|
||||
getter url : Hash(String, String)
|
||||
|
||||
def initialize(@request : HTTP::Request, @url : Hash(String, String) = {} of String => String)
|
||||
def initialize(@request : HTTP::Request)
|
||||
@query = HTTP::Params.new({} of String => Array(String))
|
||||
@body = HTTP::Params.new({} of String => Array(String))
|
||||
@json = {} of String => AllParamTypes
|
||||
|
@ -21,6 +22,7 @@ module Kemal
|
|||
@body_parsed = false
|
||||
@json_parsed = false
|
||||
@files_parsed = false
|
||||
@url = {} of String => String
|
||||
end
|
||||
|
||||
private def unescape_url_param(value : String)
|
||||
|
@ -61,7 +63,12 @@ module Kemal
|
|||
end
|
||||
|
||||
private def parse_url
|
||||
@url.each { |key, value| @url[key] = unescape_url_param(value) }
|
||||
unless @request.url_params.nil?
|
||||
@request.url_params.not_nil!.each { |key, value| @url[key] = unescape_url_param(value) }
|
||||
else
|
||||
@url
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
private def parse_files
|
||||
|
|
|
@ -54,8 +54,11 @@ module Kemal
|
|||
|
||||
# Processes the route if it's a match. Otherwise renders 404.
|
||||
private def process_request(context)
|
||||
raise Kemal::Exceptions::RouteNotFound.new(context) unless context.route_found?
|
||||
content = context.route.handler.call(context)
|
||||
raise Kemal::Exceptions::RouteNotFound.new(context) unless route_defined?(context.request)
|
||||
|
||||
tree_result = lookup_route(context.request)
|
||||
context.request.url_params = tree_result.params
|
||||
content = tree_result.payload.handler.call(context)
|
||||
|
||||
if !app.error_handlers.empty? && app.error_handlers.has_key?(context.response.status_code)
|
||||
raise Kemal::Exceptions::CustomException.new(context)
|
||||
|
@ -76,6 +79,7 @@ module Kemal
|
|||
|
||||
def clear
|
||||
@routes = Radix::Tree(Route).new
|
||||
@cached_routes = Hash(String, Radix::Result(Route)).new
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue