Skip to content

Commit a727f77

Browse files
authored
Merge pull request #373 from ahx/fix-invalid-parameter-encoding
Return 400 if Rack cannot parse query string
2 parents 362eb94 + e7dc0f2 commit a727f77

File tree

5 files changed

+28
-5
lines changed

5 files changed

+28
-5
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
## Unreleased
44

5+
- Return 400 if Rack cannot parse query string instead of raising an exception. Fixes https://github.com/ahx/openapi_first/issues/372
6+
57
## 2.7.3
68

79
- Accept loading OAD documents with numeric status codes. Fixes "Unknown reference" error. https://github.com/ahx/openapi_first/issues/367

Gemfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ PATH
44
openapi_first (2.7.3)
55
hana (~> 1.3)
66
json_schemer (>= 2.1, < 3.0)
7-
openapi_parameters (>= 0.3.3, < 2.0)
7+
openapi_parameters (>= 0.5.1, < 2.0)
88
rack (>= 2.2, < 4.0)
99

1010
GEM
@@ -71,7 +71,7 @@ GEM
7171
racc (~> 1.4)
7272
nokogiri (1.18.8-x86_64-linux-gnu)
7373
racc (~> 1.4)
74-
openapi_parameters (0.5.0)
74+
openapi_parameters (0.5.1)
7575
rack (>= 2.2)
7676
parallel (1.27.0)
7777
parser (3.3.8.0)

lib/openapi_first/request_parser.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,19 @@ def initialize(
2727
def parse(request, route_params:)
2828
ParsedRequest.new(
2929
path: @path_parser&.unpack(route_params),
30-
query: @query_parser&.unpack(request.env[Rack::QUERY_STRING]),
30+
query: parse_query(request.env[Rack::QUERY_STRING]),
3131
headers: @headers_parser&.unpack_env(request.env),
3232
cookies: @cookies_parser&.unpack(request.env[Rack::HTTP_COOKIE]),
3333
body: @body_parsers&.call(request)
3434
)
3535
end
36+
37+
private
38+
39+
def parse_query(query_string)
40+
@query_parser&.unpack(query_string)
41+
rescue OpenapiParameters::InvalidParameterError
42+
Failure.fail!(:invalid_query, message: 'Invalid query parameter.')
43+
end
3644
end
3745
end

openapi_first.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ Gem::Specification.new do |spec|
2525

2626
spec.add_dependency 'hana', '~> 1.3'
2727
spec.add_dependency 'json_schemer', '>= 2.1', '< 3.0'
28-
spec.add_dependency 'openapi_parameters', '>= 0.3.3', '< 2.0'
28+
spec.add_dependency 'openapi_parameters', '>= 0.5.1', '< 2.0'
2929
spec.add_dependency 'rack', '>= 2.2', '< 4.0'
3030
end

spec/middlewares/request_validation/query_parameter_validation_spec.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,20 @@
5252
get '/search', params
5353

5454
expect(last_response.status).to be 400
55-
response_body[:errors][0]
55+
end
56+
57+
it 'returns 400 if query parameter has invalid encoding' do
58+
get '/search?birthdate=%E0%A4%A'
59+
60+
expect(last_response.status).to be 400
61+
expect(response_body[:title]).to eq 'Bad Query Parameter'
62+
end
63+
64+
it 'returns 400 if nested[parameter] has invalid encoding' do
65+
get '/search?filter=%E0%A4%A'
66+
67+
expect(last_response.status).to eq 400
68+
expect(response_body[:title]).to eq 'Bad Query Parameter'
5669
end
5770

5871
it 'returns 400 if query parameter has not valid date-time format' do

0 commit comments

Comments
 (0)