]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
:bug: Fix "default" extra response with extra status codes (#489)
authorSebastián Ramírez <tiangolo@gmail.com>
Fri, 30 Aug 2019 21:34:47 +0000 (16:34 -0500)
committerGitHub <noreply@github.com>
Fri, 30 Aug 2019 21:34:47 +0000 (16:34 -0500)
* :bug: Fix lowercase "default" extra response

* :bug: Fix model for responses, to allow "default" plus status codes

* :white_check_mark: Add test for "default" extra response

fastapi/openapi/models.py
fastapi/openapi/utils.py
tests/test_additional_responses_router.py

index ddc5c6847f91767fbdd00e6f0aa9d720a0b4fd52..3dd9f04dc83856fabc8717c935bb8a4dc2f58978 100644 (file)
@@ -210,10 +210,6 @@ class Response(BaseModel):
     links: Optional[Dict[str, Union[Link, Reference]]] = None
 
 
-class Responses(BaseModel):
-    default: Response
-
-
 class Operation(BaseModel):
     tags: Optional[List[str]] = None
     summary: Optional[str] = None
@@ -222,7 +218,7 @@ class Operation(BaseModel):
     operationId: Optional[str] = None
     parameters: Optional[List[Union[Parameter, Reference]]] = None
     requestBody: Optional[Union[RequestBody, Reference]] = None
-    responses: Union[Responses, Dict[str, Response]]
+    responses: Dict[str, Response]
     # Workaround OpenAPI recursive reference
     callbacks: Optional[Dict[str, Union[Dict[str, Any], Reference]]] = None
     deprecated: Optional[bool] = None
index 2ee8c241cd334733b85b7ac5c89db88fb8922468..c3cc120fd6eca2fd453e391285ed4c40995bfc88 100644 (file)
@@ -49,7 +49,7 @@ status_code_ranges: Dict[str, str] = {
     "3XX": "Redirection",
     "4XX": "Client Error",
     "5XX": "Server Error",
-    "default": "Default Response",
+    "DEFAULT": "Default Response",
 }
 
 
@@ -205,9 +205,10 @@ def get_openapi_path(
                     response.setdefault(
                         "description", status_text or "Additional Response"
                     )
-                    operation.setdefault("responses", {})[
-                        str(additional_status_code).upper()
-                    ] = response
+                    status_code_key = str(additional_status_code).upper()
+                    if status_code_key == "DEFAULT":
+                        status_code_key = "default"
+                    operation.setdefault("responses", {})[status_code_key] = response
             status_code = str(route.status_code)
             response_schema = {"type": "string"}
             if lenient_issubclass(route.response_class, JSONResponse):
index ce66ead7e0c71cd66a55b6761f612d8bcd48cbf9..028026e67fea753be7b82ef8b27c52097c12d718 100644 (file)
@@ -26,6 +26,7 @@ async def b():
     responses={
         "400": {"description": "Error with str"},
         "5xx": {"description": "Error with range, lower"},
+        "default": {"description": "A default response"},
     },
 )
 async def c():
@@ -74,6 +75,7 @@ openapi_schema = {
                         "description": "Successful Response",
                         "content": {"application/json": {"schema": {}}},
                     },
+                    "default": {"description": "A default response"},
                 },
                 "summary": "C",
                 "operationId": "c_c_get",