http1connection_test.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import socket
  2. import typing # noqa(F401)
  3. from tornado.http1connection import HTTP1Connection
  4. from tornado.httputil import HTTPMessageDelegate
  5. from tornado.iostream import IOStream
  6. from tornado.locks import Event
  7. from tornado.netutil import add_accept_handler
  8. from tornado.testing import AsyncTestCase, bind_unused_port, gen_test
  9. class HTTP1ConnectionTest(AsyncTestCase):
  10. code = None # type: typing.Optional[int]
  11. def setUp(self):
  12. super().setUp()
  13. self.asyncSetUp()
  14. @gen_test
  15. def asyncSetUp(self):
  16. listener, port = bind_unused_port()
  17. event = Event()
  18. def accept_callback(conn, addr):
  19. self.server_stream = IOStream(conn)
  20. self.addCleanup(self.server_stream.close)
  21. event.set()
  22. add_accept_handler(listener, accept_callback)
  23. self.client_stream = IOStream(socket.socket())
  24. self.addCleanup(self.client_stream.close)
  25. yield [self.client_stream.connect(("127.0.0.1", port)), event.wait()]
  26. self.io_loop.remove_handler(listener)
  27. listener.close()
  28. @gen_test
  29. def test_http10_no_content_length(self):
  30. # Regression test for a bug in which can_keep_alive would crash
  31. # for an HTTP/1.0 (not 1.1) response with no content-length.
  32. conn = HTTP1Connection(self.client_stream, True)
  33. self.server_stream.write(b"HTTP/1.0 200 Not Modified\r\n\r\nhello")
  34. self.server_stream.close()
  35. event = Event()
  36. test = self
  37. body = []
  38. class Delegate(HTTPMessageDelegate):
  39. def headers_received(self, start_line, headers):
  40. test.code = start_line.code
  41. def data_received(self, data):
  42. body.append(data)
  43. def finish(self):
  44. event.set()
  45. yield conn.read_response(Delegate())
  46. yield event.wait()
  47. self.assertEqual(self.code, 200)
  48. self.assertEqual(b"".join(body), b"hello")