{"library":"proxy-protocol","title":"PROXY Protocol Library for Asyncio","description":"The `proxy-protocol` library provides an implementation of the PROXY protocol, including an `asyncio` server implementation, for Python. It currently supports versions 0.11.3 and is actively maintained with regular minor releases, focusing on improvements, bug fixes, and broader platform support.","language":"python","status":"active","last_verified":"Fri May 15","install":{"commands":["pip install proxy-protocol"],"cli":null},"imports":["from proxyprotocol.detect import ProxyProtocolDetect","from proxyprotocol.reader import ProxyProtocolReader","from proxyprotocol.sock import SocketInfo","from proxyprotocol.version import ProxyProtocolVersion"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import asyncio\nfrom asyncio import StreamReader, StreamWriter\nfrom proxyprotocol.detect import ProxyProtocolDetect\nfrom proxyprotocol.reader import ProxyProtocolReader\nfrom proxyprotocol.sock import SocketInfo\n\nasync def on_connection(reader: StreamReader, writer: StreamWriter, info: SocketInfo) -> None:\n    print(f\"Connection from: {info.family.name} {info.peername}\")\n    print(f\"Original client: {info.source_addr}:{info.source_port} -> {info.dest_addr}:{info.dest_port}\")\n    # Echo back received data (optional, for demonstration)\n    while True:\n        data = await reader.read(1024)\n        if not data: break\n        writer.write(data)\n        await writer.drain()\n    writer.close()\n    await writer.wait_closed()\n\nasync def main(host: str, port: int) -> None:\n    pp_detect = ProxyProtocolDetect()\n    callback = ProxyProtocolReader(pp_detect).get_callback(on_connection)\n    server = await asyncio.start_server(callback, host, port)\n    async with server:\n        await server.serve_forever()\n\nif __name__ == '__main__':\n    # To test, configure your proxy (e.g., HAProxy, NGINX) to send PROXY protocol\n    # to localhost:10007. Then connect to the proxy directly.\n    # Example with `netcat` after a proxy is set up:\n    # echo 'hello' | nc -q 1 localhost 10007\n    try:\n        asyncio.run(main('127.0.0.1', 10007))\n    except KeyboardInterrupt:\n        print(\"Server stopped.\")","lang":"python","description":"This example sets up an asyncio server that listens for incoming connections. It uses `ProxyProtocolDetect` to automatically detect PROXY protocol v1 or v2 headers. Once a connection is established and the header is parsed (if present), the `on_connection` callback receives a `SocketInfo` object containing the original client and destination address details, and then echoes any received data back to the client. This demonstrates how to integrate `proxy-protocol` with a standard `asyncio.start_server` setup.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-15","installed_version":"0.11.3","pypi_latest":"0.11.3","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.7,"avg_import_s":0.06,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.05,"mem_mb":2.4,"disk_size":"18.4M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.03,"mem_mb":2.4,"disk_size":"19M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.09,"mem_mb":2.7,"disk_size":"20.3M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.08,"mem_mb":2.7,"disk_size":"21M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.08,"mem_mb":2.7,"disk_size":"12.2M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.08,"mem_mb":2.7,"disk_size":"13M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.07,"mem_mb":2.8,"disk_size":"11.9M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.07,"mem_mb":2.6,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.05,"mem_mb":2.4,"disk_size":"17.9M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"proxy-protocol","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.9,"import_time_s":0.04,"mem_mb":2.4,"disk_size":"18M"}]}}