Index: net/tools/testserver/testserver.py |
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py |
index acfafae79516c3e82ca85e4578329ae77079545b..f44fabc543191e806e88df73d93ebacaebfb40e3 100755 |
--- a/net/tools/testserver/testserver.py |
+++ b/net/tools/testserver/testserver.py |
@@ -593,6 +593,26 @@ class TestPageHandler(BasePageHandler): |
return True |
+ def ReadRequestBody(self): |
+ """This function reads the body of the current HTTP request, handling |
+ both plain and chunked transfer encoded requests.""" |
+ |
+ if self.headers.getheader('transfer-encoding') != 'chunked': |
+ length = int(self.headers.getheader('content-length')) |
+ return self.rfile.read(length) |
+ |
+ # Read the request body as chunks. |
+ body = "" |
+ while True: |
+ line = self.rfile.readline() |
+ length = int(line, 16) |
+ if length == 0: |
+ self.rfile.readline() |
+ break |
+ body += self.rfile.read(length) |
+ self.rfile.read(2) |
+ return body |
+ |
def EchoHandler(self): |
"""This handler just echoes back the payload of the request, for testing |
form submission.""" |
@@ -603,9 +623,7 @@ class TestPageHandler(BasePageHandler): |
self.send_response(200) |
self.send_header('Content-type', 'text/html') |
self.end_headers() |
- length = int(self.headers.getheader('content-length')) |
- request = self.rfile.read(length) |
- self.wfile.write(request) |
+ self.wfile.write(self.ReadRequestBody()) |
return True |
def EchoTitleHandler(self): |
@@ -617,8 +635,7 @@ class TestPageHandler(BasePageHandler): |
self.send_response(200) |
self.send_header('Content-type', 'text/html') |
self.end_headers() |
- length = int(self.headers.getheader('content-length')) |
- request = self.rfile.read(length) |
+ request = self.ReadRequestBody() |
self.wfile.write('<html><head><title>') |
self.wfile.write(request) |
self.wfile.write('</title></head></html>') |
@@ -642,8 +659,7 @@ class TestPageHandler(BasePageHandler): |
'<h1>Request Body:</h1><pre>') |
if self.command == 'POST' or self.command == 'PUT': |
- length = int(self.headers.getheader('content-length')) |
- qs = self.rfile.read(length) |
+ qs = self.ReadRequestBody() |
params = cgi.parse_qs(qs, keep_blank_values=1) |
for param in params: |
@@ -745,7 +761,7 @@ class TestPageHandler(BasePageHandler): |
# Consume a request body if present. |
if self.command == 'POST' or self.command == 'PUT' : |
- self.rfile.read(int(self.headers.getheader('content-length'))) |
+ self.ReadRequestBody() |
_, _, url_path, _, query, _ = urlparse.urlparse(self.path) |
sub_path = url_path[len(prefix):] |
@@ -1262,8 +1278,7 @@ class TestPageHandler(BasePageHandler): |
if not self._ShouldHandleRequest("/device_management"): |
return False |
- length = int(self.headers.getheader('content-length')) |
- raw_request = self.rfile.read(length) |
+ raw_request = self.ReadRequestBody() |
if not self.server._device_management_handler: |
import device_management |
@@ -1324,8 +1339,7 @@ class SyncPageHandler(BasePageHandler): |
if not self._ShouldHandleRequest(test_name): |
return False |
- length = int(self.headers.getheader('content-length')) |
- raw_request = self.rfile.read(length) |
+ raw_request = self.ReadRequestBody() |
http_response, raw_reply = self.server.HandleCommand( |
self.path, raw_request) |