Compact tables from a loopback lab: named open-source proxy software when a target or the proxy process fails on purpose, and what Requests 2.34.2, HTTPX 0.28.1 and curl 8.18.0 printed and sent, on 4 November 2026 UTC. Where a table counts, numbers are receipts, complete requests counted at the origin, and n is calls per cell.
Scope: one Ubuntu 26.04 host, loopback, an origin that speaks HTTP/1.1 only. None of this shows what a commercial proxy service runs or does, and the counts are per-call results of what the harness provoked, not rates.

### Dead target, POST

| software | first reply (raw probe) | then | curl write-out | Requests default | HTTPX default | curl | EOF string? |
|---|---|---|---|---|---|---|---|
| tinyproxy 1.11.3 | 500 Unable to connect | fin after 0 to 0.8 ms | connect=500 exit=7 appconnect=0 http=000 | ProxyError(Tunnel connection failed: 500 Unable to connect) | httpx.ProxyError: 500 Unable to connect | curl (7) CONNECT tunnel failed, response 500 | no |
| Squid 7.7 | 503 Service Unavailable | fin after 0 to 0 ms | connect=503 exit=7 appconnect=0 http=000 | ProxyError(Tunnel connection failed: 503 Service Unavailable) | httpx.ProxyError: 503 Service Unavailable | curl (7) CONNECT tunnel failed, response 503 | no |
| gost 3.3.3 HTTP | 503 Service Unavailable | fin after 0 to 0 ms | connect=503 exit=7 appconnect=0 http=000 | ProxyError(Tunnel connection failed: 503 Service Unavailable) | httpx.ProxyError: 503 Service Unavailable | curl (7) CONNECT tunnel failed, response 503 | no |
| proxy.py 2.4.10 | 502 Bad Gateway | fin after 0 to 0.1 ms | connect=502 exit=7 appconnect=0 http=000 | ProxyError(Tunnel connection failed: 502 Bad Gateway) | httpx.ProxyError: 502 Bad Gateway | curl (7) CONNECT tunnel failed, response 502 | no |
| mitmproxy 12.3.1 tunnel | 502 Bad Gateway | stayed open 8 s | connect=502 exit=7 appconnect=0 http=000 | ProxyError(Tunnel connection failed: 502 Bad Gateway) | httpx.ProxyError: 502 Bad Gateway | curl (7) CONNECT tunnel failed, response 502 | no |
| mitmproxy tunnel, connection_strategy=lazy | 200 Connection established | stayed open 8 s, fin after 1.1 to 1.5 ms | connect=200 exit=35 appconnect=0 http=000 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | yes |
| mitmproxy TLS-inspecting | 502 Bad Gateway | stayed open 8 s | connect=502 exit=7 appconnect=0 http=000 | ProxyError(Tunnel connection failed: 502 Bad Gateway) | httpx.ProxyError: 502 Bad Gateway | curl (7) CONNECT tunnel failed, response 502 | no |
| mitmproxy TLS-inspecting, lazy | 200 Connection established | stayed open 8 s | connect=200 exit=0 appconnect=>0 http=502 | HTTP 502 | HTTP 502 | no exception | no |
| mitmproxy TLS-inspecting, does not trust the lab origin | 502 Bad Gateway | stayed open 8 s | connect=502 exit=7 appconnect=0 http=000 | ProxyError(Tunnel connection failed: 502 Bad Gateway) | httpx.ProxyError: 502 Bad Gateway | curl (7) CONNECT tunnel failed, response 502 | no |
| Dante 1.4.4 SOCKS5 | SOCKS5 REP=5 | fin after 0 to 0 ms | connect=000 exit=97 appconnect=0 http=000 | NewConnectionError(SOCKS 0x05: Connection refused) | httpx.ProxyError: Proxy Server could not connect: Connection refused. | curl (97) cannot complete SOCKS5 connection to localhost. (5) | no |
| gost SOCKS5 | SOCKS5 REP=3 | fin, rst after 0 to 0.1 ms | connect=000 exit=97 appconnect=0 http=000 | NewConnectionError(SOCKS 0x03: Network unreachable) | httpx.ProxyError: Proxy Server could not connect: Network unreachable. | curl (97) cannot complete SOCKS5 connection to localhost. (3) | no |
| mitmproxy SOCKS5 | SOCKS5 REP=4 | fin after 0 to 0.1 ms | connect=000 exit=97 appconnect=0 http=000 | NewConnectionError(SOCKS 0x04: Host unreachable) | httpx.ProxyError: Proxy Server could not connect: Host unreachable. | curl (97) cannot complete SOCKS5 connection to localhost. (4) | no |
| mihomo 1.19.33 HTTP | 200 Connection established | fin after 3011.9 to 3543 ms | connect=200 exit=35 appconnect=0 http=000 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | yes |
| mihomo SOCKS5 | SOCKS5 REP=0 | fin after 2171 to 3744.8 ms | connect=000 exit=35 appconnect=0 http=000 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | yes |
| sing-box 1.14.4 HTTP | 200 Connection established | rst, fin after 0 to 1.1 ms | connect=200 exit=35 appconnect=0 http=000 | ConnectionError(aborted, ConnectionResetError) | httpx.ConnectError: [Errno 104] Connection reset by peer | curl (35) Send failure: Connection reset by peer | no |
| sing-box SOCKS5 | SOCKS5 REP=5 | fin after 0 to 0 ms | connect=000 exit=97 appconnect=0 http=000 | NewConnectionError(SOCKS 0x05: Connection refused) | httpx.ProxyError: Proxy Server could not connect: Connection refused. | curl (97) cannot complete SOCKS5 connection to localhost. (5) | no |
| Xray 26.10.31 HTTP | 200 Connection established | fin, rst after 1002.6 to 1003.2 ms | connect=200 exit=35 appconnect=0 http=000 | ConnectionError(aborted, ConnectionResetError) | httpx.ConnectError: [Errno 104] Connection reset by peer | curl (35) Recv failure: Connection reset by peer | no |
| Xray SOCKS5 | SOCKS5 REP=0 | fin, rst after 1002.5 to 1003.3 ms | connect=000 exit=35 appconnect=0 http=000 | ConnectionError(aborted, ConnectionResetError) | httpx.ConnectError: [Errno 104] Connection reset by peer | curl (35) Recv failure: Connection reset by peer | no |
| no proxy |  |  | connect=000 exit=7 appconnect=0 http=000 | NewConnectionError(refused) | httpx.ConnectError: [Errno 111] Connection refused | curl (7) Failed to connect to localhost port 28979 after 0 ms: Could  | no |

