hanami-router 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +4 -4
- data/hanami-router.gemspec +2 -2
- data/lib/hanami/middleware/body_parser/form_parser.rb +42 -0
- data/lib/hanami/middleware/body_parser/json_parser.rb +1 -1
- data/lib/hanami/middleware/body_parser/parser.rb +2 -1
- data/lib/hanami/middleware/body_parser.rb +1 -1
- data/lib/hanami/router/version.rb +2 -1
- data/lib/hanami/router.rb +21 -12
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d211b5c2f94d5e609ae9de76707c3740d387771f0864fab1d8a04f1f81942663
|
4
|
+
data.tar.gz: 354ce7d52713736379e88271b84e930b6b203299a355e9568c64572380286efe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8ef3013b9ec171da3eeef8ee92564cc55ad010c62a2133a386325c31ee2501331a92808b37503671d4b75b8d0a8d5eb38ce0bac7b24099bffea689f14cc51e0
|
7
|
+
data.tar.gz: bdf66d398a5e1f32b279ffb22cb4ba6719b2565631880a18e4e2d82469b293930b0f29265d483495d7b7c23dfe4b842aa0cadb34a083d32bad945a2bfc4e8100
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
Rack compatible HTTP router for Ruby
|
4
4
|
|
5
|
+
## v2.0.1 - 2022-12-06
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
- [Armin, Luca Guidi] Introduce `Hanami::Middleware::BodyParser::FormParser` to parse multipart file upload
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
|
13
|
+
- [Luca Guidi] Return HTTP response header `Allow` when returning `405` HTTP status
|
14
|
+
|
5
15
|
## v2.0.0 - 2022-11-22
|
6
16
|
|
7
17
|
### Fixed
|
data/README.md
CHANGED
@@ -331,22 +331,22 @@ curl http://localhost:2300/authors/1 \
|
|
331
331
|
require "hanami/router"
|
332
332
|
|
333
333
|
router = Hanami::Router.new do
|
334
|
-
get "/books/:id", to: "books
|
334
|
+
get "/books/:id", to: "books.show", as: :book
|
335
335
|
end
|
336
336
|
|
337
337
|
route = router.recognize("/books/23")
|
338
338
|
route.verb # "GET"
|
339
|
-
route.
|
339
|
+
route.endpoint # => "books.show"
|
340
340
|
route.params # => {:id=>"23"}
|
341
341
|
route.routable? # => true
|
342
342
|
|
343
343
|
route = router.recognize(:book, id: 23)
|
344
344
|
route.verb # "GET"
|
345
|
-
route.
|
345
|
+
route.endpoint # => "books.show"
|
346
346
|
route.params # => {:id=>"23"}
|
347
347
|
route.routable? # => true
|
348
348
|
|
349
|
-
route = router.recognize("/books/23", method: :post)
|
349
|
+
route = router.recognize("/books/23", {}, method: :post)
|
350
350
|
route.verb # "POST"
|
351
351
|
route.routable? # => false
|
352
352
|
```
|
data/hanami-router.gemspec
CHANGED
@@ -21,8 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.required_ruby_version = ">= 3.0"
|
22
22
|
|
23
23
|
spec.add_dependency "rack", "~> 2.0"
|
24
|
-
spec.add_dependency "mustermann", "~>
|
25
|
-
spec.add_dependency "mustermann-contrib", "~>
|
24
|
+
spec.add_dependency "mustermann", "~> 3.0"
|
25
|
+
spec.add_dependency "mustermann-contrib", "~> 3.0"
|
26
26
|
|
27
27
|
spec.add_development_dependency "bundler", ">= 1.6", "< 3"
|
28
28
|
spec.add_development_dependency "rake", "~> 13"
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "parser"
|
4
|
+
require "rack/multipart"
|
5
|
+
|
6
|
+
module Hanami
|
7
|
+
module Middleware
|
8
|
+
class BodyParser
|
9
|
+
# @since 2.0.1
|
10
|
+
# @api private
|
11
|
+
class FormParser < Parser
|
12
|
+
# @since 2.0.1
|
13
|
+
# @api private
|
14
|
+
MIME_TYPES = [
|
15
|
+
"multipart/form-data"
|
16
|
+
].freeze
|
17
|
+
|
18
|
+
# @since 2.0.1
|
19
|
+
# @api private
|
20
|
+
def self.mime_types
|
21
|
+
MIME_TYPES
|
22
|
+
end
|
23
|
+
|
24
|
+
# Parse a multipart body payload (form file uploading)
|
25
|
+
#
|
26
|
+
# @param body [String] a multipart body
|
27
|
+
#
|
28
|
+
# @return [Hash] the parsed multipart body
|
29
|
+
#
|
30
|
+
# @raise [Hanami::Middleware::BodyParser::BodyParsingError] when the body can't be parsed.
|
31
|
+
#
|
32
|
+
# @since 2.0.1
|
33
|
+
# @api private
|
34
|
+
def parse(*, env)
|
35
|
+
::Rack::Multipart.parse_multipart(env)
|
36
|
+
rescue StandardError => exception
|
37
|
+
raise BodyParsingError.new(exception.message)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -34,6 +34,7 @@ module Hanami
|
|
34
34
|
# Parse raw HTTP request body
|
35
35
|
#
|
36
36
|
# @param body [String] HTTP request body
|
37
|
+
# @param env [Hash] Rack env
|
37
38
|
#
|
38
39
|
# @return [Hash] the result of the parsing
|
39
40
|
#
|
@@ -54,7 +55,7 @@ module Hanami
|
|
54
55
|
# raise Hanami::Middleware::BodyParser::BodyParsingError.new(exception.message)
|
55
56
|
# end
|
56
57
|
# end
|
57
|
-
def parse(body) # rubocop:disable Lint/UnusedMethodArgument
|
58
|
+
def parse(body, env = {}) # rubocop:disable Lint/UnusedMethodArgument
|
58
59
|
raise NoMethodError
|
59
60
|
end
|
60
61
|
end
|
@@ -45,7 +45,7 @@ module Hanami
|
|
45
45
|
env[RACK_INPUT].rewind # somebody might try to read this stream
|
46
46
|
|
47
47
|
if (parser = @parsers[media_type(env)])
|
48
|
-
env[Router::ROUTER_PARSED_BODY] = parser.parse(body)
|
48
|
+
env[Router::ROUTER_PARSED_BODY] = parser.parse(body, env)
|
49
49
|
env[ROUTER_PARAMS] = _symbolize(env[Router::ROUTER_PARSED_BODY])
|
50
50
|
end
|
51
51
|
|
data/lib/hanami/router.rb
CHANGED
@@ -652,10 +652,15 @@ module Hanami
|
|
652
652
|
# @since 2.0.0
|
653
653
|
# @api private
|
654
654
|
def not_allowed(env)
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
655
|
+
http_methods = _not_allowed_fixed(env) || _not_allowed_variable(env)
|
656
|
+
return if http_methods.nil?
|
657
|
+
|
658
|
+
[HTTP_STATUS_NOT_ALLOWED,
|
659
|
+
{
|
660
|
+
::Rack::CONTENT_LENGTH => HTTP_BODY_NOT_ALLOWED_LENGTH,
|
661
|
+
"Allow" => http_methods.join(", ")
|
662
|
+
},
|
663
|
+
[HTTP_BODY_NOT_ALLOWED]]
|
659
664
|
end
|
660
665
|
|
661
666
|
# @since 2.0.0
|
@@ -934,28 +939,32 @@ module Hanami
|
|
934
939
|
# @since 2.0.0
|
935
940
|
# @api private
|
936
941
|
def _not_allowed_fixed(env)
|
937
|
-
found =
|
942
|
+
found = []
|
938
943
|
|
939
|
-
@fixed.
|
940
|
-
|
944
|
+
@fixed.each do |http_method, routes|
|
945
|
+
next if routes.fetch(env[::Rack::PATH_INFO], nil).nil?
|
941
946
|
|
942
|
-
found
|
947
|
+
found << http_method
|
943
948
|
end
|
944
949
|
|
950
|
+
return nil if found.empty?
|
951
|
+
|
945
952
|
found
|
946
953
|
end
|
947
954
|
|
948
955
|
# @since 2.0.0
|
949
956
|
# @api private
|
950
957
|
def _not_allowed_variable(env)
|
951
|
-
found =
|
958
|
+
found = []
|
952
959
|
|
953
|
-
@variable.
|
954
|
-
|
960
|
+
@variable.each do |http_method, routes|
|
961
|
+
next if routes.find(env[::Rack::PATH_INFO]).nil?
|
955
962
|
|
956
|
-
found
|
963
|
+
found << http_method
|
957
964
|
end
|
958
965
|
|
966
|
+
return nil if found.empty?
|
967
|
+
|
959
968
|
found
|
960
969
|
end
|
961
970
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-router
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -30,28 +30,28 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mustermann-contrib
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '3.0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '3.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,6 +157,7 @@ files:
|
|
157
157
|
- lib/hanami/middleware/body_parser.rb
|
158
158
|
- lib/hanami/middleware/body_parser/class_interface.rb
|
159
159
|
- lib/hanami/middleware/body_parser/errors.rb
|
160
|
+
- lib/hanami/middleware/body_parser/form_parser.rb
|
160
161
|
- lib/hanami/middleware/body_parser/json_parser.rb
|
161
162
|
- lib/hanami/middleware/body_parser/parser.rb
|
162
163
|
- lib/hanami/middleware/error.rb
|
@@ -199,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
200
|
- !ruby/object:Gem::Version
|
200
201
|
version: '0'
|
201
202
|
requirements: []
|
202
|
-
rubygems_version: 3.3.
|
203
|
+
rubygems_version: 3.3.3
|
203
204
|
signing_key:
|
204
205
|
specification_version: 4
|
205
206
|
summary: Rack compatible HTTP router for Ruby and Hanami
|