feat: direct_proxy with retry

This commit is contained in:
Anonymous 2024-07-06 11:29:24 +08:00
parent e6e2eae600
commit c9ebbac425
4 changed files with 31 additions and 2 deletions

View File

@ -6,6 +6,7 @@ import httpx
from httpx import Request as HttpxRequest from httpx import Request as HttpxRequest
from starlette.requests import Request from starlette.requests import Request
from starlette.responses import Response from starlette.responses import Response
from tenacity import retry, retry_if_exception_type, stop_after_attempt
SyncPreProcessor = Callable[[Request, HttpxRequest], HttpxRequest] SyncPreProcessor = Callable[[Request, HttpxRequest], HttpxRequest]
@ -54,6 +55,14 @@ async def post_process_response(
return response return response
@retry(
stop=stop_after_attempt(6),
retry=retry_if_exception_type(Exception),
reraise=True,
after=lambda retry_state: logger.warning(
f"retry {retry_state.attempt_number} {retry_state.outcome}"
),
)
async def direct_proxy( async def direct_proxy(
request: Request, request: Request,
target_url: str, target_url: str,
@ -74,6 +83,7 @@ async def direct_proxy(
request.method, request.method,
target_url, target_url,
headers=req_headers, headers=req_headers,
timeout=30,
) )
httpx_req = await pre_process_request(request, httpx_req, pre_process) httpx_req = await pre_process_request(request, httpx_req, pre_process)

19
src/poetry.lock generated
View File

@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
[[package]] [[package]]
name = "annotated-types" name = "annotated-types"
@ -498,6 +498,21 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""
[package.extras] [package.extras]
full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"]
[[package]]
name = "tenacity"
version = "8.4.2"
description = "Retry code until it succeeds"
optional = false
python-versions = ">=3.8"
files = [
{file = "tenacity-8.4.2-py3-none-any.whl", hash = "sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2"},
{file = "tenacity-8.4.2.tar.gz", hash = "sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef"},
]
[package.extras]
doc = ["reno", "sphinx"]
test = ["pytest", "tornado (>=4.5)", "typeguard"]
[[package]] [[package]]
name = "tomli" name = "tomli"
version = "2.0.1" version = "2.0.1"
@ -542,4 +557,4 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)",
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.9" python-versions = "^3.9"
content-hash = "95fe42214f7987d04a55af59e60128b0a3e224b1b2abbdf962053703379a7160" content-hash = "5e3dd2b39fd601cef175cb5768d11ea71f4583d815cbe8d97e4b2214d0ee1e97"

View File

@ -10,6 +10,7 @@ python = "^3.9"
fastapi = "^0.109.0" fastapi = "^0.109.0"
uvicorn = "^0.27.0.post1" uvicorn = "^0.27.0.post1"
httpx = "^0.26.0" httpx = "^0.26.0"
tenacity = "^8.4.2"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]

View File

@ -120,6 +120,9 @@ sniffio==1.3.0 ; python_version >= "3.9" and python_version < "4.0" \
starlette==0.35.1 ; python_version >= "3.9" and python_version < "4.0" \ starlette==0.35.1 ; python_version >= "3.9" and python_version < "4.0" \
--hash=sha256:3e2639dac3520e4f58734ed22553f950d3f3cb1001cd2eaac4d57e8cdc5f66bc \ --hash=sha256:3e2639dac3520e4f58734ed22553f950d3f3cb1001cd2eaac4d57e8cdc5f66bc \
--hash=sha256:50bbbda9baa098e361f398fda0928062abbaf1f54f4fadcbe17c092a01eb9a25 --hash=sha256:50bbbda9baa098e361f398fda0928062abbaf1f54f4fadcbe17c092a01eb9a25
tenacity==8.4.2 ; python_version >= "3.9" and python_version < "4.0" \
--hash=sha256:9e6f7cf7da729125c7437222f8a522279751cdfbe6b67bfe64f75d3a348661b2 \
--hash=sha256:cd80a53a79336edba8489e767f729e4f391c896956b57140b5d7511a64bbd3ef
typing-extensions==4.9.0 ; python_version >= "3.9" and python_version < "4.0" \ typing-extensions==4.9.0 ; python_version >= "3.9" and python_version < "4.0" \
--hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \
--hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd