Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve JSON req error on disallowed empty body #1761

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions connexion/validators/form_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,13 @@ async def _parse(self, stream: t.AsyncGenerator[bytes, None], scope: Scope) -> d

return data

def _validate(self, data: dict) -> None:
def _validate(self, body: t.Any) -> t.Optional[dict]: # type: ignore[return]
if not isinstance(body, dict):
raise BadRequestProblem("Parsed body must be a mapping")
if self._strict_validation:
self._validate_params_strictly(data)

self._validate_params_strictly(body)
try:
self._validator.validate(data)
self._validator.validate(body)
except ValidationError as exception:
error_path_msg = format_error_with_path(exception=exception)
logger.error(
Expand Down
4 changes: 3 additions & 1 deletion connexion/validators/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ async def _parse(
except json.decoder.JSONDecodeError as e:
raise BadRequestProblem(detail=str(e))

def _validate(self, body: dict) -> None:
def _validate(self, body: t.Any) -> t.Optional[dict]:
if not self._nullable and body is None:
raise BadRequestProblem("Request body must not be empty")
try:
return self._validator.validate(body)
except ValidationError as exception:
Expand Down
7 changes: 7 additions & 0 deletions tests/api/test_errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,10 @@ def test_errors(problem_app):
"Invalid Content-type (text/html)"
)
assert unsupported_media_type_body["status"] == 415


def test_should_raise_400_for_no_json(simple_app):
app_client = simple_app.test_client()
response = app_client.post("/v1.0/test-empty-object-body")
assert response.status_code == 400
assert response.json()["detail"] == "Request body must not be empty"
Loading