Skip to content

Commit 7c94928

Browse files
committed
Move request mimetype to content_type
1 parent cc95ed0 commit 7c94928

File tree

16 files changed

+52
-45
lines changed

16 files changed

+52
-45
lines changed

Diff for: openapi_core/contrib/aiohttp/requests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,5 @@ def body(self) -> str | None:
4949
return self._body
5050

5151
@property
52-
def mimetype(self) -> str:
52+
def content_type(self) -> str:
5353
return self.request.content_type

Diff for: openapi_core/contrib/django/requests.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,7 @@ def body(self) -> str:
8181
return self.request.body.decode("utf-8")
8282

8383
@property
84-
def mimetype(self) -> str:
85-
return self.request.content_type or ""
84+
def content_type(self) -> str:
85+
content_type = self.request.meta.get("CONTENT_TYPE", "")
86+
assert isinstance(content_type, str)
87+
return content_type

Diff for: openapi_core/contrib/falcon/requests.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ def body(self) -> Optional[str]:
5656
return dumps(getattr(self.request, "json", media))
5757

5858
@property
59-
def mimetype(self) -> str:
59+
def content_type(self) -> str:
6060
if self.request.content_type:
6161
assert isinstance(self.request.content_type, str)
62-
return self.request.content_type.partition(";")[0]
62+
return self.request.content_type
6363

6464
assert isinstance(self.request.options, RequestOptions)
6565
assert isinstance(self.request.options.default_media_type, str)

Diff for: openapi_core/contrib/requests/requests.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ def body(self) -> Optional[str]:
7474
return self.request.body
7575

7676
@property
77-
def mimetype(self) -> str:
77+
def content_type(self) -> str:
7878
# Order matters because all python requests issued from a session
7979
# include Accept */* which does not necessarily match the content type
8080
return str(
8181
self.request.headers.get("Content-Type")
8282
or self.request.headers.get("Accept")
83-
).split(";")[0]
83+
)
8484

8585

8686
class RequestsOpenAPIWebhookRequest(RequestsOpenAPIRequest):

Diff for: openapi_core/contrib/starlette/requests.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ def body(self) -> Optional[str]:
4444
return body
4545

4646
@property
47-
def mimetype(self) -> str:
48-
content_type = self.request.headers.get("Content-Type")
49-
if content_type:
50-
return content_type.partition(";")[0]
51-
52-
return ""
47+
def content_type(self) -> str:
48+
# default value according to RFC 2616
49+
return (
50+
self.request.headers.get("Content-Type")
51+
or "application/octet-stream"
52+
)

Diff for: openapi_core/contrib/werkzeug/requests.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ def body(self) -> Optional[str]:
4343
return self.request.get_data(as_text=True)
4444

4545
@property
46-
def mimetype(self) -> str:
47-
return self.request.mimetype
46+
def content_type(self) -> str:
47+
# default value according to RFC 2616
48+
return self.request.content_type or "application/octet-stream"
4849

4950
def get_path(self, path: str) -> str:
5051
return "".join([self.request.root_path, path])

Diff for: openapi_core/protocols.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def body(self) -> Optional[str]:
2121
...
2222

2323
@property
24-
def mimetype(self) -> str:
24+
def content_type(self) -> str:
2525
...
2626

2727

