Skip to content

Commit 6f1cfc0

Browse files
committed
Scope JSON parameter parser errors
1 parent 91fb9df commit 6f1cfc0

2 files changed

Lines changed: 34 additions & 8 deletions

File tree

‎lib/flipper/api/json_params.rb‎

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,18 @@ def update_params(env, data, strict:)
6565
raise InvalidRequestBody unless parsed_request_body.is_a?(Hash)
6666
raise InvalidRequestBody unless ParameterParsing.valid_encoding?(parsed_request_body)
6767

68-
query_params = parse_nested_query(env[QUERY_STRING].to_s)
68+
query_params = parse_nested_query(env[QUERY_STRING].to_s, strict: strict)
6969
unless compatible_parameter_shapes?(query_params, parsed_request_body)
7070
raise InvalidRequestBody
7171
end
7272
end
7373

7474
env["parsed_request_body".freeze] = parsed_request_body
75-
parsed_query_string = parse_query(env[QUERY_STRING].to_s)
75+
parsed_query_string = parse_query_string(env[QUERY_STRING].to_s, strict: strict)
7676
parsed_query_string.merge!(parsed_request_body)
77-
env[QUERY_STRING] = build_query(parsed_query_string)
77+
env[QUERY_STRING] = build_query_string(parsed_query_string, strict: strict)
7878
env.delete('rack.request.query_hash'.freeze)
7979
env.delete('rack.request.query_string'.freeze)
80-
rescue *ParameterParsing.errors
81-
raise InvalidRequestBody if strict
82-
83-
raise
8480
end
8581

8682
def parse_json_body(data, strict:)
@@ -91,8 +87,28 @@ def parse_json_body(data, strict:)
9187
raise
9288
end
9389

94-
def parse_nested_query(data)
90+
def parse_nested_query(data, strict:)
9591
ParameterParsing.parse_nested_query(data)
92+
rescue *ParameterParsing.errors
93+
raise InvalidRequestBody if strict
94+
95+
raise
96+
end
97+
98+
def parse_query_string(data, strict:)
99+
parse_query(data)
100+
rescue *ParameterParsing.errors
101+
raise InvalidRequestBody if strict
102+
103+
raise
104+
end
105+
106+
def build_query_string(params, strict:)
107+
build_query(params)
108+
rescue *ParameterParsing.errors
109+
raise InvalidRequestBody if strict
110+
111+
raise
96112
end
97113

98114
def compatible_parameter_shapes?(left, right)

‎spec/flipper/api/mutation_input_spec.rb‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,16 @@
359359
expect(adapter_state).to eq(baseline_state)
360360
end
361361

362+
it 'does not classify JSON decoder range errors as client errors' do
363+
allow(Flipper::Typecast).to receive(:from_json).and_raise(RangeError, 'decoder failure')
364+
365+
expect do
366+
post '/features', JSON.generate(name: 'unreachable'), 'CONTENT_TYPE' => 'application/json'
367+
end.to raise_error(RangeError, 'decoder failure')
368+
369+
expect(adapter_state).to eq(baseline_state)
370+
end
371+
362372
it 'does not classify form input stream range errors as client errors' do
363373
env = Rack::MockRequest.env_for(
364374
'/features',

0 commit comments

Comments
 (0)