Chromium Code Reviews| 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..4558f0f5820aea415cc4f58587695960c378dcaf 100755 |
| --- a/util/net/http_transport_test_server.py |
| +++ b/util/net/http_transport_test_server.py |
| @@ -58,6 +58,14 @@ class BufferedReadFile(object): |
| self.file.close() |
| +# 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. |
| +to_write_to_stdout = '' |
|
Mark Mentovai
2015/08/18 21:26:19
I don’t like that this is a global, but BaseHTTPSe
Robert Sesek
2015/08/18 21:42:49
You could move it to RequestHandler.written_respon
|
| + |
| class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| response_code = 500 |
| response_body = '' |
| @@ -69,9 +77,9 @@ class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| BaseHTTPServer.BaseHTTPRequestHandler.handle_one_request(self) |
| def do_POST(self): |
| - writer = sys.stdout |
| + global to_write_to_stdout |
| - writer.write(self.rfile.buffer) |
| + to_write_to_stdout = self.rfile.buffer |
| self.rfile.buffer = '' |
| if self.headers.get('Transfer-Encoding', '') == 'Chunked': |
| @@ -80,15 +88,14 @@ class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| length = int(self.headers.get('Content-Length', -1)) |
| body = self.rfile.read(length) |
| + to_write_to_stdout += 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 +153,9 @@ def Main(): |
| # Handle the request. |
| server.handle_request() |
| + # Share the entire request with the test program, which will validate it. |
| + sys.stdout.write(to_write_to_stdout) |
| + sys.stdout.flush() |
| + |
| if __name__ == '__main__': |
| Main() |