]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🐛 Fix support for strings in OpenAPI status codes: `default`, `1XX`, `2XX`, `3XX...
authorJarro van Ginkel <jarro@vanginkel-it.nl>
Fri, 14 Oct 2022 20:44:22 +0000 (23:44 +0300)
committerGitHub <noreply@github.com>
Fri, 14 Oct 2022 20:44:22 +0000 (22:44 +0200)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
fastapi/utils.py
tests/test_additional_responses_router.py

index 89f54453b5a90706e6cc91104d378d46a009597d..b94dacecc55d897d7f5670cd305576f82028409b 100644 (file)
@@ -21,6 +21,16 @@ if TYPE_CHECKING:  # pragma: nocover
 def is_body_allowed_for_status_code(status_code: Union[int, str, None]) -> bool:
     if status_code is None:
         return True
+    # Ref: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#patterned-fields-1
+    if status_code in {
+        "default",
+        "1XX",
+        "2XX",
+        "3XX",
+        "4XX",
+        "5XX",
+    }:
+        return True
     current_status_code = int(status_code)
     return not (current_status_code < 200 or current_status_code in {204, 304})
 
index d2b73058f7e9270fd8764db42e5e1723defaee41..fe4956f8fc96eb87fb09c94c4ccdc57b53b1fd4d 100644 (file)
@@ -1,5 +1,11 @@
 from fastapi import APIRouter, FastAPI
 from fastapi.testclient import TestClient
+from pydantic import BaseModel
+
+
+class ResponseModel(BaseModel):
+    message: str
+
 
 app = FastAPI()
 router = APIRouter()
@@ -33,6 +39,18 @@ async def c():
     return "c"
 
 
+@router.get(
+    "/d",
+    responses={
+        "400": {"description": "Error with str"},
+        "5XX": {"model": ResponseModel},
+        "default": {"model": ResponseModel},
+    },
+)
+async def d():
+    return "d"
+
+
 app.include_router(router)
 
 openapi_schema = {
@@ -81,6 +99,45 @@ openapi_schema = {
                 "operationId": "c_c_get",
             }
         },
+        "/d": {
+            "get": {
+                "responses": {
+                    "400": {"description": "Error with str"},
+                    "5XX": {
+                        "description": "Server Error",
+                        "content": {
+                            "application/json": {
+                                "schema": {"$ref": "#/components/schemas/ResponseModel"}
+                            }
+                        },
+                    },
+                    "200": {
+                        "description": "Successful Response",
+                        "content": {"application/json": {"schema": {}}},
+                    },
+                    "default": {
+                        "description": "Default Response",
+                        "content": {
+                            "application/json": {
+                                "schema": {"$ref": "#/components/schemas/ResponseModel"}
+                            }
+                        },
+                    },
+                },
+                "summary": "D",
+                "operationId": "d_d_get",
+            }
+        },
+    },
+    "components": {
+        "schemas": {
+            "ResponseModel": {
+                "title": "ResponseModel",
+                "required": ["message"],
+                "type": "object",
+                "properties": {"message": {"title": "Message", "type": "string"}},
+            }
+        }
     },
 }
 
@@ -109,3 +166,9 @@ def test_c():
     response = client.get("/c")
     assert response.status_code == 200, response.text
     assert response.json() == "c"
+
+
+def test_d():
+    response = client.get("/d")
+    assert response.status_code == 200, response.text
+    assert response.json() == "d"