Skip to content

Commit 46a5dce

Browse files
committed
Keep empty values when deserializing application/x-www-form-urlencoded
Signed-off-by: Anders Kaseorg <[email protected]>
1 parent 3143d4f commit 46a5dce

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

openapi_core/deserializing/media_types/util.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ def urlencoded_form_loads(
4444
value: bytes, **parameters: str
4545
) -> Mapping[str, Any]:
4646
# only UTF-8 is conforming
47-
return ImmutableMultiDict(parse_qsl(value.decode("utf-8")))
47+
return ImmutableMultiDict(
48+
parse_qsl(value.decode("utf-8"), keep_blank_values=True)
49+
)
4850

4951

5052
def data_form_loads(value: bytes, **parameters: str) -> Mapping[str, Any]:

tests/unit/deserializing/test_media_types_deserializers.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,24 @@ def test_urlencoded_form_empty(self, deserializer_factory):
201201

202202
assert result == {}
203203

204+
def test_urlencoded_form_empty_value(self, deserializer_factory):
205+
mimetype = "application/x-www-form-urlencoded"
206+
schema_dict = {
207+
"type": "object",
208+
"properties": {
209+
"name": {
210+
"type": "string",
211+
},
212+
},
213+
}
214+
schema = SchemaPath.from_dict(schema_dict)
215+
deserializer = deserializer_factory(mimetype, schema=schema)
216+
value = b"name="
217+
218+
result = deserializer.deserialize(value)
219+
220+
assert result == {"name": ""}
221+
204222
def test_urlencoded_form_simple(self, deserializer_factory):
205223
mimetype = "application/x-www-form-urlencoded"
206224
schema_dict = {

0 commit comments

Comments
 (0)