Skip to content

Commit 5f62c62

Browse files
committed
deserialize data form media type py27
1 parent 852c081 commit 5f62c62

File tree

2 files changed

+18
-30
lines changed

2 files changed

+18
-30
lines changed

openapi_core/deserializing/media_types/util.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from email.parser import BytesParser
1+
from email.parser import Parser
22
from json import loads
33

44
from six import binary_type
@@ -17,10 +17,10 @@ def urlencoded_form_loads(value):
1717

1818

1919
def data_form_loads(value):
20-
if issubclass(type(value), str):
21-
value = value.encode()
22-
parser = BytesParser()
23-
parts = parser.parsebytes(value)
20+
if issubclass(type(value), binary_type):
21+
value = value.decode('ASCII', errors='surrogateescape')
22+
parser = Parser()
23+
parts = parser.parsestr(value, headersonly=False)
2424
return dict(
2525
(
2626
part.get_param('name', header='content-disposition'),

tests/unit/deserializing/test_media_types_deserializers.py

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,14 @@
1-
from email.mime.multipart import MIMEMultipart
2-
from email.mime.nonmultipart import MIMENonMultipart
3-
41
import pytest
52

3+
from six import b, u
4+
65
from openapi_core.deserializing.exceptions import DeserializeError
76
from openapi_core.deserializing.media_types.factories import (
87
MediaTypeDeserializersFactory,
98
)
109
from openapi_core.schema.media_types.models import MediaType
1110

1211

13-
class MIMEFormdata(MIMENonMultipart):
14-
def __init__(self, keyname, *args, **kwargs):
15-
super(MIMEFormdata, self).__init__(*args, **kwargs)
16-
self.add_header(
17-
"Content-Disposition", "form-data; name=\"%s\"" % keyname)
18-
19-
20-
def encode_multipart_formdata(fields):
21-
m = MIMEMultipart("form-data")
22-
23-
for field, value in fields.items():
24-
data = MIMEFormdata(field, "text", "plain")
25-
data.set_payload(value)
26-
m.attach(data)
27-
28-
return m
29-
30-
3112
class TestMediaTypeDeserializer(object):
3213

3314
@pytest.fixture
@@ -68,7 +49,7 @@ def test_urlencoded_form_simple(self, deserializer_factory):
6849

6950
assert result == {'param1': 'test'}
7051

71-
@pytest.mark.parametrize('value', [b'', ''])
52+
@pytest.mark.parametrize('value', [b(''), u('')])
7253
def test_data_form_empty(self, deserializer_factory, value):
7354
media_type = MediaType('multipart/form-data')
7455

@@ -78,12 +59,19 @@ def test_data_form_empty(self, deserializer_factory, value):
7859

7960
def test_data_form_simple(self, deserializer_factory):
8061
media_type = MediaType('multipart/form-data')
81-
formdata = encode_multipart_formdata({'param1': 'test'})
82-
value = str(formdata)
62+
value = b(
63+
'Content-Type: multipart/form-data; boundary="'
64+
'===============2872712225071193122=="\n'
65+
'MIME-Version: 1.0\n\n'
66+
'--===============2872712225071193122==\n'
67+
'Content-Type: text/plain\nMIME-Version: 1.0\n'
68+
'Content-Disposition: form-data; name="param1"\n\ntest\n'
69+
'--===============2872712225071193122==--\n'
70+
)
8371

8472
result = deserializer_factory(media_type)(value)
8573

86-
assert result == {'param1': b'test'}
74+
assert result == {'param1': b('test')}
8775

8876
def test_custom_simple(self, deserializer_factory):
8977
custom_mimetype = 'application/custom'

0 commit comments

Comments
 (0)