Skip to content

Commit c23f9fe

Browse files
authored
Merge pull request #316 from BontaVlad/bugfix-311-falcon-get-media-error
Bugfix 311 falcon get media error
2 parents 419a71a + 74d49d1 commit c23f9fe

File tree

7 files changed

+41
-9
lines changed

7 files changed

+41
-9
lines changed

openapi_core/contrib/falcon/compat.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""OpenAPI core contrib falcon compat module"""
2+
try:
3+
from falcon import App # noqa: F401
4+
HAS_FALCON3 = True
5+
except ImportError:
6+
HAS_FALCON3 = False
7+
8+
9+
def get_request_media(req, default=None):
10+
# in falcon 3 media is deprecated
11+
return req.get_media(default_when_empty=default) if HAS_FALCON3 else \
12+
(req.media if req.media else default)
13+
14+
15+
def get_response_text(resp):
16+
# in falcon 3 body is deprecated
17+
return getattr(resp, 'text') if HAS_FALCON3 else \
18+
getattr(resp, 'body')
19+
20+
21+
def set_response_text(resp, text):
22+
# in falcon 3 body is deprecated
23+
setattr(resp, 'text', text) if HAS_FALCON3 else \
24+
setattr(resp, 'body', text)

openapi_core/contrib/falcon/handlers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from falcon.status_codes import (
66
HTTP_400, HTTP_404, HTTP_405, HTTP_415,
77
)
8+
9+
from openapi_core.contrib.falcon.compat import set_response_text
810
from openapi_core.templating.media_types.exceptions import MediaTypeNotFound
911
from openapi_core.templating.paths.exceptions import (
1012
ServerNotFound, OperationNotFound, PathNotFound,
@@ -36,11 +38,12 @@ def handle(cls, req, resp, errors):
3638
data = {
3739
'errors': data_errors,
3840
}
41+
data_str = dumps(data)
3942
data_error_max = max(data_errors, key=lambda x: x['status'])
4043
resp.content_type = MEDIA_JSON
4144
resp.status = cls.FALCON_STATUS_CODES.get(
4245
data_error_max['status'], HTTP_400)
43-
resp.body = dumps(data)
46+
set_response_text(resp, data_str)
4447
resp.complete = True
4548

4649
@classmethod

openapi_core/contrib/falcon/requests.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from werkzeug.datastructures import ImmutableMultiDict
55

6+
from openapi_core.contrib.falcon.compat import get_request_media
67
from openapi_core.validation.request.datatypes import (
78
OpenAPIRequest, RequestParameters,
89
)
@@ -11,19 +12,20 @@
1112
class FalconOpenAPIRequestFactory:
1213

1314
@classmethod
14-
def create(cls, request):
15+
def create(cls, request, default_when_empty={}):
1516
"""
1617
Create OpenAPIRequest from falcon Request and route params.
1718
"""
19+
default = default_when_empty
1820
method = request.method.lower()
1921

2022
# gets deduced by path finder against spec
2123
path = {}
2224

25+
media = get_request_media(request, default=default)
2326
# Support falcon-jsonify.
2427
body = (
25-
dumps(request.json) if getattr(request, "json", None)
26-
else dumps(request.media)
28+
dumps(getattr(request, "json", media))
2729
)
2830
mimetype = request.options.default_media_type
2931
if request.content_type:

openapi_core/contrib/falcon/responses.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""OpenAPI core contrib falcon responses module"""
2+
from openapi_core.contrib.falcon.compat import get_response_text
23
from openapi_core.validation.response.datatypes import OpenAPIResponse
34

45

@@ -13,8 +14,10 @@ def create(cls, response):
1314
else:
1415
mimetype = response.options.default_media_type
1516

17+
data = get_response_text(response)
18+
1619
return OpenAPIResponse(
17-
data=response.body,
20+
data=data,
1821
status_code=status_code,
1922
mimetype=mimetype,
2023
)

requirements_dev.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ mock==2.0.0
22
pytest==3.5.0
33
pytest-flake8
44
pytest-cov==2.5.1
5-
falcon==2.0.0
5+
falcon==2.0.0; python_version<"3.0"
6+
falcon==3.0.0; python_version>="3.0"
67
flask
78
django==2.2.18; python_version>="3.0"
89
requests==2.22.0

tests/integration/contrib/falcon/conftest.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ def create_request(
3333
options = RequestOptions()
3434
# return create_req(options=options, **environ)
3535
req = Request(environ, options)
36-
resource, method_map, params, req.uri_template = router.find(path, req)
3736
return req
3837
return create_request
3938

tests/integration/contrib/falcon/test_falcon_middlewares.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from json import dumps
22

3-
from falcon import API
3+
from falcon import API as App
44
from falcon.testing import TestClient
55
import pytest
66

@@ -24,7 +24,7 @@ def middleware(self, spec):
2424

2525
@pytest.fixture
2626
def app(self, middleware):
27-
return API(middleware=[middleware])
27+
return App(middleware=[middleware])
2828

2929
@pytest.yield_fixture
3030
def client(self, app):

0 commit comments

Comments
 (0)