### Delivered, then the target closes (FIN, no close_notify): POST receipts at the origin

| software | default | HTTPAdapter(max_retries=3) | Retry(total=3) | allowed_methods={"GET"} | other=0 | HTTPX default | HTTPX retries=3 | curl | curl --retry 3 (n=1) | curl --retry-all-errors (n=1) | n | last line with HTTPAdapter(max_retries=3) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tinyproxy 1.11.3 | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| Squid 7.7 | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| gost 3.3.3 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| proxy.py 2.4.10 | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| mitmproxy 12.3.1 tunnel | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| mitmproxy tunnel, connection_strategy=lazy | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ProxyError(RemoteDisconnected) |
| mitmproxy TLS-inspecting | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 4 | 5 | HTTP 502 |
| mitmproxy TLS-inspecting, lazy | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 4 | 3 | HTTP 502 |
| Dante 1.4.4 SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ConnectionError(aborted, RemoteDisconnected) |
| gost SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| mitmproxy SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| mihomo 1.19.33 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| mihomo SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| sing-box 1.14.4 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ProxyError(RemoteDisconnected) |
| sing-box SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| Xray 26.10.31 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ProxyError(RemoteDisconnected) |
| Xray SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| no proxy | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ConnectionError(aborted, RemoteDisconnected) |

### Delivered, then the target sends RST: POST receipts at the origin

