Index: util/net/http_transport_test_server.py |
diff --git a/util/net/http_transport_test_server.py b/util/net/http_transport_test_server.py |
index ecf71d702fe7922ef1bef3269f22a40838662bba..6b82aa0521a1fef5e9dac1d4e8e002afa2c2617c 100755 |
--- a/util/net/http_transport_test_server.py |
+++ b/util/net/http_transport_test_server.py |
@@ -59,6 +59,14 @@ class BufferedReadFile(object): |
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
+ # Everything to be written to stdout is collected into this string. It can’t |
+ # be written to stdout until after the HTTP transaction is complete, because |
+ # stdout is a pipe being read by a test program that’s also the HTTP client. |
+ # The test program expects to complete the entire HTTP transaction before it |
+ # even starts reading this script’s stdout. If the stdout pipe buffer fills up |
+ # during an HTTP transaction, deadlock would result. |
+ raw_request = '' |
+ |
response_code = 500 |
response_body = '' |
@@ -69,9 +77,7 @@ class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
BaseHTTPServer.BaseHTTPRequestHandler.handle_one_request(self) |
def do_POST(self): |
- writer = sys.stdout |
- |
- writer.write(self.rfile.buffer) |
+ RequestHandler.raw_request = self.rfile.buffer |
self.rfile.buffer = '' |
if self.headers.get('Transfer-Encoding', '') == 'Chunked': |
@@ -80,15 +86,14 @@ class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
length = int(self.headers.get('Content-Length', -1)) |
body = self.rfile.read(length) |
+ RequestHandler.raw_request += body |
+ |
self.send_response(self.response_code) |
self.end_headers() |
if self.response_code == 200: |
self.wfile.write(self.response_body) |
self.wfile.write('\r\n') |
- writer.write(body) |
- writer.flush() |
- |
def handle_chunked_encoding(self): |
"""This parses a "Transfer-Encoding: Chunked" body in accordance with |
RFC 7230 §4.1. This returns the result as a string. |
@@ -146,5 +151,9 @@ def Main(): |
# Handle the request. |
server.handle_request() |
+ # Share the entire request with the test program, which will validate it. |
+ sys.stdout.write(RequestHandler.raw_request) |
+ sys.stdout.flush() |
+ |
if __name__ == '__main__': |
Main() |