Code fixes reported by static code analysis (#450)
This commit is contained in:
parent
f3f7e319ae
commit
c2236acf3a
|
@ -2,7 +2,7 @@ require "./spec_helper"
|
||||||
|
|
||||||
describe "Kemal::ExceptionHandler" do
|
describe "Kemal::ExceptionHandler" do
|
||||||
it "renders 404 on route not found" do
|
it "renders 404 on route not found" do
|
||||||
get "/" do |env|
|
get "/" do
|
||||||
"Hello"
|
"Hello"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ describe "Kemal::ExceptionHandler" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "renders custom 500 error" do
|
it "renders custom 500 error" do
|
||||||
error 500 do |env|
|
error 500 do
|
||||||
"Something happened"
|
"Something happened"
|
||||||
end
|
end
|
||||||
get "/" do |env|
|
get "/" do |env|
|
||||||
|
@ -60,7 +60,7 @@ describe "Kemal::ExceptionHandler" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "keeps the specified error Content-Type" do
|
it "keeps the specified error Content-Type" do
|
||||||
error 500 do |env|
|
error 500 do
|
||||||
"Something happened"
|
"Something happened"
|
||||||
end
|
end
|
||||||
get "/" do |env|
|
get "/" do |env|
|
||||||
|
@ -82,7 +82,7 @@ describe "Kemal::ExceptionHandler" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "renders custom error with env and error" do
|
it "renders custom error with env and error" do
|
||||||
error 500 do |env, err|
|
error 500 do |_, err|
|
||||||
err.message
|
err.message
|
||||||
end
|
end
|
||||||
get "/" do |env|
|
get "/" do |env|
|
||||||
|
|
|
@ -79,7 +79,7 @@ describe "Handler" do
|
||||||
end
|
end
|
||||||
add_handler CustomTestHandler.new
|
add_handler CustomTestHandler.new
|
||||||
|
|
||||||
get "/" do |env|
|
get "/" do
|
||||||
" Great"
|
" Great"
|
||||||
end
|
end
|
||||||
request = HTTP::Request.new("GET", "/")
|
request = HTTP::Request.new("GET", "/")
|
||||||
|
@ -89,7 +89,7 @@ describe "Handler" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "runs specified only_routes in middleware" do
|
it "runs specified only_routes in middleware" do
|
||||||
get "/only" do |env|
|
get "/only" do
|
||||||
"Get"
|
"Get"
|
||||||
end
|
end
|
||||||
add_handler OnlyHandler.new
|
add_handler OnlyHandler.new
|
||||||
|
@ -99,7 +99,7 @@ describe "Handler" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "doesn't run specified exclude_routes in middleware" do
|
it "doesn't run specified exclude_routes in middleware" do
|
||||||
get "/" do |env|
|
get "/" do
|
||||||
"Get"
|
"Get"
|
||||||
end
|
end
|
||||||
get "/exclude" do
|
get "/exclude" do
|
||||||
|
|
|
@ -31,7 +31,7 @@ describe "Macros" do
|
||||||
|
|
||||||
describe "#halt" do
|
describe "#halt" do
|
||||||
it "can break block with halt macro" do
|
it "can break block with halt macro" do
|
||||||
get "/non-breaking" do |env|
|
get "/non-breaking" do
|
||||||
"hello"
|
"hello"
|
||||||
"world"
|
"world"
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,7 @@ describe "Kemal::InitHandler" do
|
||||||
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)
|
||||||
Kemal::InitHandler::INSTANCE.next = ->(context : HTTP::Server::Context) {}
|
Kemal::InitHandler::INSTANCE.next = ->(_context : HTTP::Server::Context) {}
|
||||||
Kemal::InitHandler::INSTANCE.call(context)
|
Kemal::InitHandler::INSTANCE.call(context)
|
||||||
context.response.headers["Content-Type"].should eq "text/html"
|
context.response.headers["Content-Type"].should eq "text/html"
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,7 +2,6 @@ require "./spec_helper"
|
||||||
|
|
||||||
describe "Kemal::LogHandler" do
|
describe "Kemal::LogHandler" do
|
||||||
it "logs to the given IO" do
|
it "logs to the given IO" do
|
||||||
config = Kemal.config
|
|
||||||
io = IO::Memory.new
|
io = IO::Memory.new
|
||||||
logger = Kemal::LogHandler.new io
|
logger = Kemal::LogHandler.new io
|
||||||
logger.write "Something"
|
logger.write "Something"
|
||||||
|
|
|
@ -2,7 +2,7 @@ require "./spec_helper"
|
||||||
|
|
||||||
describe "ParamParser" do
|
describe "ParamParser" do
|
||||||
it "parses query params" do
|
it "parses query params" do
|
||||||
route = Route.new "POST", "/" do |env|
|
Route.new "POST", "/" do |env|
|
||||||
hasan = env.params.query["hasan"]
|
hasan = env.params.query["hasan"]
|
||||||
"Hello #{hasan}"
|
"Hello #{hasan}"
|
||||||
end
|
end
|
||||||
|
@ -12,7 +12,7 @@ describe "ParamParser" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "parses multiple values for query params" do
|
it "parses multiple values for query params" do
|
||||||
route = Route.new "POST", "/" do |env|
|
Route.new "POST", "/" do |env|
|
||||||
hasan = env.params.query["hasan"]
|
hasan = env.params.query["hasan"]
|
||||||
"Hello #{hasan}"
|
"Hello #{hasan}"
|
||||||
end
|
end
|
||||||
|
@ -28,7 +28,7 @@ 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.
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
create_request_and_return_io(kemal, request)
|
||||||
url_params = Kemal::ParamParser.new(request).url
|
url_params = Kemal::ParamParser.new(request).url
|
||||||
url_params["hasan"].should eq "cemal"
|
url_params["hasan"].should eq "cemal"
|
||||||
end
|
end
|
||||||
|
@ -43,7 +43,7 @@ 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.
|
||||||
io_with_context = create_request_and_return_io(kemal, request)
|
create_request_and_return_io(kemal, request)
|
||||||
url_params = Kemal::ParamParser.new(request).url
|
url_params = Kemal::ParamParser.new(request).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"
|
||||||
|
@ -51,7 +51,7 @@ describe "ParamParser" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "parses request body" do
|
it "parses request body" do
|
||||||
route = Route.new "POST", "/" do |env|
|
Route.new "POST", "/" do |env|
|
||||||
name = env.params.query["name"]
|
name = env.params.query["name"]
|
||||||
age = env.params.query["age"]
|
age = env.params.query["age"]
|
||||||
hasan = env.params.body["hasan"]
|
hasan = env.params.body["hasan"]
|
||||||
|
@ -77,7 +77,7 @@ describe "ParamParser" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "parses multiple values in request body" do
|
it "parses multiple values in request body" do
|
||||||
route = Route.new "POST", "/" do |env|
|
Route.new "POST", "/" do |env|
|
||||||
hasan = env.params.body["hasan"]
|
hasan = env.params.body["hasan"]
|
||||||
"Hello #{hasan}"
|
"Hello #{hasan}"
|
||||||
end
|
end
|
||||||
|
@ -95,7 +95,7 @@ describe "ParamParser" do
|
||||||
|
|
||||||
context "when content type is application/json" do
|
context "when content type is application/json" do
|
||||||
it "parses request body" do
|
it "parses request body" do
|
||||||
route = Route.new "POST", "/" { }
|
Route.new "POST", "/" { }
|
||||||
|
|
||||||
request = HTTP::Request.new(
|
request = HTTP::Request.new(
|
||||||
"POST",
|
"POST",
|
||||||
|
@ -109,7 +109,7 @@ describe "ParamParser" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "parses request body when passed charset" do
|
it "parses request body when passed charset" do
|
||||||
route = Route.new "POST", "/" { }
|
Route.new "POST", "/" { }
|
||||||
|
|
||||||
request = HTTP::Request.new(
|
request = HTTP::Request.new(
|
||||||
"POST",
|
"POST",
|
||||||
|
@ -123,7 +123,7 @@ describe "ParamParser" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "parses request body for array" do
|
it "parses request body for array" do
|
||||||
route = Route.new "POST", "/" { }
|
Route.new "POST", "/" { }
|
||||||
|
|
||||||
request = HTTP::Request.new(
|
request = HTTP::Request.new(
|
||||||
"POST",
|
"POST",
|
||||||
|
@ -137,7 +137,7 @@ describe "ParamParser" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "parses request body and query params" do
|
it "parses request body and query params" do
|
||||||
route = Route.new "POST", "/" { }
|
Route.new "POST", "/" { }
|
||||||
|
|
||||||
request = HTTP::Request.new(
|
request = HTTP::Request.new(
|
||||||
"POST",
|
"POST",
|
||||||
|
@ -156,7 +156,7 @@ describe "ParamParser" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "handles no request body" do
|
it "handles no request body" do
|
||||||
route = Route.new "GET", "/" { }
|
Route.new "GET", "/" { }
|
||||||
|
|
||||||
request = HTTP::Request.new(
|
request = HTTP::Request.new(
|
||||||
"GET",
|
"GET",
|
||||||
|
@ -180,7 +180,7 @@ describe "ParamParser" do
|
||||||
|
|
||||||
context "when content type is incorrect" do
|
context "when content type is incorrect" do
|
||||||
it "does not parse request body" do
|
it "does not parse request body" do
|
||||||
route = Route.new "POST", "/" do |env|
|
Route.new "POST", "/" do |env|
|
||||||
name = env.params.body["name"]
|
name = env.params.body["name"]
|
||||||
age = env.params.body["age"]
|
age = env.params.body["age"]
|
||||||
hasan = env.params.query["hasan"]
|
hasan = env.params.query["hasan"]
|
||||||
|
|
|
@ -104,7 +104,7 @@ describe "Kemal::RouteHandler" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "checks for _method param in POST request to simulate PUT" do
|
it "checks for _method param in POST request to simulate PUT" do
|
||||||
put "/" do |env|
|
put "/" do
|
||||||
"Hello World from PUT"
|
"Hello World from PUT"
|
||||||
end
|
end
|
||||||
request = HTTP::Request.new(
|
request = HTTP::Request.new(
|
||||||
|
@ -118,7 +118,7 @@ describe "Kemal::RouteHandler" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "checks for _method param in POST request to simulate PATCH" do
|
it "checks for _method param in POST request to simulate PATCH" do
|
||||||
patch "/" do |env|
|
patch "/" do
|
||||||
"Hello World from PATCH"
|
"Hello World from PATCH"
|
||||||
end
|
end
|
||||||
request = HTTP::Request.new(
|
request = HTTP::Request.new(
|
||||||
|
@ -132,10 +132,9 @@ describe "Kemal::RouteHandler" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "checks for _method param in POST request to simulate DELETE" do
|
it "checks for _method param in POST request to simulate DELETE" do
|
||||||
delete "/" do |env|
|
delete "/" do
|
||||||
"Hello World from DELETE"
|
"Hello World from DELETE"
|
||||||
end
|
end
|
||||||
json_payload = {"_method": "DELETE"}
|
|
||||||
request = HTTP::Request.new(
|
request = HTTP::Request.new(
|
||||||
"POST",
|
"POST",
|
||||||
"/",
|
"/",
|
||||||
|
@ -147,7 +146,7 @@ describe "Kemal::RouteHandler" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "can process HTTP HEAD requests for defined GET routes" do
|
it "can process HTTP HEAD requests for defined GET routes" do
|
||||||
get "/" do |env|
|
get "/" do
|
||||||
"Hello World from GET"
|
"Hello World from GET"
|
||||||
end
|
end
|
||||||
request = HTTP::Request.new("HEAD", "/")
|
request = HTTP::Request.new("HEAD", "/")
|
||||||
|
|
|
@ -3,10 +3,10 @@ require "./spec_helper"
|
||||||
describe "Route" do
|
describe "Route" do
|
||||||
describe "match?" do
|
describe "match?" do
|
||||||
it "matches the correct route" do
|
it "matches the correct route" do
|
||||||
get "/route1" do |env|
|
get "/route1" do
|
||||||
"Route 1"
|
"Route 1"
|
||||||
end
|
end
|
||||||
get "/route2" do |env|
|
get "/route2" do
|
||||||
"Route 2"
|
"Route 2"
|
||||||
end
|
end
|
||||||
request = HTTP::Request.new("GET", "/route2")
|
request = HTTP::Request.new("GET", "/route2")
|
||||||
|
@ -16,7 +16,7 @@ describe "Route" do
|
||||||
|
|
||||||
it "doesn't allow a route declaration start without /" do
|
it "doesn't allow a route declaration start without /" do
|
||||||
expect_raises Kemal::Exceptions::InvalidPathStartException, "Route declaration get \"route\" needs to start with '/', should be get \"/route\"" do
|
expect_raises Kemal::Exceptions::InvalidPathStartException, "Route declaration get \"route\" needs to start with '/', should be get \"/route\"" do
|
||||||
get "route" do |env|
|
get "route" do
|
||||||
"Route 1"
|
"Route 1"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -66,7 +66,7 @@ def build_main_handler
|
||||||
Kemal.config.setup
|
Kemal.config.setup
|
||||||
main_handler = Kemal.config.handlers.first
|
main_handler = Kemal.config.handlers.first
|
||||||
current_handler = main_handler
|
current_handler = main_handler
|
||||||
Kemal.config.handlers.each_with_index do |handler, index|
|
Kemal.config.handlers.each do |handler|
|
||||||
current_handler.next = handler
|
current_handler.next = handler
|
||||||
current_handler = handler
|
current_handler = handler
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,7 +14,6 @@ end
|
||||||
describe Kemal::StaticFileHandler do
|
describe Kemal::StaticFileHandler do
|
||||||
file = File.open "#{__DIR__}/static/dir/test.txt"
|
file = File.open "#{__DIR__}/static/dir/test.txt"
|
||||||
file_size = file.size
|
file_size = file.size
|
||||||
file_text = file.to_s
|
|
||||||
|
|
||||||
it "should serve a file with content type and etag" do
|
it "should serve a file with content type and etag" do
|
||||||
response = handle HTTP::Request.new("GET", "/dir/test.txt")
|
response = handle HTTP::Request.new("GET", "/dir/test.txt")
|
||||||
|
|
|
@ -22,8 +22,8 @@ describe "Kemal::WebSocketHandler" do
|
||||||
|
|
||||||
it "matches on given route" do
|
it "matches on given route" do
|
||||||
handler = Kemal::WebSocketHandler::INSTANCE
|
handler = Kemal::WebSocketHandler::INSTANCE
|
||||||
ws "/" { |socket, context| socket.send("Match") }
|
ws "/" { |socket| socket.send("Match") }
|
||||||
ws "/no_match" { |socket, context| socket.send "No Match" }
|
ws "/no_match" { |socket| socket.send "No Match" }
|
||||||
headers = HTTP::Headers{
|
headers = HTTP::Headers{
|
||||||
"Upgrade" => "websocket",
|
"Upgrade" => "websocket",
|
||||||
"Connection" => "Upgrade",
|
"Connection" => "Upgrade",
|
||||||
|
@ -37,7 +37,7 @@ describe "Kemal::WebSocketHandler" do
|
||||||
|
|
||||||
it "fetches named url parameters" do
|
it "fetches named url parameters" do
|
||||||
handler = Kemal::WebSocketHandler::INSTANCE
|
handler = Kemal::WebSocketHandler::INSTANCE
|
||||||
ws "/:id" { |s, c| c.params.url["id"] }
|
ws "/:id" { |_, c| c.params.url["id"] }
|
||||||
headers = HTTP::Headers{
|
headers = HTTP::Headers{
|
||||||
"Upgrade" => "websocket",
|
"Upgrade" => "websocket",
|
||||||
"Connection" => "Upgrade",
|
"Connection" => "Upgrade",
|
||||||
|
|
|
@ -34,7 +34,7 @@ module Kemal
|
||||||
config.port = port if port
|
config.port = port if port
|
||||||
|
|
||||||
unless Kemal.config.error_handlers.has_key?(404)
|
unless Kemal.config.error_handlers.has_key?(404)
|
||||||
error 404 do |env|
|
error 404 do
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -50,7 +50,7 @@ module Kemal
|
||||||
# This route serves the built-in images for not_found and exceptions.
|
# This route serves the built-in images for not_found and exceptions.
|
||||||
get "/__kemal__/404.png" do |env|
|
get "/__kemal__/404.png" do |env|
|
||||||
file_path = File.expand_path("lib/kemal/images/404.png", Dir.current)
|
file_path = File.expand_path("lib/kemal/images/404.png", Dir.current)
|
||||||
|
|
||||||
if File.exists? file_path
|
if File.exists? file_path
|
||||||
send_file env, file_path
|
send_file env, file_path
|
||||||
else
|
else
|
||||||
|
|
|
@ -5,18 +5,16 @@ module Kemal
|
||||||
INSTANCE = new
|
INSTANCE = new
|
||||||
|
|
||||||
def call(context : HTTP::Server::Context)
|
def call(context : HTTP::Server::Context)
|
||||||
begin
|
call_next(context)
|
||||||
call_next(context)
|
rescue ex : Kemal::Exceptions::RouteNotFound
|
||||||
rescue ex : Kemal::Exceptions::RouteNotFound
|
call_exception_with_status_code(context, ex, 404)
|
||||||
call_exception_with_status_code(context, ex, 404)
|
rescue ex : Kemal::Exceptions::CustomException
|
||||||
rescue ex : Kemal::Exceptions::CustomException
|
call_exception_with_status_code(context, ex, context.response.status_code)
|
||||||
call_exception_with_status_code(context, ex, context.response.status_code)
|
rescue ex : Exception
|
||||||
rescue ex : Exception
|
log("Exception: #{ex.inspect_with_backtrace}")
|
||||||
log("Exception: #{ex.inspect_with_backtrace}")
|
return call_exception_with_status_code(context, ex, 500) if Kemal.config.error_handlers.has_key?(500)
|
||||||
return call_exception_with_status_code(context, ex, 500) if Kemal.config.error_handlers.has_key?(500)
|
verbosity = Kemal.config.env == "production" ? false : true
|
||||||
verbosity = Kemal.config.env == "production" ? false : true
|
return render_500(context, ex.inspect_with_backtrace, verbosity)
|
||||||
return render_500(context, ex.inspect_with_backtrace, verbosity)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private def call_exception_with_status_code(context : HTTP::Server::Context, exception : Exception, status_code : Int32)
|
private def call_exception_with_status_code(context : HTTP::Server::Context, exception : Exception, status_code : Int32)
|
||||||
|
|
|
@ -2,22 +2,22 @@
|
||||||
# Currently it contains templates for 404 and 500 error codes.
|
# Currently it contains templates for 404 and 500 error codes.
|
||||||
|
|
||||||
def render_404
|
def render_404
|
||||||
template = <<-HTML
|
<<-HTML
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
body { text-align:center;font-family:helvetica,arial;font-size:22px;
|
body { text-align:center;font-family:helvetica,arial;font-size:22px;
|
||||||
color:#888;margin:20px}
|
color:#888;margin:20px}
|
||||||
img { max-width: 579px; width: 100%; }
|
img { max-width: 579px; width: 100%; }
|
||||||
#c {margin:0 auto;width:500px;text-align:left}
|
#c {margin:0 auto;width:500px;text-align:left}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h2>Kemal doesn't know this way.</h2>
|
<h2>Kemal doesn't know this way.</h2>
|
||||||
<img src="/__kemal__/404.png">
|
<img src="/__kemal__/404.png">
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
HTML
|
HTML
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue