From 06665e81bcb84b1c3f88ba4968f13f3bf9aa2b31 Mon Sep 17 00:00:00 2001 From: Sijawusz Pur Rahnama Date: Thu, 13 Jun 2019 13:31:45 +0200 Subject: [PATCH 1/8] Use Ameba on Travis CI (#520) --- .travis.yml | 1 + shard.yml | 5 +++++ src/kemal/exception_handler.cr | 2 +- src/kemal/ext/response.cr | 2 +- src/kemal/static_file_handler.cr | 2 +- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 11e436b..9883f5e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ script: - crystal spec - crystal spec --release --no-debug - crystal tool format --check + - bin/ameba src matrix: allow_failures: diff --git a/shard.yml b/shard.yml index 69ec827..6700d8a 100644 --- a/shard.yml +++ b/shard.yml @@ -15,6 +15,11 @@ dependencies: github: crystal-loot/exception_page version: ~> 0.1.1 +development_dependencies: + ameba: + github: veelenga/ameba + version: ~> 0.9.0 + crystal: 0.27.2 license: MIT diff --git a/src/kemal/exception_handler.cr b/src/kemal/exception_handler.cr index 1462832..eee6eec 100644 --- a/src/kemal/exception_handler.cr +++ b/src/kemal/exception_handler.cr @@ -14,7 +14,7 @@ module Kemal log("Exception: #{ex.inspect_with_backtrace}") return call_exception_with_status_code(context, ex, 500) if Kemal.config.error_handlers.has_key?(500) verbosity = Kemal.config.env == "production" ? false : true - return render_500(context, ex, verbosity) + render_500(context, ex, verbosity) end private def call_exception_with_status_code(context : HTTP::Server::Context, exception : Exception, status_code : Int32) diff --git a/src/kemal/ext/response.cr b/src/kemal/ext/response.cr index 1f0a8fd..233bdee 100644 --- a/src/kemal/ext/response.cr +++ b/src/kemal/ext/response.cr @@ -1,7 +1,7 @@ class HTTP::Server::Response class Output def close - unless response.wrote_headers? && !response.headers.has_key?("Content-Range") + if !response.wrote_headers? && response.headers.has_key?("Content-Range") response.content_length = @out_count end diff --git a/src/kemal/static_file_handler.cr b/src/kemal/static_file_handler.cr index 50d1574..11ae98e 100644 --- a/src/kemal/static_file_handler.cr +++ b/src/kemal/static_file_handler.cr @@ -52,7 +52,7 @@ module Kemal context.response.content_type = "text/html" directory_listing(context.response, request_path, file_path) else - return call_next(context) + call_next(context) end elsif File.exists?(file_path) last_modified = modification_time(file_path) From ecaa4237749fabfd0616616711ac8e744d4a54c4 Mon Sep 17 00:00:00 2001 From: sdogruyol Date: Thu, 13 Jun 2019 14:38:41 +0300 Subject: [PATCH 2/8] Bump ameba to 0.10.0 --- shard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shard.yml b/shard.yml index 6700d8a..025971a 100644 --- a/shard.yml +++ b/shard.yml @@ -18,7 +18,7 @@ dependencies: development_dependencies: ameba: github: veelenga/ameba - version: ~> 0.9.0 + version: ~> 0.10.0 crystal: 0.27.2 From fc8ac1160cba24714f6a6ceb0ef53af98ed059fb Mon Sep 17 00:00:00 2001 From: sdogruyol Date: Thu, 13 Jun 2019 15:33:11 +0300 Subject: [PATCH 3/8] Add /bin to .gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 5a0d7aa..6c364e4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ /.crystal/ /.shards/ *.log - +/bin/ # Libraries don't need dependency lock # Dependencies will be locked in application that uses them -/shard.lock +/shard.lock \ No newline at end of file From f3d02e60af2687580425f526ff8adfc579f73efc Mon Sep 17 00:00:00 2001 From: sdogruyol Date: Thu, 13 Jun 2019 15:42:21 +0300 Subject: [PATCH 4/8] Add auto-generated .ameba.yml --- .ameba.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .ameba.yml diff --git a/.ameba.yml b/.ameba.yml new file mode 100644 index 0000000..bf117f0 --- /dev/null +++ b/.ameba.yml @@ -0,0 +1,33 @@ +# This configuration file was generated by `ameba --gen-config` +# on 2019-06-13 12:39:59 UTC using Ameba version 0.10.0. +# The point is for the user to remove these configuration records +# one by one as the reported problems are removed from the code base. + +# Problems found: 1 +# Run `ameba --only Lint/ShadowingOuterLocalVar` for details +Lint/ShadowingOuterLocalVar: + Description: Disallows the usage of the same name as outer local variables for block + or proc arguments. + Enabled: true + Severity: Warning + Excluded: + - spec/run_spec.cr + +# Problems found: 7 +# Run `ameba --only Lint/UselessAssign` for details +Lint/UselessAssign: + Description: Disallows useless variable assignments + Enabled: true + Severity: Warning + Excluded: + - spec/view_spec.cr + +# Problems found: 1 +# Run `ameba --only Metrics/CyclomaticComplexity` for details +Metrics/CyclomaticComplexity: + Description: Disallows methods with a cyclomatic complexity higher than `MaxComplexity` + MaxComplexity: 10 + Enabled: true + Severity: Convention + Excluded: + - src/kemal/static_file_handler.cr From e3544a86bf002f75d2b341c5343e9ebdbf839f80 Mon Sep 17 00:00:00 2001 From: Anton Maminov Date: Tue, 18 Jun 2019 18:03:32 +0300 Subject: [PATCH 5/8] Do not early return from HTTP::Server::Response::Output.close. Revert what Ameba broke --- .ameba.yml | 31 ++++++++++++++++++++----------- src/kemal/ext/response.cr | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/.ameba.yml b/.ameba.yml index bf117f0..cf5dbb2 100644 --- a/.ameba.yml +++ b/.ameba.yml @@ -1,18 +1,8 @@ # This configuration file was generated by `ameba --gen-config` -# on 2019-06-13 12:39:59 UTC using Ameba version 0.10.0. +# on 2019-06-14 15:05:57 UTC using Ameba version 0.10.0. # The point is for the user to remove these configuration records # one by one as the reported problems are removed from the code base. -# Problems found: 1 -# Run `ameba --only Lint/ShadowingOuterLocalVar` for details -Lint/ShadowingOuterLocalVar: - Description: Disallows the usage of the same name as outer local variables for block - or proc arguments. - Enabled: true - Severity: Warning - Excluded: - - spec/run_spec.cr - # Problems found: 7 # Run `ameba --only Lint/UselessAssign` for details Lint/UselessAssign: @@ -22,6 +12,25 @@ Lint/UselessAssign: Excluded: - spec/view_spec.cr +# Problems found: 1 +# Run `ameba --only Lint/ShadowingOuterLocalVar` for details +Lint/ShadowingOuterLocalVar: + Description: Disallows the usage of the same name as outer local variables for block + or proc arguments. + Enabled: true + Severity: Warning + Excluded: + - spec/run_spec.cr + +# Problems found: 1 +# Run `ameba --only Style/NegatedConditionsInUnless` for details +Style/NegatedConditionsInUnless: + Description: Disallows negated conditions in unless + Enabled: true + Severity: Convention + Excluded: + - src/kemal/ext/response.cr + # Problems found: 1 # Run `ameba --only Metrics/CyclomaticComplexity` for details Metrics/CyclomaticComplexity: diff --git a/src/kemal/ext/response.cr b/src/kemal/ext/response.cr index 233bdee..1f0a8fd 100644 --- a/src/kemal/ext/response.cr +++ b/src/kemal/ext/response.cr @@ -1,7 +1,7 @@ class HTTP::Server::Response class Output def close - if !response.wrote_headers? && response.headers.has_key?("Content-Range") + unless response.wrote_headers? && !response.headers.has_key?("Content-Range") response.content_length = @out_count end From 6e2714404d9aa5cc327b960e8647832a5f2c9089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20M=C3=BCller?= Date: Fri, 26 Jul 2019 10:48:14 +0200 Subject: [PATCH 6/8] Add missing return types to overrides of abstract methods (#544) --- src/kemal/helpers/exception_page.cr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kemal/helpers/exception_page.cr b/src/kemal/helpers/exception_page.cr index cf812cd..4ec180c 100644 --- a/src/kemal/helpers/exception_page.cr +++ b/src/kemal/helpers/exception_page.cr @@ -2,7 +2,7 @@ require "exception_page" module Kemal class ExceptionPage < ExceptionPage - def styles + def styles : ExceptionPage::Styles ExceptionPage::Styles.new( accent: "red", logo_uri: "data:image/png;base64,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" From 17bf1c7709b6c4e3570ce9ef65c814c529e83ea3 Mon Sep 17 00:00:00 2001 From: "Brian J. Cardiff" Date: Sat, 3 Aug 2019 13:35:40 -0300 Subject: [PATCH 7/8] Upgrade to Crystal v0.30.0 (#548) --- src/kemal/param_parser.cr | 2 +- src/kemal/static_file_handler.cr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kemal/param_parser.cr b/src/kemal/param_parser.cr index 7dfb52b..92c3112 100644 --- a/src/kemal/param_parser.cr +++ b/src/kemal/param_parser.cr @@ -24,7 +24,7 @@ module Kemal end private def unescape_url_param(value : String) - value.empty? ? value : URI.unescape(value) + value.empty? ? value : URI.decode(value) rescue value end diff --git a/src/kemal/static_file_handler.cr b/src/kemal/static_file_handler.cr index 11ae98e..cd83749 100644 --- a/src/kemal/static_file_handler.cr +++ b/src/kemal/static_file_handler.cr @@ -21,7 +21,7 @@ module Kemal config = Kemal.config.serve_static original_path = context.request.path.not_nil! - request_path = URI.unescape(original_path) + request_path = URI.decode(original_path) # File path cannot contains '\0' (NUL) because all filesystem I know # don't accept '\0' character as file name. From 18ddc3b4e6232ad7674d756c3d507da94398c7d6 Mon Sep 17 00:00:00 2001 From: Omar Roth Date: Sat, 3 Aug 2019 11:37:23 -0500 Subject: [PATCH 8/8] Fix static file handler for files > 2^31 bytes (#546) --- src/kemal/helpers/helpers.cr | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/kemal/helpers/helpers.cr b/src/kemal/helpers/helpers.cr index 821d47e..7baf851 100644 --- a/src/kemal/helpers/helpers.cr +++ b/src/kemal/helpers/helpers.cr @@ -184,26 +184,26 @@ end private def multipart(file, env : HTTP::Server::Context) # See http://httpwg.org/specs/rfc7233.html fileb = file.size - startb = endb = 0 + startb = endb = 0_i64 if match = env.request.headers["Range"].match /bytes=(\d{1,})-(\d{0,})/ - startb = match[1].to_i { 0 } if match.size >= 2 - endb = match[2].to_i { 0 } if match.size >= 3 + startb = match[1].to_i64 { 0_i64 } if match.size >= 2 + endb = match[2].to_i64 { 0_i64 } if match.size >= 3 end endb = fileb - 1 if endb == 0 if startb < endb < fileb - content_length = 1 + endb - startb + content_length = 1_i64 + endb - startb env.response.status_code = 206 env.response.content_length = content_length env.response.headers["Accept-Ranges"] = "bytes" env.response.headers["Content-Range"] = "bytes #{startb}-#{endb}/#{fileb}" # MUST if startb > 1024 - skipped = 0 + skipped = 0_i64 # file.skip only accepts values less or equal to 1024 (buffer size, undocumented) - until (increase_skipped = skipped + 1024) > startb + until (increase_skipped = skipped + 1024_i64) > startb file.skip(1024) skipped = increase_skipped end