| software | default | HTTPAdapter(max_retries=3) | Retry(total=3) | allowed_methods={"GET"} | other=0 | HTTPX default | HTTPX retries=3 | curl | curl --retry 3 (n=1) | curl --retry-all-errors (n=1) | n | last line with HTTPAdapter(max_retries=3) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tinyproxy 1.11.3 | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| Squid 7.7 | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| gost 3.3.3 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| proxy.py 2.4.10 | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| mitmproxy 12.3.1 tunnel | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| mitmproxy tunnel, connection_strategy=lazy | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ProxyError(RemoteDisconnected) |
| mitmproxy TLS-inspecting | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 4 | 5 | HTTP 502 |
| mitmproxy TLS-inspecting, lazy | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 4 | 3 | HTTP 502 |
| Dante 1.4.4 SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ConnectionError(aborted, RemoteDisconnected) |
| gost SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| mitmproxy SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| mihomo 1.19.33 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ProxyError(RemoteDisconnected) |
| mihomo SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| sing-box 1.14.4 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ProxyError(RemoteDisconnected) |
| sing-box SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| Xray 26.10.31 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ProxyError(RemoteDisconnected) |
| Xray SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 3 | ConnectionError(aborted, RemoteDisconnected) |
| no proxy | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 4 | 5 | ConnectionError(aborted, ConnectionResetError) |

### Delivered, then the target closes (FIN): GET receipts, for comparison

| software | default | HTTPAdapter(max_retries=3) | Retry(total=3) | allowed_methods={"GET"} | other=0 | HTTPX default | HTTPX retries=3 | curl | curl --retry 3 (n=1) | curl --retry-all-errors (n=1) | n | last line with HTTPAdapter(max_retries=3) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tinyproxy 1.11.3 | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | - | - | 5 | ProxyError(RemoteDisconnected) |
| Squid 7.7 | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | - | - | 5 | ProxyError(RemoteDisconnected) |
| gost 3.3.3 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | - | - | 5 | ProxyError(RemoteDisconnected) |
| proxy.py 2.4.10 | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | - | - | 5 | ProxyError(RemoteDisconnected) |
| mitmproxy 12.3.1 tunnel | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | - | - | 5 | ProxyError(RemoteDisconnected) |
| mitmproxy tunnel, connection_strategy=lazy | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | - | - | 3 | ProxyError(RemoteDisconnected) |
| mitmproxy TLS-inspecting | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 5 | HTTP 502 |
| mitmproxy TLS-inspecting, lazy | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | HTTP 502 |
| Dante 1.4.4 SOCKS5 | 1 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | - | - | 5 | ConnectionError(aborted, RemoteDisconnected) |
| gost SOCKS5 | 1 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | - | - | 3 | ConnectionError(aborted, RemoteDisconnected) |
| mitmproxy SOCKS5 | 1 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | - | - | 3 | ConnectionError(aborted, RemoteDisconnected) |
| mihomo 1.19.33 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | - | - | 5 | ProxyError(RemoteDisconnected) |
| mihomo SOCKS5 | 1 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | - | - | 3 | ConnectionError(aborted, RemoteDisconnected) |
| sing-box 1.14.4 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | - | - | 3 | ProxyError(RemoteDisconnected) |
| sing-box SOCKS5 | 1 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | - | - | 3 | ConnectionError(aborted, RemoteDisconnected) |
| Xray 26.10.31 HTTP | 1 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | - | - | 3 | ProxyError(RemoteDisconnected) |
| Xray SOCKS5 | 1 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | - | - | 3 | ConnectionError(aborted, RemoteDisconnected) |
| no proxy | 1 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | - | - | 5 | ConnectionError(aborted, RemoteDisconnected) |

### First attempt delivered, later attempts die in the handshake: POST receipts

| software | default | HTTPAdapter(max_retries=3) | Retry(total=3) | allowed_methods={"GET"} | other=0 | HTTPX default | HTTPX retries=3 | curl | curl --retry 3 (n=1) | curl --retry-all-errors (n=1) | n | last line with HTTPAdapter(max_retries=3) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tinyproxy 1.11.3 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | SSLError(SSLEOFError, _ssl.c:1081) |
| Squid 7.7 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | SSLError(SSLEOFError, _ssl.c:1081) |
| gost 3.3.3 HTTP | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | SSLError(SSLEOFError, _ssl.c:1081) |
| proxy.py 2.4.10 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | SSLError(SSLEOFError, _ssl.c:1081) |
| mitmproxy 12.3.1 tunnel | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | SSLError(SSLEOFError, _ssl.c:1081) |
| mitmproxy tunnel, connection_strategy=lazy | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 2 | SSLError(SSLEOFError, _ssl.c:1081) |
| mitmproxy TLS-inspecting | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | HTTP 502 |
| mitmproxy TLS-inspecting, lazy | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 2 | HTTP 502 |
| Dante 1.4.4 SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | ConnectionError(aborted, RemoteDisconnected) |
| gost SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 2 | ConnectionError(aborted, RemoteDisconnected) |
| mitmproxy SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 2 | ConnectionError(aborted, RemoteDisconnected) |
| mihomo 1.19.33 HTTP | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | SSLError(SSLEOFError, _ssl.c:1081) |
| mihomo SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 2 | ConnectionError(aborted, RemoteDisconnected) |
| sing-box 1.14.4 HTTP | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 2 | SSLError(SSLEOFError, _ssl.c:1081) |
| sing-box SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 2 | ConnectionError(aborted, RemoteDisconnected) |
| Xray 26.10.31 HTTP | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 4 | SSLError(SSLEOFError, _ssl.c:1081) |
| Xray SOCKS5 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | ConnectionError(aborted, RemoteDisconnected) |
| no proxy | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - | 3 | ConnectionError(aborted, RemoteDisconnected) |

