diff --git a/lib/committee/schema_validator/open_api_3/parameter_deserializer.rb b/lib/committee/schema_validator/open_api_3/parameter_deserializer.rb index 99eacb32..ecd803dd 100644 --- a/lib/committee/schema_validator/open_api_3/parameter_deserializer.rb +++ b/lib/committee/schema_validator/open_api_3/parameter_deserializer.rb @@ -34,6 +34,11 @@ def deserialize_path_params(raw_params) # @param [Hash] raw_headers Raw headers # @return [Hash] Deserialized headers according to OpenAPI schema def deserialize_headers(raw_headers) + return raw_headers if raw_headers.nil? || raw_headers.empty? + + raw_headers = raw_headers.transform_keys do |name| + @parameters.find { |param| param.in == 'header' && param.name.casecmp?(name.to_s) }&.name || name + end deserialize_params_by_location(raw_headers, 'header') end diff --git a/test/middleware/request_validation_open_api_3_test.rb b/test/middleware/request_validation_open_api_3_test.rb index 5a60c20e..cfabb60d 100644 --- a/test/middleware/request_validation_open_api_3_test.rb +++ b/test/middleware/request_validation_open_api_3_test.rb @@ -550,6 +550,22 @@ def app end end + it 'deserializes header arrays regardless of the case used in the schema' do + parameter = { 'name' => 'X-Ids', 'in' => 'header', 'required' => true, 'schema' => { 'type' => 'array', 'items' => { 'type' => 'integer' } }, } + check_parameter = lambda { |env| + assert_equal [1, 2], env['committee.headers']['X-Ids'] + refute env['committee.headers'].key?('X-IDS') + assert_equal '1,2', env['HTTP_X_IDS'] + [200, {}, []] + } + @app = new_rack_app_with_lambda(check_parameter, schema: query_param_schema(parameter)) + + header 'X-Ids', '1,2' + get '/events' + + assert_equal 200, last_response.status + end + describe ':accept_request_filter' do [ { description: 'when not specified, includes everything', accept_request_filter: nil, expected: { status: 400 } }, diff --git a/test/schema_validator/open_api_3/parameter_deserializer_test.rb b/test/schema_validator/open_api_3/parameter_deserializer_test.rb index fa5cb227..79dd6c69 100644 --- a/test/schema_validator/open_api_3/parameter_deserializer_test.rb +++ b/test/schema_validator/open_api_3/parameter_deserializer_test.rb @@ -210,6 +210,17 @@ assert_equal({ 'X-Filter' => { 'role' => 'admin', 'status' => 'active' } }, result) end + it 'matches header names without regard to case' do + raw_headers = { 'x-filter' => 'role,admin,status,active', 'X-Other' => 'untouched' } + param = create_param('X-Filter', 'header', 'simple', false, 'object', { 'role' => 'string', 'status' => 'string' }) + deserializer = create_deserializer([param]) + + result = deserializer.deserialize_headers(raw_headers) + + assert_equal({ 'X-Filter' => { 'role' => 'admin', 'status' => 'active' }, 'X-Other' => 'untouched' }, result) + assert_equal 'role,admin,status,active', raw_headers['x-filter'] + end + it 'handles empty params gracefully' do raw_params = {} param = create_param('filter', 'query', 'form', true, 'object', { 'role' => 'string' })