]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
✨ Add better JSON decode error handling, improve feedback for client after invalid...
authorAviram Hassan <41201924+aviramha@users.noreply.github.com>
Sat, 13 Jun 2020 12:33:27 +0000 (15:33 +0300)
committerGitHub <noreply@github.com>
Sat, 13 Jun 2020 12:33:27 +0000 (14:33 +0200)
* Request body error, raise RequestValidationError instead of HTTPException in case JSON decode failure

* add missing test case for body general exception

fastapi/routing.py
tests/test_tutorial/test_body/test_tutorial001.py

index b4560a8a4c75a52fe05b8ec7d8551631d427c02d..16eb7ab0b4a3b64db58a493db764198f4f8b613a 100644 (file)
@@ -1,5 +1,6 @@
 import asyncio
 import inspect
+import json
 from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Type, Union
 
 from fastapi import params
@@ -177,6 +178,8 @@ def get_request_handler(
                     body_bytes = await request.body()
                     if body_bytes:
                         body = await request.json()
+        except json.JSONDecodeError as e:
+            raise RequestValidationError([ErrorWrapper(e, ("body", e.pos))], body=e.doc)
         except Exception as e:
             raise HTTPException(
                 status_code=400, detail="There was an error parsing the body"
index 293981a09d8f4c825b400b3ec51140de670650f9..806e712dc31085fa924422152d15fe0f075ef91d 100644 (file)
@@ -1,3 +1,5 @@
+from unittest.mock import patch
+
 import pytest
 from fastapi.testclient import TestClient
 
@@ -176,5 +178,24 @@ def test_post_body(path, body, expected_status, expected_response):
 
 def test_post_broken_body():
     response = client.post("/items/", data={"name": "Foo", "price": 50.5})
-    assert response.status_code == 400, response.text
+    assert response.status_code == 422, response.text
+    assert response.json() == {
+        "detail": [
+            {
+                "ctx": {
+                    "colno": 1,
+                    "doc": "name=Foo&price=50.5",
+                    "lineno": 1,
+                    "msg": "Expecting value",
+                    "pos": 0,
+                },
+                "loc": ["body", 0],
+                "msg": "Expecting value: line 1 column 1 (char 0)",
+                "type": "value_error.jsondecode",
+            }
+        ]
+    }
+    with patch("json.loads", side_effect=Exception):
+        response = client.post("/items/", json={"test": "test2"})
+        assert response.status_code == 400, response.text
     assert response.json() == {"detail": "There was an error parsing the body"}