### Target closes in the handshake after reading the ClientHello, POST

| software | Requests default | HTTPX default | curl | curl write-out |
|---|---|---|---|---|
| tinyproxy 1.11.3 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| Squid 7.7 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| gost 3.3.3 HTTP | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| proxy.py 2.4.10 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| mitmproxy 12.3.1 tunnel | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| mitmproxy tunnel, connection_strategy=lazy | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| mitmproxy TLS-inspecting | HTTP 502 | HTTP 502 | no exception | connect=200 exit=0 appconnect=>0 http=502 |
| mitmproxy TLS-inspecting, lazy | HTTP 502 | HTTP 502 | no exception | connect=200 exit=0 appconnect=>0 http=502 |
| mitmproxy TLS-inspecting, does not trust the lab origin | HTTP 502 | HTTP 502 | no exception | connect=200 exit=0 appconnect=>0 http=502 |
| Dante 1.4.4 SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| gost SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| mitmproxy SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| mihomo 1.19.33 HTTP | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| mihomo SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| sing-box 1.14.4 HTTP | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| sing-box SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| Xray 26.10.31 HTTP | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| Xray SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| no proxy | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |

### Target sends RST in the handshake after reading the ClientHello, POST

| software | Requests default | HTTPX default | curl | curl write-out |
|---|---|---|---|---|
| tinyproxy 1.11.3 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| Squid 7.7 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| gost 3.3.3 HTTP | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| proxy.py 2.4.10 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| mitmproxy 12.3.1 tunnel | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| mitmproxy tunnel, connection_strategy=lazy | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| mitmproxy TLS-inspecting | HTTP 502 | HTTP 502 | no exception | connect=200 exit=0 appconnect=>0 http=502 |
| mitmproxy TLS-inspecting, lazy | HTTP 502 | HTTP 502 | no exception | connect=200 exit=0 appconnect=>0 http=502 |
| mitmproxy TLS-inspecting, does not trust the lab origin | HTTP 502 | HTTP 502 | no exception | connect=200 exit=0 appconnect=>0 http=502 |
| Dante 1.4.4 SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| gost SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| mitmproxy SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| mihomo 1.19.33 HTTP | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| mihomo SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| sing-box 1.14.4 HTTP | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| sing-box SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| Xray 26.10.31 HTTP | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=200 exit=35 appconnect=0 http=000 |
| Xray SOCKS5 | SSLError(SSLEOFError, _ssl.c:1081) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 |
| no proxy | ConnectionError(aborted, ConnectionResetError) | httpx.ConnectError: [Errno 104] Connection reset by peer | curl (35) Recv failure: Connection reset by peer | connect=000 exit=35 appconnect=0 http=000 |

### Target completes TLS, then closes without reading, POST