@@ -48,11 +48,9 @@ class Request(BaseRequest, Protocol):
4848
to write resolved path parameters.
4949
body
5050
The request body, as string.
51-
mimetype
52-
Like content type, but without parameters (eg, without charset,
53-
type etc.) and always lowercase.
54-
For example if the content type is "text/HTML; charset=utf-8"
55-
the mimetype would be "text/html".
51+
content_type
52+
The content type with parameters (eg, charset, boundary etc.)
53+
and always lowercase.
5654
"""
5755

5856
@property

Diff for: openapi_core/testing/requests.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def __init__(
2121
headers: Optional[Dict[str, Any]] = None,
2222
cookies: Optional[Dict[str, Any]] = None,
2323
data: Optional[str] = None,
24-
mimetype: str = "application/json",
24+
content_type: str = "application/json",
2525
):
2626
self.host_url = host_url
2727
self.method = method.lower()
@@ -32,7 +32,7 @@ def __init__(
3232
self.headers = headers
3333
self.cookies = cookies
3434
self.body = data or ""
35-
self.mimetype = mimetype
35+
self.content_type = content_type
3636

3737
self.parameters = RequestParameters(
3838
path=self.view_args or {},

Diff for: openapi_core/unmarshalling/request/unmarshallers.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,9 @@ def _unmarshal(
150150
params_errors = []
151151

152152
try:
153-
body = self._get_body(request.body, request.mimetype, operation)
153+
body = self._get_body(
154+
request.body, request.content_type, operation
155+
)
154156
except MissingRequestBody:
155157
body = None
156158
body_errors = []
@@ -172,7 +174,9 @@ def _unmarshal_body(
172174
self, request: BaseRequest, operation: SchemaPath, path: SchemaPath
173175
) -> RequestUnmarshalResult:
174176
try:
175-
body = self._get_body(request.body, request.mimetype, operation)
177+
body = self._get_body(
178+
request.body, request.content_type, operation
179+
)
176180
except MissingRequestBody:
177181
body = None
178182
errors = []

Diff for: openapi_core/validation/request/validators.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,15 @@ def _iter_errors(
111111
yield from exc.errors
112112

113113
try:
114-
self._get_body(request.body, request.mimetype, operation)
114+
self._get_body(request.body, request.content_type, operation)
115115
except RequestBodyValidationError as exc:
116116
yield exc
117117

118118
def _iter_body_errors(
119119
self, request: BaseRequest, operation: SchemaPath
120120
) -> Iterator[Exception]:
121121
try:
122-
self._get_body(request.body, request.mimetype, operation)
122+
self._get_body(request.body, request.content_type, operation)
123123
except RequestBodyValidationError as exc:
124124
yield exc
125125

Diff for: tests/integration/test_petstore.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ def test_post_pets_raises_invalid_mimetype(self, spec):
10151015
"/pets",
10161016
path_pattern=path_pattern,
10171017
data=data,
1018-
mimetype="text/html",
1018+
content_type="text/html",
10191019
headers=headers,
10201020
cookies=cookies,
10211021
)
@@ -1150,7 +1150,7 @@ def test_post_pets_raises_invalid_server_error(self, spec):
11501150
"/pets",
11511151
path_pattern=path_pattern,
11521152
data=data,
1153-
mimetype="text/html",
1153+
content_type="text/html",
11541154
headers=headers,
11551155
cookies=cookies,
11561156
)

Diff for: tests/integration/unmarshalling/test_request_unmarshaller.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def test_invalid_content_type(self, request_unmarshaller):
186186
"post",
187187
"/v1/pets",
188188
path_pattern="/v1/pets",
189-
mimetype="text/csv",
189+
content_type="text/csv",
190190
data=data,
191191
headers=headers,
192192
cookies=cookies,
@@ -349,7 +349,7 @@ def test_post_pets_plain_no_schema(self, request_unmarshaller):
349349
data=data,
350350
headers=headers,
351351
cookies=cookies,
352-
mimetype="text/plain",
352+
content_type="text/plain",
353353
)
354354

355355
result = request_unmarshaller.unmarshal(request)

Diff for: tests/integration/validation/test_request_validators.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def test_media_type_not_found(self, request_validator):
101101
"post",
102102
"/v1/pets",
103103
path_pattern="/v1/pets",
104-
mimetype="text/csv",
104+
content_type="text/csv",
105105
data=data,
106106
headers=headers,
107107
cookies=cookies,

Diff for: tests/unit/contrib/django/test_django.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def test_no_resolver(self, request_factory):
8484
assert openapi_request.path == request.path
8585
assert openapi_request.path_pattern is None
8686
assert openapi_request.body == ""
87-
assert openapi_request.mimetype == request.content_type
87+
assert openapi_request.content_type == request.content_type
8888

8989
def test_simple(self, request_factory):
9090
from django.urls import resolve
@@ -105,7 +105,7 @@ def test_simple(self, request_factory):
105105
assert openapi_request.path == request.path
106106
assert openapi_request.path_pattern == request.path
107107
assert openapi_request.body == ""
108-
assert openapi_request.mimetype == request.content_type
108+
assert openapi_request.content_type == request.content_type
109109

110110
def test_url_rule(self, request_factory):
111111
from django.urls import resolve
@@ -126,7 +126,7 @@ def test_url_rule(self, request_factory):
126126
assert openapi_request.path == request.path
127127
assert openapi_request.path_pattern == "/admin/auth/group/{object_id}/"
128128
assert openapi_request.body == ""
129-
assert openapi_request.mimetype == request.content_type
129+
assert openapi_request.content_type == request.content_type
130130

131131
def test_url_regexp_pattern(self, request_factory):
132132
from django.urls import resolve
@@ -147,7 +147,7 @@ def test_url_regexp_pattern(self, request_factory):
147147
assert openapi_request.path == request.path
148148
assert openapi_request.path_pattern == request.path
149149
assert openapi_request.body == ""
150-
assert openapi_request.mimetype == request.content_type
150+
assert openapi_request.content_type == request.content_type
151151

152152
def test_drf_default_value_pattern(self, request_factory):
153153
from django.urls import resolve
@@ -168,7 +168,7 @@ def test_drf_default_value_pattern(self, request_factory):
168168
assert openapi_request.path == request.path
169169
assert openapi_request.path_pattern == "/object/{pk}/action/"
170170
assert openapi_request.body == ""
171-
assert openapi_request.mimetype == request.content_type
171+
assert openapi_request.content_type == request.content_type
172172

173173

174174
class TestDjangoOpenAPIResponse(BaseTestDjango):

Diff for: tests/unit/contrib/flask/test_flask_requests.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def test_simple(self, request_factory, request):
3232
assert openapi_request.host_url == request.host_url
3333
assert openapi_request.path == request.path
3434
assert openapi_request.body == ""
35-
assert openapi_request.mimetype == request.mimetype
35+
assert openapi_request.content_type == "application/octet-stream"
3636

3737
def test_multiple_values(self, request_factory, request):
3838
request = request_factory(
@@ -60,7 +60,7 @@ def test_multiple_values(self, request_factory, request):
6060
assert openapi_request.host_url == request.host_url
6161
assert openapi_request.path == request.path
6262
assert openapi_request.body == ""
63-
assert openapi_request.mimetype == request.mimetype
63+
assert openapi_request.content_type == "application/octet-stream"
6464

6565
def test_url_rule(self, request_factory, request):
6666
request = request_factory("GET", "/browse/12/", subdomain="kb")
@@ -82,4 +82,4 @@ def test_url_rule(self, request_factory, request):
8282
assert openapi_request.path == request.path
8383
assert openapi_request.path_pattern == "/browse/{id}/"
8484
assert openapi_request.body == ""
85-
assert openapi_request.mimetype == request.mimetype
85+
assert openapi_request.content_type == "application/octet-stream"

Diff for: tests/unit/contrib/requests/test_requests_requests.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def test_simple(self, request_factory, request):
3131
assert openapi_request.host_url == "http://localhost"
3232
assert openapi_request.path == "/"
3333
assert openapi_request.body == prepared.body
34-
assert openapi_request.mimetype == "application/json"
34+
assert openapi_request.content_type == "application/json"
3535

3636
def test_multiple_values(self, request_factory, request):
3737
request = request_factory(
@@ -60,7 +60,7 @@ def test_multiple_values(self, request_factory, request):
6060
assert openapi_request.host_url == "http://localhost"
6161
assert openapi_request.path == "/"
6262
assert openapi_request.body == prepared.body
63-
assert openapi_request.mimetype == "application/json"
63+
assert openapi_request.content_type == "application/json"
6464

6565
def test_url_rule(self, request_factory, request):
6666
request = request_factory("GET", "/browse/12/", subdomain="kb")
@@ -87,7 +87,7 @@ def test_url_rule(self, request_factory, request):
8787
assert openapi_request.host_url == "http://localhost"
8888
assert openapi_request.path == "/browse/12/"
8989
assert openapi_request.body == prepared.body
90-
assert openapi_request.mimetype == "application/json"
90+
assert openapi_request.content_type == "application/json"
9191

9292
def test_hash_param(self, request_factory, request):
9393
request = request_factory("GET", "/browse/#12", subdomain="kb")
@@ -114,7 +114,7 @@ def test_hash_param(self, request_factory, request):
114114
assert openapi_request.host_url == "http://localhost"
115115
assert openapi_request.path == "/browse/#12"
116116
assert openapi_request.body == prepared.body
117-
assert openapi_request.mimetype == "application/json"
117+
assert openapi_request.content_type == "application/json"
118118

119119
def test_content_type_with_charset(self, request_factory, request):
120120
request = request_factory(
@@ -141,4 +141,6 @@ def test_content_type_with_charset(self, request_factory, request):
141141
assert openapi_request.host_url == "http://localhost"
142142
assert openapi_request.path == "/"
143143
assert openapi_request.body == prepared.body
144-
assert openapi_request.mimetype == "application/json"
144+
assert (
145+
openapi_request.content_type == "application/json; charset=utf-8"
146+
)

0 commit comments

Comments
 (0)