]> granicus.if.org Git - python/commitdiff
Issue #26586: Simple enhancements to BaseHTTPRequestHandler by Xiang Zhang
authorMartin Panter <vadmium+py@gmail.com>
Sun, 3 Apr 2016 01:28:53 +0000 (01:28 +0000)
committerMartin Panter <vadmium+py@gmail.com>
Sun, 3 Apr 2016 01:28:53 +0000 (01:28 +0000)
Lib/http/server.py
Lib/test/test_httpservers.py

index de6b5312d810d4e9e3248151294cd17c73c7fde5..f4ad2609256a346baa83bdb91dd14c51dcc9b816 100644 (file)
@@ -137,7 +137,7 @@ class HTTPServer(socketserver.TCPServer):
     def server_bind(self):
         """Override server_bind to store the server name."""
         socketserver.TCPServer.server_bind(self)
-        host, port = self.socket.getsockname()[:2]
+        host, port = self.server_address[:2]
         self.server_name = socket.getfqdn(host)
         self.server_port = port
 
@@ -283,12 +283,9 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
         words = requestline.split()
         if len(words) == 3:
             command, path, version = words
-            if version[:5] != 'HTTP/':
-                self.send_error(
-                    HTTPStatus.BAD_REQUEST,
-                    "Bad request version (%r)" % version)
-                return False
             try:
+                if version[:5] != 'HTTP/':
+                    raise ValueError
                 base_version_number = version.split('/', 1)[1]
                 version_number = base_version_number.split(".")
                 # RFC 2145 section 3.1 says there can be only one "." and
@@ -310,7 +307,7 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
             if version_number >= (2, 0):
                 self.send_error(
                     HTTPStatus.HTTP_VERSION_NOT_SUPPORTED,
-                    "Invalid HTTP Version (%s)" % base_version_number)
+                    "Invalid HTTP version (%s)" % base_version_number)
                 return False
         elif len(words) == 2:
             command, path = words
@@ -333,10 +330,11 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
         try:
             self.headers = http.client.parse_headers(self.rfile,
                                                      _class=self.MessageClass)
-        except http.client.LineTooLong:
+        except http.client.LineTooLong as err:
             self.send_error(
-                HTTPStatus.BAD_REQUEST,
-                "Line too long")
+                HTTPStatus.REQUEST_HEADER_FIELDS_TOO_LARGE,
+                "Line too long",
+                str(err))
             return False
         except http.client.HTTPException as err:
             self.send_error(
@@ -482,12 +480,12 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
 
     def send_response_only(self, code, message=None):
         """Send the response header only."""
-        if message is None:
-            if code in self.responses:
-                message = self.responses[code][0]
-            else:
-                message = ''
         if self.request_version != 'HTTP/0.9':
+            if message is None:
+                if code in self.responses:
+                    message = self.responses[code][0]
+                else:
+                    message = ''
             if not hasattr(self, '_headers_buffer'):
                 self._headers_buffer = []
             self._headers_buffer.append(("%s %d %s\r\n" %
index 98798ae049fae2db06fae7ca062f82cbcd71283e..d9e4bf0e2060433b686a87bae7445e57d7c58230 100644 (file)
@@ -855,7 +855,7 @@ class BaseHTTPRequestHandlerTestCase(unittest.TestCase):
         # Issue #6791: same for headers
         result = self.send_typical_request(
             b'GET / HTTP/1.1\r\nX-Foo: bar' + b'r' * 65537 + b'\r\n\r\n')
-        self.assertEqual(result[0], b'HTTP/1.1 400 Line too long\r\n')
+        self.assertEqual(result[0], b'HTTP/1.1 431 Line too long\r\n')
         self.assertFalse(self.handler.get_called)
         self.assertEqual(self.handler.requestline, 'GET / HTTP/1.1')