Skip to content

Commit cdc8af1

Browse files
fix: don't interpret simple parameter as deepObject (#1570)
* fix: don't interpret simple parameter as deepObject * Fix flake8 issues Co-authored-by: Robbe Sneyders <[email protected]>
1 parent 620306a commit cdc8af1

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

connexion/decorators/uri_parsing.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ def _make_deep_object(self, k, v):
201201
if k == root_key:
202202
return k, v, False
203203

204+
if not self._is_deep_object_style_param(root_key):
205+
return k, v, False
206+
204207
key_path = re.findall(r'\[([^\[\]]*)\]', k)
205208
root = prev = node = {}
206209
for k in key_path:
@@ -210,6 +213,11 @@ def _make_deep_object(self, k, v):
210213
prev[k] = v[0]
211214
return root_key, [root], True
212215

216+
def _is_deep_object_style_param(self, param_name):
217+
default_style = self.style_defaults["query"]
218+
style = self.param_defns.get(param_name, {}).get('style', default_style)
219+
return style == "deepObject"
220+
213221
def _preprocess_deep_objects(self, query_data):
214222
""" deep objects provide a way of rendering nested objects using query
215223
parameters.

tests/decorators/test_uri_parsing.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,3 +168,31 @@ class Request:
168168
p = parser_class(parameters, body_defn)
169169
res = p(lambda x: x)(request)
170170
assert res.query["letters_eq"] == expected
171+
172+
173+
@pytest.mark.parametrize("parser_class, query_in, collection_format, explode, expected", [
174+
(OpenAPIURIParser, MultiDict([("letters[eq]_unrelated", "a")]), None, False,{"letters[eq]_unrelated": ["a"]}),
175+
(OpenAPIURIParser, MultiDict([("letters[eq][unrelated]", "a")]), "csv", True,{"letters[eq][unrelated]": ["a"]}),
176+
])
177+
def test_uri_parser_query_params_with_malformed_names(parser_class, query_in, collection_format, explode, expected):
178+
class Request:
179+
query = query_in
180+
path_params = {}
181+
form = {}
182+
183+
request = Request()
184+
parameters = [
185+
{"name": "letters[eq]",
186+
"in": "query",
187+
"explode": explode,
188+
"collectionFormat": collection_format,
189+
"schema": {
190+
"type": "array",
191+
"items": {"type": "string"},
192+
}
193+
}
194+
]
195+
body_defn = {}
196+
p = parser_class(parameters, body_defn)
197+
res = p(lambda x: x)(request)
198+
assert res.query == expected

0 commit comments

Comments
 (0)