チャラチャッチャッチャラッチャ~♪1
届いたすべての HTTP リクエストを何も手を加えずに右から左へ受け流すだけの Web サーバを Python + aiohttp で作った。誰得?
main.py
from os import getenv
from aiohttp import ClientSession, web
UPSTREAM = getenv("UPSTREAM")
if UPSTREAM is None:
raise Exception("UPSTREAM is required")
async def handler(request: web.Request):
headers = {**request.headers}
del headers["Host"]
async with ClientSession() as session:
async with session.request(
request.method,
f"{UPSTREAM}{request.path_qs}",
headers=headers,
data=await request.read(),
) as upstream_response:
response = web.StreamResponse(
status=upstream_response.status,
headers=upstream_response.headers,
)
await response.prepare(request)
async for chunk in upstream_response.content.iter_chunked(1024):
await response.write(chunk)
return response
app = web.Application()
app.add_routes([web.route("*", "/{_:.*}", handler)])
if __name__ == "__main__":
web.run_app(app)
$ UPSTREAM=https://api.example.com/v1 python main.py
単に HTTP リクエストを流すだけであれば Nginx を使うなどしてリバースプロキシすればよいのだが、Python スクリプトとして書いておくことで通信内容を読み取ったり手を加えたりすることができて便利。