8 changed files with 7 additions and 141 deletions
@ -1,35 +0,0 @@ |
|||||
import gzip |
|
||||
from typing import Callable, List |
|
||||
|
|
||||
from fastapi import Body, FastAPI, Request, Response |
|
||||
from fastapi.routing import APIRoute |
|
||||
|
|
||||
|
|
||||
class GzipRequest(Request): |
|
||||
async def body(self) -> bytes: |
|
||||
if not hasattr(self, "_body"): |
|
||||
body = await super().body() |
|
||||
if "gzip" in self.headers.getlist("Content-Encoding"): |
|
||||
body = gzip.decompress(body) |
|
||||
self._body = body |
|
||||
return self._body |
|
||||
|
|
||||
|
|
||||
class GzipRoute(APIRoute): |
|
||||
def get_route_handler(self) -> Callable: |
|
||||
original_route_handler = super().get_route_handler() |
|
||||
|
|
||||
async def custom_route_handler(request: Request) -> Response: |
|
||||
request = GzipRequest(request.scope, request.receive) |
|
||||
return await original_route_handler(request) |
|
||||
|
|
||||
return custom_route_handler |
|
||||
|
|
||||
|
|
||||
app = FastAPI() |
|
||||
app.router.route_class = GzipRoute |
|
||||
|
|
||||
|
|
||||
@app.post("/sum") |
|
||||
async def sum_numbers(numbers: List[int] = Body()): |
|
||||
return {"sum": sum(numbers)} |
|
||||
@ -1,36 +0,0 @@ |
|||||
import gzip |
|
||||
from typing import Callable, List |
|
||||
|
|
||||
from fastapi import Body, FastAPI, Request, Response |
|
||||
from fastapi.routing import APIRoute |
|
||||
from typing_extensions import Annotated |
|
||||
|
|
||||
|
|
||||
class GzipRequest(Request): |
|
||||
async def body(self) -> bytes: |
|
||||
if not hasattr(self, "_body"): |
|
||||
body = await super().body() |
|
||||
if "gzip" in self.headers.getlist("Content-Encoding"): |
|
||||
body = gzip.decompress(body) |
|
||||
self._body = body |
|
||||
return self._body |
|
||||
|
|
||||
|
|
||||
class GzipRoute(APIRoute): |
|
||||
def get_route_handler(self) -> Callable: |
|
||||
original_route_handler = super().get_route_handler() |
|
||||
|
|
||||
async def custom_route_handler(request: Request) -> Response: |
|
||||
request = GzipRequest(request.scope, request.receive) |
|
||||
return await original_route_handler(request) |
|
||||
|
|
||||
return custom_route_handler |
|
||||
|
|
||||
|
|
||||
app = FastAPI() |
|
||||
app.router.route_class = GzipRoute |
|
||||
|
|
||||
|
|
||||
@app.post("/sum") |
|
||||
async def sum_numbers(numbers: Annotated[List[int], Body()]): |
|
||||
return {"sum": sum(numbers)} |
|
||||
@ -1,29 +0,0 @@ |
|||||
from typing import Callable, List |
|
||||
|
|
||||
from fastapi import Body, FastAPI, HTTPException, Request, Response |
|
||||
from fastapi.exceptions import RequestValidationError |
|
||||
from fastapi.routing import APIRoute |
|
||||
|
|
||||
|
|
||||
class ValidationErrorLoggingRoute(APIRoute): |
|
||||
def get_route_handler(self) -> Callable: |
|
||||
original_route_handler = super().get_route_handler() |
|
||||
|
|
||||
async def custom_route_handler(request: Request) -> Response: |
|
||||
try: |
|
||||
return await original_route_handler(request) |
|
||||
except RequestValidationError as exc: |
|
||||
body = await request.body() |
|
||||
detail = {"errors": exc.errors(), "body": body.decode()} |
|
||||
raise HTTPException(status_code=422, detail=detail) |
|
||||
|
|
||||
return custom_route_handler |
|
||||
|
|
||||
|
|
||||
app = FastAPI() |
|
||||
app.router.route_class = ValidationErrorLoggingRoute |
|
||||
|
|
||||
|
|
||||
@app.post("/") |
|
||||
async def sum_numbers(numbers: List[int] = Body()): |
|
||||
return sum(numbers) |
|
||||
@ -1,30 +0,0 @@ |
|||||
from typing import Callable, List |
|
||||
|
|
||||
from fastapi import Body, FastAPI, HTTPException, Request, Response |
|
||||
from fastapi.exceptions import RequestValidationError |
|
||||
from fastapi.routing import APIRoute |
|
||||
from typing_extensions import Annotated |
|
||||
|
|
||||
|
|
||||
class ValidationErrorLoggingRoute(APIRoute): |
|
||||
def get_route_handler(self) -> Callable: |
|
||||
original_route_handler = super().get_route_handler() |
|
||||
|
|
||||
async def custom_route_handler(request: Request) -> Response: |
|
||||
try: |
|
||||
return await original_route_handler(request) |
|
||||
except RequestValidationError as exc: |
|
||||
body = await request.body() |
|
||||
detail = {"errors": exc.errors(), "body": body.decode()} |
|
||||
raise HTTPException(status_code=422, detail=detail) |
|
||||
|
|
||||
return custom_route_handler |
|
||||
|
|
||||
|
|
||||
app = FastAPI() |
|
||||
app.router.route_class = ValidationErrorLoggingRoute |
|
||||
|
|
||||
|
|
||||
@app.post("/") |
|
||||
async def sum_numbers(numbers: Annotated[List[int], Body()]): |
|
||||
return sum(numbers) |
|
||||
Loading…
Reference in new issue