Skip to content

Commit d490d57

Browse files
author
Gerhard Weis
committed
fix path parameter validation when overridden on operation
1 parent a8248a5 commit d490d57

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

openapi_core/validation/request/validators.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""OpenAPI core validation request validators module"""
2+
from itertools import chain
23
from six import iteritems
34

45
from openapi_core.schema.exceptions import OpenAPIMappingError
@@ -28,30 +29,34 @@ def validate(self, request):
2829

2930
try:
3031
path = self.spec[operation_pattern]
31-
# don't process if operation errors
32-
except OpenAPIMappingError as exc:
33-
return RequestValidationResult([exc, ], None, None)
34-
35-
path_params, path_params_errors = self._get_parameters(request, path)
36-
37-
try:
3832
operation = self.spec.get_operation(
3933
operation_pattern, request.method)
4034
# don't process if operation errors
4135
except OpenAPIMappingError as exc:
4236
return RequestValidationResult([exc, ], None, None)
4337

44-
op_params, op_params_errors = self._get_parameters(request, operation)
38+
params, params_errors = self._get_parameters(
39+
request, chain(
40+
iteritems(operation.parameters),
41+
iteritems(path.parameters)
42+
)
43+
)
44+
4545
body, body_errors = self._get_body(request, operation)
4646

47-
errors = path_params_errors + op_params_errors + body_errors
48-
return RequestValidationResult(errors, body, path_params + op_params)
47+
errors = params_errors + body_errors
48+
return RequestValidationResult(errors, body, params)
4949

50-
def _get_parameters(self, request, operation):
50+
def _get_parameters(self, request, params):
5151
errors = []
52-
52+
seen = set()
5353
parameters = RequestParameters()
54-
for param_name, param in iteritems(operation.parameters):
54+
for param_name, param in params:
55+
if (param_name, param.location.value) in seen:
56+
# skip parameter already seen
57+
# e.g. overriden path item paremeter on operation
58+
continue
59+
seen.add((param_name, param.location.value))
5560
try:
5661
raw_value = param.get_value(request)
5762
except MissingParameter:

tests/integration/test_validators.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,6 @@ def test_request_valid_param(self, validator):
305305
assert result.body is None
306306
assert result.parameters == {'query': {'resId': 10}}
307307

308-
@pytest.mark.xfail
309308
def test_request_override_param(self, spec_dict):
310309
# override parameter path parameter on operation
311310
# (name and in property must match)

0 commit comments

Comments
 (0)