Mercurial > cpython-lru_cache-weakref
comparison Lib/test/test_httpservers.py @ 66971:dc32788f0e4e 3.1
Merged revisions 87317 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r87317 | antoine.pitrou | 2010-12-16 17:48:36 +0100 (jeu., 16 déc. 2010) | 4 lines
Issue #10714: Limit length of incoming request in http.server to 65536 bytes
for security reasons. Initial patch by Ross Lagerwall.
........
(also backport some tests)
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Thu, 16 Dec 2010 17:03:16 +0000 |
| parents | 2beb25369289 |
| children | fc2f0c86b497 |
comparison
equal
deleted
inserted
replaced
| 66966:d9b4426479ac | 66971:dc32788f0e4e |
|---|---|
| 476 res = self.request('/cgi-bin/file1.py') | 476 res = self.request('/cgi-bin/file1.py') |
| 477 self.assertEqual((b'Hello World\n', 'text/html', 200), | 477 self.assertEqual((b'Hello World\n', 'text/html', 200), |
| 478 (res.read(), res.getheader('Content-type'), res.status)) | 478 (res.read(), res.getheader('Content-type'), res.status)) |
| 479 self.assertEqual(os.environ['SERVER_SOFTWARE'], signature) | 479 self.assertEqual(os.environ['SERVER_SOFTWARE'], signature) |
| 480 | 480 |
| 481 | |
| 482 class SocketlessRequestHandler(SimpleHTTPRequestHandler): | |
| 483 def __init__(self): | |
| 484 self.get_called = False | |
| 485 self.protocol_version = "HTTP/1.1" | |
| 486 | |
| 487 def do_GET(self): | |
| 488 self.get_called = True | |
| 489 self.send_response(200) | |
| 490 self.send_header('Content-Type', 'text/html') | |
| 491 self.end_headers() | |
| 492 self.wfile.write(b'<html><body>Data</body></html>\r\n') | |
| 493 | |
| 494 def log_message(self, format, *args): | |
| 495 pass | |
| 496 | |
| 497 class BaseHTTPRequestHandlerTestCase(unittest.TestCase): | |
| 498 """Test the functionaility of the BaseHTTPServer. | |
| 499 """ | |
| 500 | |
| 501 HTTPResponseMatch = re.compile(b'HTTP/1.[0-9]+ 200 OK') | |
| 502 | |
| 503 def setUp (self): | |
| 504 self.handler = SocketlessRequestHandler() | |
| 505 | |
| 506 def send_typical_request(self, message): | |
| 507 input = BytesIO(message) | |
| 508 output = BytesIO() | |
| 509 self.handler.rfile = input | |
| 510 self.handler.wfile = output | |
| 511 self.handler.handle_one_request() | |
| 512 output.seek(0) | |
| 513 return output.readlines() | |
| 514 | |
| 515 def verify_get_called(self): | |
| 516 self.assertTrue(self.handler.get_called) | |
| 517 | |
| 518 def verify_expected_headers(self, headers): | |
| 519 for fieldName in b'Server: ', b'Date: ', b'Content-Type: ': | |
| 520 self.assertEqual(sum(h.startswith(fieldName) for h in headers), 1) | |
| 521 | |
| 522 def verify_http_server_response(self, response): | |
| 523 match = self.HTTPResponseMatch.search(response) | |
| 524 self.assertTrue(match is not None) | |
| 525 | |
| 526 def test_http_1_1(self): | |
| 527 result = self.send_typical_request(b'GET / HTTP/1.1\r\n\r\n') | |
| 528 self.verify_http_server_response(result[0]) | |
| 529 self.verify_expected_headers(result[1:-1]) | |
| 530 self.verify_get_called() | |
| 531 self.assertEqual(result[-1], b'<html><body>Data</body></html>\r\n') | |
| 532 | |
| 533 def test_http_1_0(self): | |
| 534 result = self.send_typical_request(b'GET / HTTP/1.0\r\n\r\n') | |
| 535 self.verify_http_server_response(result[0]) | |
| 536 self.verify_expected_headers(result[1:-1]) | |
| 537 self.verify_get_called() | |
| 538 self.assertEqual(result[-1], b'<html><body>Data</body></html>\r\n') | |
| 539 | |
| 540 def test_http_0_9(self): | |
| 541 result = self.send_typical_request(b'GET / HTTP/0.9\r\n\r\n') | |
| 542 self.assertEqual(len(result), 1) | |
| 543 self.assertEqual(result[0], b'<html><body>Data</body></html>\r\n') | |
| 544 self.verify_get_called() | |
| 545 | |
| 546 def test_with_continue_1_0(self): | |
| 547 result = self.send_typical_request(b'GET / HTTP/1.0\r\nExpect: 100-continue\r\n\r\n') | |
| 548 self.verify_http_server_response(result[0]) | |
| 549 self.verify_expected_headers(result[1:-1]) | |
| 550 self.verify_get_called() | |
| 551 self.assertEqual(result[-1], b'<html><body>Data</body></html>\r\n') | |
| 552 | |
| 553 def test_request_length(self): | |
| 554 # Issue #10714: huge request lines are discarded, to avoid Denial | |
| 555 # of Service attacks. | |
| 556 result = self.send_typical_request(b'GET ' + b'x' * 65537) | |
| 557 self.assertEqual(result[0], b'HTTP/1.1 414 Request-URI Too Long\r\n') | |
| 558 self.assertFalse(self.handler.get_called) | |
| 559 | |
| 560 class SimpleHTTPRequestHandlerTestCase(unittest.TestCase): | |
| 561 """ Test url parsing """ | |
| 562 def setUp(self): | |
| 563 self.translated = os.getcwd() | |
| 564 self.translated = os.path.join(self.translated, 'filename') | |
| 565 self.handler = SocketlessRequestHandler() | |
| 566 | |
| 567 def test_query_arguments(self): | |
| 568 path = self.handler.translate_path('/filename') | |
| 569 self.assertEqual(path, self.translated) | |
| 570 path = self.handler.translate_path('/filename?foo=bar') | |
| 571 self.assertEqual(path, self.translated) | |
| 572 path = self.handler.translate_path('/filename?a=b&spam=eggs#zot') | |
| 573 self.assertEqual(path, self.translated) | |
| 574 | |
| 575 def test_start_with_double_slash(self): | |
| 576 path = self.handler.translate_path('//filename') | |
| 577 self.assertEqual(path, self.translated) | |
| 578 path = self.handler.translate_path('//filename?foo=bar') | |
| 579 self.assertEqual(path, self.translated) | |
| 580 | |
| 581 | |
| 481 def test_main(verbose=None): | 582 def test_main(verbose=None): |
| 482 try: | 583 try: |
| 483 cwd = os.getcwd() | 584 cwd = os.getcwd() |
| 484 support.run_unittest(BaseHTTPRequestHandlerTestCase, | 585 support.run_unittest(BaseHTTPRequestHandlerTestCase, |
| 485 BaseHTTPServerTestCase, | 586 BaseHTTPServerTestCase, |
