Index: net/tools/testserver/testserver.py |
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py |
index acfafae79516c3e82ca85e4578329ae77079545b..ac6d33a180415ffe227c6068d7832a5f28b811a2 100755 |
--- a/net/tools/testserver/testserver.py |
+++ b/net/tools/testserver/testserver.py |
@@ -593,6 +593,25 @@ 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.""" |
wtc
2011/01/21 19:35:54
Your multi-line comment format seems non-ideal. P
Satish
2011/01/21 20:29:57
Sure :) I saw lines 558-560 which were in this for
|
+ if self.headers.getheader('transfer-encoding') != 'chunked': |
+ length = int(self.headers.getheader('content-length')) |
+ return self.rfile.read(length) |
+ |
+ # Read the response body as chunks. |
wtc
2011/01/21 19:35:54
Typo: response body => request body
|
+ body = "" |
+ while True: |
+ line = self.rfile.readline() |
+ if line == "0\r\n": |
+ self.rfile.readline() |
+ break |
wtc
2011/01/21 19:35:54
Nit: you can check for "0\r\n" below, after line 6
|
+ length = int(line, 16) |
wtc
2011/01/21 19:35:54
What does the argument "16" mean?
Satish
2011/01/21 20:29:57
The second argument is the base and we pass 16 sin
|
+ 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 +622,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 +634,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 +658,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 +760,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 +1277,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 +1338,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) |