Issue #26586: Simple enhancements to BaseHTTPRequestHandler by Xiang Zhang
This commit is contained in:
parent
b93e4b2480
commit
50badad807
@ -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):
|
|||||||
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):
|
|||||||
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):
|
|||||||
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):
|
|||||||
|
|
||||||
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 self.request_version != 'HTTP/0.9':
|
||||||
if message is None:
|
if message is None:
|
||||||
if code in self.responses:
|
if code in self.responses:
|
||||||
message = self.responses[code][0]
|
message = self.responses[code][0]
|
||||||
else:
|
else:
|
||||||
message = ''
|
message = ''
|
||||||
if self.request_version != 'HTTP/0.9':
|
|
||||||
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):
|
|||||||
# 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')
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user