Commit 50badad8 authored by Martin Panter's avatar Martin Panter

Issue #26586: Simple enhancements to BaseHTTPRequestHandler by Xiang Zhang

parent b93e4b24
...@@ -137,7 +137,7 @@ class HTTPServer(socketserver.TCPServer): ...@@ -137,7 +137,7 @@ class HTTPServer(socketserver.TCPServer):
def server_bind(self): def server_bind(self):
"""Override server_bind to store the server name.""" """Override server_bind to store the server name."""
socketserver.TCPServer.server_bind(self) 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_name = socket.getfqdn(host)
self.server_port = port self.server_port = port
...@@ -283,12 +283,9 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler): ...@@ -283,12 +283,9 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
words = requestline.split() words = requestline.split()
if len(words) == 3: if len(words) == 3:
command, path, version = words command, path, version = words
if version[:5] != 'HTTP/':
self.send_error(
HTTPStatus.BAD_REQUEST,
"Bad request version (%r)" % version)
return False
try: try:
if version[:5] != 'HTTP/':
raise ValueError
base_version_number = version.split('/', 1)[1] base_version_number = version.split('/', 1)[1]
version_number = base_version_number.split(".") version_number = base_version_number.split(".")
# RFC 2145 section 3.1 says there can be only one "." and # RFC 2145 section 3.1 says there can be only one "." and
...@@ -310,7 +307,7 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler): ...@@ -310,7 +307,7 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
if version_number >= (2, 0): if version_number >= (2, 0):
self.send_error( self.send_error(
HTTPStatus.HTTP_VERSION_NOT_SUPPORTED, HTTPStatus.HTTP_VERSION_NOT_SUPPORTED,
"Invalid HTTP Version (%s)" % base_version_number) "Invalid HTTP version (%s)" % base_version_number)
return False return False
elif len(words) == 2: elif len(words) == 2:
command, path = words command, path = words
...@@ -333,10 +330,11 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler): ...@@ -333,10 +330,11 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
try: try:
self.headers = http.client.parse_headers(self.rfile, self.headers = http.client.parse_headers(self.rfile,
_class=self.MessageClass) _class=self.MessageClass)
except http.client.LineTooLong: except http.client.LineTooLong as err:
self.send_error( self.send_error(
HTTPStatus.BAD_REQUEST, HTTPStatus.REQUEST_HEADER_FIELDS_TOO_LARGE,
"Line too long") "Line too long",
str(err))
return False return False
except http.client.HTTPException as err: except http.client.HTTPException as err:
self.send_error( self.send_error(
...@@ -482,12 +480,12 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler): ...@@ -482,12 +480,12 @@ class BaseHTTPRequestHandler(socketserver.StreamRequestHandler):
def send_response_only(self, code, message=None): def send_response_only(self, code, message=None):
"""Send the response header only.""" """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 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'): if not hasattr(self, '_headers_buffer'):
self._headers_buffer = [] self._headers_buffer = []
self._headers_buffer.append(("%s %d %s\r\n" % self._headers_buffer.append(("%s %d %s\r\n" %
......
...@@ -855,7 +855,7 @@ class BaseHTTPRequestHandlerTestCase(unittest.TestCase): ...@@ -855,7 +855,7 @@ class BaseHTTPRequestHandlerTestCase(unittest.TestCase):
# Issue #6791: same for headers # Issue #6791: same for headers
result = self.send_typical_request( result = self.send_typical_request(
b'GET / HTTP/1.1\r\nX-Foo: bar' + b'r' * 65537 + b'\r\n\r\n') 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.assertFalse(self.handler.get_called)
self.assertEqual(self.handler.requestline, 'GET / HTTP/1.1') self.assertEqual(self.handler.requestline, 'GET / HTTP/1.1')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment