diff --git a/Lib/http/server.py b/Lib/http/server.py index a90c8d34c394db..48df91cc865818 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -540,8 +540,9 @@ def send_header(self, keyword, value): def end_headers(self): """Send the blank line ending the MIME headers.""" if self.request_version != 'HTTP/0.9': - self._headers_buffer.append(b"\r\n") - self.flush_headers() + if hasattr(self, '_headers_buffer'): + self._headers_buffer.append(b"\r\n") + self.flush_headers() def flush_headers(self): if hasattr(self, '_headers_buffer'): diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 1c370dcafa9fea..681f83bad41c11 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -98,6 +98,13 @@ def do_TEST(self): self.send_header('Connection', 'close') self.end_headers() + def do_NOHEADERS(self): + try: + self.end_headers() + self.send_error(HTTPStatus.OK, "OK") + except Exception as e: + self.send_error(HTTPStatus.INTERNAL_SERVER_ERROR, str(e)) + def do_KEEP(self): self.send_response(HTTPStatus.NO_CONTENT) self.send_header('Content-Type', 'text/html') @@ -236,6 +243,11 @@ def test_handler(self): res = self.con.getresponse() self.assertEqual(res.status, HTTPStatus.NO_CONTENT) + def test_end_no_headers(self): + self.con.request('NOHEADERS', '/') + res = self.con.getresponse() + self.assertEqual(res.status, HTTPStatus.OK) + def test_return_header_keep_alive(self): self.con.request('KEEP', '/') res = self.con.getresponse()