| software | Requests default | HTTPX default | curl | curl write-out |
|---|---|---|---|---|
| tinyproxy 1.11.3 | ProxyError(RemoteDisconnected) | httpx.RemoteProtocolError: Server disconnected without sending a response. | curl (56) SSL_read 0A000126 | connect=200 exit=56 appconnect=>0 http=000 |
| Squid 7.7 | ProxyError(RemoteDisconnected) (6/10); ProxyError(BrokenPipeError) (4/10) | httpx.ReadError: [Errno 32] Broken pipe (6/10); httpx.RemoteProtocolError: Server disconnected without sending a response. (4/10) | curl (56) SSL_read 0A000126 | connect=200 exit=56 appconnect=>0 http=000 |
| gost 3.3.3 HTTP | ProxyError(RemoteDisconnected) | httpx.RemoteProtocolError: Server disconnected without sending a response. | curl (56) SSL_read 0A000126 | connect=200 exit=56 appconnect=>0 http=000 |
| proxy.py 2.4.10 | ProxyError(RemoteDisconnected) (6/10); ProxyError(BrokenPipeError) (4/10) | httpx.RemoteProtocolError: Server disconnected without sending a response. | curl (56) SSL_read 0A000126 (9/10); curl (56) Send failure: Broken pipe (1/10) | connect=200 exit=56 appconnect=>0 http=000 |
| mitmproxy 12.3.1 tunnel | ProxyError(RemoteDisconnected) | httpx.RemoteProtocolError: Server disconnected without sending a response. | curl (56) SSL_read 0A000126 (9/10); curl (56) Send failure: Broken pipe (1/10) | connect=200 exit=56 appconnect=>0 http=000 |
| Dante 1.4.4 SOCKS5 | ConnectionError(aborted, RemoteDisconnected) | httpx.RemoteProtocolError: Server disconnected without sending a response. (9/10); httpx.ReadError: [Errno 32] Broken pipe (1/10) | curl (56) SSL_read 0A000126 | connect=000 exit=56 appconnect=>0 http=000 |
| mihomo 1.19.33 HTTP | ProxyError(RemoteDisconnected) | httpx.RemoteProtocolError: Server disconnected without sending a response. | curl (56) SSL_read 0A000126 | connect=200 exit=56 appconnect=>0 http=000 |
| no proxy | ConnectionError(aborted, ConnectionResetError) (9/10); ConnectionError(aborted, RemoteDisconnected) (1/10) | httpx.RemoteProtocolError: Server disconnected without sending a response. (6/10); httpx.ReadError: [Errno 104] Connection reset by peer (3/10); httpx.ReadError: [Errno 32] Broken pipe (1/10) | curl (56) Recv failure: Connection reset by peer (9/10); curl (56) Send failure: Broken pipe (1/10) | connect=000 exit=56 appconnect=>0 http=000 |

### Proxy SIGKILLed after delivery, POST

| software | default: receipts | default: last line | HTTPAdapter(3), proxy stays dead: receipts | its last line | allowed_methods={"GET"}, backoff 1, proxy back after 0.3 s: receipts | its result | other=0, backoff 1, proxy back: receipts | curl --retry-all-errors --retry-delay 2, proxy back: receipts |
|---|---|---|---|---|---|---|---|---|
| tinyproxy 1.11.3 | 1 | ProxyError(RemoteDisconnected) | 1 | ProxyError(proxy port refused) | 2 | HTTP 200 | 1 | 2 |
| Squid 7.7 | 1 | ProxyError(RemoteDisconnected) | 1 | ProxyError(proxy port refused) | 2 | HTTP 200 | 1 | 2 |
| gost 3.3.3 HTTP | 1 | ProxyError(RemoteDisconnected) | 1 | ProxyError(proxy port refused) | 2 | HTTP 200 | 1 | 2 |
| proxy.py 2.4.10 | 1 | ProxyError(RemoteDisconnected) | 1 | ProxyError(proxy port refused) (2/3); ConnectionError(aborted, ConnectionResetError) (1/3) | 2 | HTTP 200 | 1 | 2 |
| mitmproxy 12.3.1 tunnel | 1 | ProxyError(RemoteDisconnected) | 1 | ProxyError(proxy port refused) | 2 | HTTP 200 | 1 | 2 |
| mitmproxy TLS-inspecting | 1 | ProxyError(RemoteDisconnected) | 1 | ProxyError(proxy port refused) | 2 | HTTP 200 | 1 | 2 |
| Dante 1.4.4 SOCKS5 | 1 | ConnectionError(aborted, RemoteDisconnected) | 1 | ConnectionError(aborted, RemoteDisconnected) | 1 | ConnectionError(aborted, RemoteDisconnected) | 1 | 2 |
| mihomo 1.19.33 HTTP | 1 | ProxyError(RemoteDisconnected) | 1 | ProxyError(proxy port refused) | 2 | HTTP 200 | 1 | 2 |
| sing-box 1.14.4 HTTP | 1 | ProxyError(RemoteDisconnected) | 1 | ProxyError(proxy port refused) | 2 | HTTP 200 | 1 | 2 |
| Xray 26.10.31 HTTP | 1 | ProxyError(RemoteDisconnected) | 1 | ProxyError(proxy port refused) | 2 | HTTP 200 | 1 | 2 |

