diff -r 4b3899e734d5 Lib/http/server.py --- a/Lib/http/server.py Mon Aug 15 11:21:08 2016 +1000 +++ b/Lib/http/server.py Mon Aug 15 12:28:48 2016 +0800 @@ -466,7 +466,7 @@ }) body = content.encode('UTF-8', 'replace') self.send_header("Content-Type", self.error_content_type) - self.send_header('Content-Length', int(len(body))) + self.send_header('Content-Length', str(len(body))) self.end_headers() if self.command != 'HEAD' and body: diff -r 4b3899e734d5 Lib/test/test_httpservers.py --- a/Lib/test/test_httpservers.py Mon Aug 15 11:21:08 2016 +1000 +++ b/Lib/test/test_httpservers.py Mon Aug 15 12:28:48 2016 +0800 @@ -190,7 +190,7 @@ res = self.con.getresponse() self.assertEqual(res.status, HTTPStatus.NOT_IMPLEMENTED) - def test_head_keep_alive(self): + def test_header_keep_alive(self): self.con._http_vsn_str = 'HTTP/1.1' self.con.putrequest('GET', '/') self.con.putheader('Connection', 'keep-alive') @@ -243,6 +243,20 @@ data = res.read() self.assertEqual(int(res.getheader('Content-Length')), len(data)) + def test_error_content_length_type(self): + # Issue #27414: content-length value should be of type str instead of int + def send_header(instance, keyword, value): + self.assertIsInstance(keyword, str) + self.assertIsInstance(value, str) + super(self.request_handler, instance).send_header(keyword, value) + try: + prev = self.request_handler.send_header + self.request_handler.send_header = send_header + self.test_error_content_length() + finally: + # restore the previous method no matter succeed or fail + self.request_handler.send_header = prev + def test_send_error(self): allow_transfer_encoding_codes = (HTTPStatus.NOT_MODIFIED, HTTPStatus.RESET_CONTENT)