Skip to content

Commit

Permalink
fix: don't interpret simple parameter as deepObject
Browse files Browse the repository at this point in the history
  • Loading branch information
fgreinacher committed Aug 2, 2022
1 parent 1ce3e2e commit 10b021d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
8 changes: 8 additions & 0 deletions connexion/decorators/uri_parsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,9 @@ def _make_deep_object(self, k, v):
if k == root_key:
return k, v, False

if not self._is_deep_object_style_param(root_key):
return k, v, False

key_path = re.findall(r'\[([^\[\]]*)\]', k)
root = prev = node = {}
for k in key_path:
Expand All @@ -209,6 +212,11 @@ def _make_deep_object(self, k, v):
node = node[k]
prev[k] = v[0]
return root_key, [root], True

def _is_deep_object_style_param(self, param_name):
default_style = self.style_defaults["query"]
style = self.param_defns.get(param_name, {}).get('style', default_style)
return style == "deepObject"

def _preprocess_deep_objects(self, query_data):
""" deep objects provide a way of rendering nested objects using query
Expand Down
28 changes: 28 additions & 0 deletions tests/decorators/test_uri_parsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,3 +168,31 @@ class Request:
p = parser_class(parameters, body_defn)
res = p(lambda x: x)(request)
assert res.query["letters_eq"] == expected


@pytest.mark.parametrize("parser_class, query_in, collection_format, explode, expected", [
(OpenAPIURIParser, MultiDict([("letters[eq]_unrelated", "a")]), None, False,{"letters[eq]_unrelated": ["a"]}),
(OpenAPIURIParser, MultiDict([("letters[eq][unrelated]", "a")]), "csv", True,{"letters[eq][unrelated]": ["a"]}),
])
def test_uri_parser_query_params_with_malformed_names(parser_class, query_in, collection_format, explode, expected):
class Request:
query = query_in
path_params = {}
form = {}

request = Request()
parameters = [
{"name": "letters[eq]",
"in": "query",
"explode": explode,
"collectionFormat": collection_format,
"schema": {
"type": "array",
"items": {"type": "string"},
}
}
]
body_defn = {}
p = parser_class(parameters, body_defn)
res = p(lambda x: x)(request)
assert res.query == expected

0 comments on commit 10b021d

Please sign in to comment.