From 9e8f501558e05678e8e05c321466c95d73f36cb8 Mon Sep 17 00:00:00 2001 From: Rafael Gibim <9031589+Drowze@users.noreply.github.com> Date: Wed, 20 May 2026 16:57:50 -0300 Subject: [PATCH] Fix parsing of JSON-formatted query params --- lib/openapi_first/builder.rb | 6 +++++- spec/data/query-parameter-validation.yaml | 13 +++++++++++++ .../query_parameter_validation_spec.rb | 8 ++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/openapi_first/builder.rb b/lib/openapi_first/builder.rb index cddd529f..e6cc1c5f 100644 --- a/lib/openapi_first/builder.rb +++ b/lib/openapi_first/builder.rb @@ -110,7 +110,11 @@ def parse_parameters(parameters) def resolve_parameters(parameters) parameters&.map do |parameter| result = parameter.resolved - result['schema'] = parameter['schema'].resolved + result['schema'] = if parameter['content'] && parameter['content']['application/json'] + parameter['content']['application/json']['schema'].resolved + else + parameter['schema'].resolved + end result end.to_a end diff --git a/spec/data/query-parameter-validation.yaml b/spec/data/query-parameter-validation.yaml index 50ad31cd..94b764c6 100644 --- a/spec/data/query-parameter-validation.yaml +++ b/spec/data/query-parameter-validation.yaml @@ -22,6 +22,19 @@ paths: schema: type: string - $ref: './components/parameters/filter.yaml' + - name: json_filter + in: query + description: Filter results + example: '{"tag": "foo"}' + content: + application/json: + schema: + type: object + properties: + tag: + type: string + other: + type: object - name: limit in: query description: How many items to return at one time (max 100) diff --git a/spec/middlewares/request_validation/query_parameter_validation_spec.rb b/spec/middlewares/request_validation/query_parameter_validation_spec.rb index 8b850f9d..951f4cc0 100644 --- a/spec/middlewares/request_validation/query_parameter_validation_spec.rb +++ b/spec/middlewares/request_validation/query_parameter_validation_spec.rb @@ -349,6 +349,14 @@ def last_params expect(last_response.status).to eq(200), last_response.body expect(last_params.dig('filter', 'id')).to eq 100 end + + it 'converts JSON encoded params' do + get '/search', params.merge(json_filter: { tag: 'dogs' }.to_json) + expect(last_response.status).to eq(200), last_response.body + + get '/search', params.merge(json_filter: { tag: true }.to_json) + expect(last_response.status).to eq(400), last_response.body + end end end end