### https:// proxy URL at a plain proxy port, GET, one call each

| software | ClientHello at the plain proxy port | curl with https:// proxy URL | write-out | curl seconds | Requests | HTTPX |
|---|---|---|---|---|---|---|
| tinyproxy 1.11.3 | no bytes; stays open | curl (28) Connection timed out after 12002 milliseconds | connect=000 exit=28 appconnect=0 http=000 | 12.0109 | ProxyError(ReadTimeoutError) | httpx.ConnectTimeout: _ssl.c:1063: The handshake operation timed out |
| Squid 7.7 | HTTP/1.1 400 Bad Request; fin | curl (35) TLS connect error: error:0A00010B:SSL routines::wrong versio | connect=000 exit=35 appconnect=0 http=000 | 0.0089 | ProxyError hint, RECORD_LAYER_FAILURE | httpx.ConnectError: [SSL: RECORD_LAYER_FAILURE] record layer failure (_ssl.c:108 |
| gost 3.3.3 HTTP | no bytes; fin | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 | 0.0118 | ProxyError(SSLEOFError) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] |
| proxy.py 2.4.10 | no bytes; stays open | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 | 10.7714 | ProxyError(ReadTimeoutError) | httpx.ConnectTimeout: _ssl.c:1063: The handshake operation timed out |
| mitmproxy 12.3.1 tunnel | TLS bytes; stays open | curl (60) SSL certificate OpenSSL verify result: unable to get local i | connect=000 exit=60 appconnect=0 http=000 | 0.0128 | ProxyError(cert verify failed) | httpx.ConnectError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed:  |
| mitmproxy TLS-inspecting | TLS bytes; stays open | no exception | connect=200 exit=0 appconnect=>0 http=200 | 0.0637 | HTTP 200 | httpx.ConnectError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed:  |
| Dante 1.4.4 SOCKS5 | no bytes; rst | curl (35) Recv failure: Connection reset by peer | connect=000 exit=35 appconnect=0 http=000 | 0.0083 | ProxyError(ConnectionResetError) | httpx.ConnectError: [Errno 104] Connection reset by peer |
| gost SOCKS5 | no bytes; rst | curl (35) Recv failure: Connection reset by peer | connect=000 exit=35 appconnect=0 http=000 | 0.0092 | ProxyError(ConnectionResetError) | httpx.ConnectError: [Errno 104] Connection reset by peer |
| mitmproxy SOCKS5 | no bytes; fin | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 | 0.0095 | ProxyError(SSLEOFError) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] |
| mihomo 1.19.33 HTTP | no bytes; fin | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 | 0.0089 | ProxyError(SSLEOFError) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] |
| mihomo SOCKS5 | no bytes; fin | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 | 0.0087 | ProxyError(SSLEOFError) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] |
| sing-box 1.14.4 HTTP | no bytes; rst | curl (35) Recv failure: Connection reset by peer | connect=000 exit=35 appconnect=0 http=000 | 0.0087 | ProxyError(ConnectionResetError) | httpx.ConnectError: [Errno 104] Connection reset by peer |
| sing-box SOCKS5 | no bytes; rst | curl (35) Recv failure: Connection reset by peer | connect=000 exit=35 appconnect=0 http=000 | 0.0118 | ProxyError(ConnectionResetError) | httpx.ConnectError: [Errno 104] Connection reset by peer |
| Xray 26.10.31 HTTP | no bytes; fin | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 | 0.0097 | ProxyError(SSLEOFError) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] |
| Xray SOCKS5 | no bytes; fin | curl (35) 0A000126 | connect=000 exit=35 appconnect=0 http=000 | 0.0085 | ProxyError(SSLEOFError) | httpx.ConnectError [SSL: UNEXPECTED_EOF_WHILE_READING] |

