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,