Skip to content

Commit 9b9e5d3

Browse files
committed
Fix the Falcon integration to properly handle URLs with query strings.
Bring main README up to date for current falcon
1 parent 753637d commit 9b9e5d3

File tree

4 files changed

+23
-7
lines changed

4 files changed

+23
-7
lines changed

README.rst

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,9 @@ For Falcon you can use FalconOpenAPIRequest a Falcon request factory:
260260
.. code-block:: python
261261
262262
from openapi_core.validation.request.validators import RequestValidator
263-
from openapi_core.contrib.falcon import FalconOpenAPIRequest
263+
from openapi_core.contrib.falcon import FalconOpenAPIRequestFactory
264264
265-
openapi_request = FalconOpenAPIRequest(falcon_request)
265+
openapi_request = FalconOpenAPIRequestFactory.create(falcon_request)
266266
validator = RequestValidator(spec)
267267
result = validator.validate(openapi_request)
268268
@@ -271,9 +271,9 @@ You can use FalconOpenAPIResponse as a Falcon response factory:
271271
.. code-block:: python
272272
273273
from openapi_core.validation.response.validators import ResponseValidator
274-
from openapi_core.contrib.falcon import FalconOpenAPIResponse
274+
from openapi_core.contrib.falcon import FalconOpenAPIResponseFactory
275275
276-
openapi_response = FalconOpenAPIResponse(falcon_response)
276+
openapi_response = FalconOpenAPIResponseFactory.create(falcon_response)
277277
validator = ResponseValidator(spec)
278278
result = validator.validate(openapi_request, openapi_response)
279279

openapi_core/contrib/falcon/requests.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def create(cls, request):
2323
# Support falcon-jsonify.
2424
body = (
2525
dumps(request.json) if getattr(request, "json", None)
26-
else request.bounded_stream.read()
26+
else dumps(request.media)
2727
)
2828
mimetype = request.options.default_media_type
2929
if request.content_type:
@@ -36,8 +36,9 @@ def create(cls, request):
3636
cookie=request.cookies,
3737
path=path,
3838
)
39+
url_pattern = request.prefix + request.path
3940
return OpenAPIRequest(
40-
full_url_pattern=request.url,
41+
full_url_pattern=url_pattern,
4142
method=method,
4243
parameters=parameters,
4344
body=body,

tests/integration/contrib/falcon/data/v3.0/falcon_factory.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,18 @@ paths:
1313
description: the ID of the resource to retrieve
1414
schema:
1515
type: integer
16+
- name: detail_level
17+
in: query
18+
required: false
19+
description: optional level of detail to provide
20+
schema:
21+
type: integer
1622
get:
1723
responses:
1824
200:
1925
description: Return the resource.
2026
content:
21-
application/json:
27+
application/json:
2228
schema:
2329
type: object
2430
required:

tests/integration/contrib/falcon/test_falcon_validation.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,12 @@ def test_request_validator_path_pattern(self, spec, request_factory):
3232
openapi_request = FalconOpenAPIRequestFactory.create(request)
3333
result = validator.validate(openapi_request)
3434
assert not result.errors
35+
36+
def test_request_validator_with_query(self, spec, request_factory):
37+
validator = RequestValidator(spec)
38+
request = request_factory('GET', '/browse/12',
39+
query_string='detail_level=2',
40+
subdomain='kb')
41+
openapi_request = FalconOpenAPIRequestFactory.create(request)
42+
result = validator.validate(openapi_request)
43+
assert not result.errors

0 commit comments

Comments
 (0)