def request(self, method, uri, *args, **kwargs): params = kwargs.pop("params") if params: uri = uri + "?" + urllib.urlencode(params) connection = kwargs.pop('connection') if not connection: connection = HTTPConnection() connection.xheaders = False kwargs['connection'] = connection connection.factory = self.app request = HTTPRequest(method, uri, *args, **kwargs) connection.connectionMade() connection._request = request connection.transport = proto_helpers.StringTransport() request.remote_ip = connection.transport.getHost().host handler = self.app(request) def setup_response(): response_body = connection.transport.io.getvalue() handler.content = response_body.split("\r\n\r\n", 1)[1] handler.headers = handler._headers if handler._finished: setup_response() returnValue(handler) yield connection.notifyFinish() setup_response() returnValue(handler)
def request(self, method, uri, *args, **kwargs): params = kwargs.pop("params", {}) or {} if method in ["GET", "HEAD", "OPTIONS"] and params: uri = uri + "?" + urllib.urlencode(params) elif method in ["POST", "PATCH", "PUT"]\ and params and not kwargs['body']: kwargs['body'] = urllib.urlencode(params) connection = kwargs.pop('connection') if not connection: connection = HTTPConnection() connection.xheaders = False kwargs['connection'] = connection connection.factory = self.app cookie_value = self.cookies.output(header="") if cookie_value.strip(): if kwargs['headers'] is None: kwargs['headers'] = {} kwargs['headers']['Cookie'] = cookie_value.strip() request = HTTPRequest(method, uri, *args, **kwargs) for k, p in params.items(): request.arguments.setdefault(k, []).append(p) connection.connectionMade() connection._request = request connection.transport = proto_helpers.StringTransport() request.remote_ip = connection.transport.getHost().host handler = self.app(request) def setup_response(): headers = HTTPHeaders() for line in handler._generate_headers().split("\r\n"): if line.startswith("HTTP") or not line.strip(): continue headers.parse_line(line) for cookie in headers.get_list("Set-Cookie"): self.cookies.load(cookie) response_body = connection.transport.io.getvalue() handler.content = response_body.split("\r\n\r\n", 1)[1] handler.headers = headers if handler._finished: setup_response() returnValue(handler) yield connection.notifyFinish() setup_response() returnValue(handler)
class HTTPConnectionTest(unittest.TestCase): def setUp(self): self.con = HTTPConnection() self.con.factory = Mock() def test_connectionMade(self): self.con.factory.settings.get.return_value = None self.con.connectionMade() self.assertTrue(hasattr(self.con, "no_keep_alive")) self.assertTrue(hasattr(self.con, "content_length")) self.assertTrue(hasattr(self.con, "xheaders")) def test_connectionLost(self): m = Mock() reason = Mock() reason.getErrorMessage.return_value = "Some message" self.con._finish_callback = Deferred().addCallback(m) self.con.connectionLost(reason) m.assert_called_with("Some message") def test_notifyFinish(self): self.con.connectionMade() d = self.con.notifyFinish() self.assertIsInstance(d, Deferred) def test_lineReceived(self): self.con.connectionMade() line = "Header: something" self.con.lineReceived(line) self.assertTrue(line + self.con.delimiter in self.con._headersbuffer) self.con._on_headers = Mock() self.con.lineReceived("") self.con._on_headers.assert_called_with('Header: something\r\n') def test_rawDataReceived(self): self.con.connectionMade() self.con._contentbuffer = BytesIO() self.con._on_request_body = Mock() self.con.content_length = 5 data = "some data" self.con.rawDataReceived(data) self.con._on_request_body.assert_called_with("some ") def test_write(self): self.con.transport = StringTransport() self.con._request = Mock() self.con.write("data") self.assertEqual(self.con.transport.io.getvalue(), "data") def test_finish(self): self.con._request = Mock() self.con._finish_request = Mock() self.con.finish() self.con._finish_request.assert_called_with() self.assertTrue(self.con._request_finished) def test_on_write_complete(self): self.con._request_finished = True self.con._finish_request = Mock() self.con._on_write_complete() self.con._finish_request.assert_called_with() def test_finish_request_close(self): self.con.connectionMade() self.con.transport = Mock() self.con._request = Mock() self.con._request.headers.get.return_value = "close" self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_finish_request_no_keep_alive(self): self.con.connectionMade() self.con.transport = Mock() self.con._request = Mock() self.con._request.headers = { "Content-Length": "1", "Connection": "close" } self.con._request.supports_http_1_1.return_value = False self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_finish_request_no_keep_alive_setting(self): self.con.connectionMade() self.con.no_keep_alive = True self.con.transport = Mock() self.con._request = Mock() self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_finish_request_head(self): self.con.connectionMade() self.con.transport = Mock() self.con._request = Mock() self.con._request.method = "HEAD" self.con._request.headers = {"Connection": "close"} self.con._request.supports_http_1_1.return_value = False self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_finish_request_http1_discon(self): self.con.connectionMade() self.con.transport = Mock() self.con._request = Mock() self.con._request.method = "POST" self.con._request.headers = {"Connection": "Keep-Alive"} self.con._request.supports_http_1_1.return_value = False self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_on_headers_simple(self): self.con._remote_ip = Mock() self.con.request_callback = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTP/1.1\r\n" self.con._on_headers(data) self.assertEqual(self.con.request_callback.call_count, 1) def test_on_headers_invalid(self): self.con._remote_ip = Mock() self.con.request_callback = Mock() self.con.transport = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET /" self.con._on_headers(data) self.con.transport.loseConnection.assert_called_with() def test_on_headers_invalid_version(self): self.con._remote_ip = Mock() self.con.request_callback = Mock() self.con.transport = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTS/1.1" self.con._on_headers(data) self.con.transport.loseConnection.assert_called_with() def test_on_headers_content_length(self): self.con._remote_ip = Mock() self.con.setRawMode = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTP/1.1\r\n"\ "Content-Length: 5\r\n"\ "\r\n" self.con._on_headers(data) self.con.setRawMode.assert_called_with() self.assertEqual(self.con.content_length, 5) def test_on_headers_continue(self): self.con._remote_ip = Mock() self.con.transport = StringTransport() self.con.setRawMode = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTP/1.1\r\n"\ "Content-Length: 5\r\n"\ "Expect: 100-continue"\ "\r\n" self.con._on_headers(data) self.assertEqual(self.con.transport.io.getvalue().strip(), "HTTP/1.1 100 (Continue)") def test_on_headers_big_body(self): self.con._remote_ip = Mock() self.con.transport = StringTransport() self.con.setRawMode = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTP/1.1\r\n"\ "Content-Length: 10000000\r\n"\ "\r\n" self.con._on_headers(data) self.assertTrue(self.con._contentbuffer) def test_on_request_body_get(self): self.con.request_callback = Mock() self.con._request = Mock() self.con._request.method = "GET" self.con._request.headers = {} data = "" self.con._on_request_body(data) self.assertEqual(self.con.request_callback.call_count, 1) def test_on_request_body_post_form_data(self): self.con.request_callback = Mock() self.con._request = Mock() self.con._request.arguments = {} self.con._request.method = "POST" self.con._request.headers = { "Content-Type": "application/x-www-form-urlencoded" } data = "a=b" self.con._on_request_body(data) self.assertEqual(self.con.request_callback.call_count, 1) self.assertEqual(self.con._request.arguments, {"a": ["b"]}) def test_on_request_body_post_multipart_form_data(self): self.con.request_callback = Mock() self.con._request = Mock() self.con._request.arguments = {} self.con._request.method = "POST" self.con._request.headers = { "Content-Type": "multipart/form-data; boundary=AaB03x" } data = \ "--AaB03x\r\n"\ 'Content-Disposition: form-data; name="a"\r\n'\ "\r\n"\ "b\r\n"\ "--AaB03x--\r\n" self.con._on_request_body(data) self.assertEqual(self.con.request_callback.call_count, 1) self.assertEqual(self.con._request.arguments, {"a": ["b"]}) def test_remote_ip(self): self.con.transport = StringTransport() ip = self.con._remote_ip self.assertTrue(ip) def test_remote_ip_unix(self): self.con.transport = Mock() self.con.transport.getHost.return_value.name = "rawr" self.con.transport.getPeer.return_value = address.UNIXAddress("rawr") ip = self.con._remote_ip self.assertTrue(ip)
class HTTPConnectionTest(unittest.TestCase): def setUp(self): self.con = HTTPConnection() self.con.factory = Mock() def test_connectionMade(self): self.con.factory.settings.get.return_value = None self.con.connectionMade() self.assertTrue(hasattr(self.con, "no_keep_alive")) self.assertTrue(hasattr(self.con, "content_length")) self.assertTrue(hasattr(self.con, "xheaders")) def test_connectionLost(self): m = Mock() reason = Mock() reason.getErrorMessage.return_value = "Some message" self.con._finish_callback = Deferred().addCallback(m) self.con.connectionLost(reason) m.assert_called_with("Some message") def test_notifyFinish(self): self.con.connectionMade() d = self.con.notifyFinish() self.assertIsInstance(d, Deferred) def test_lineReceived(self): self.con.connectionMade() line = "Header: something" self.con.lineReceived(line) self.assertTrue(line + self.con.delimiter in self.con._headersbuffer) self.con._on_headers = Mock() self.con.lineReceived("") self.con._on_headers.assert_called_with('Header: something\r\n') def test_rawDataReceived(self): self.con.connectionMade() self.con._contentbuffer = BytesIO() self.con._on_request_body = Mock() self.con.content_length = 5 data = "some data" self.con.rawDataReceived(data) self.con._on_request_body.assert_called_with("some ") def test_write(self): self.con.transport = StringTransport() self.con._request = Mock() self.con.write("data") self.assertEqual(self.con.transport.io.getvalue(), "data") def test_finish(self): self.con._request = Mock() self.con._finish_request = Mock() self.con.finish() self.con._finish_request.assert_called_with() self.assertTrue(self.con._request_finished) def test_on_write_complete(self): self.con._request_finished = True self.con._finish_request = Mock() self.con._on_write_complete() self.con._finish_request.assert_called_with() def test_finish_request_close(self): self.con.connectionMade() self.con.transport = Mock() self.con._request = Mock() self.con._request.headers.get.return_value = "close" self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_finish_request_no_keep_alive(self): self.con.connectionMade() self.con.transport = Mock() self.con._request = Mock() self.con._request.headers = { "Content-Length": "1", "Connection": "close" } self.con._request.supports_http_1_1.return_value = False self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_finish_request_no_keep_alive_setting(self): self.con.connectionMade() self.con.no_keep_alive = True self.con.transport = Mock() self.con._request = Mock() self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_finish_request_head(self): self.con.connectionMade() self.con.transport = Mock() self.con._request = Mock() self.con._request.method = "HEAD" self.con._request.headers = { "Connection": "close" } self.con._request.supports_http_1_1.return_value = False self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_finish_request_http1_discon(self): self.con.connectionMade() self.con.transport = Mock() self.con._request = Mock() self.con._request.method = "POST" self.con._request.headers = { "Connection": "Keep-Alive" } self.con._request.supports_http_1_1.return_value = False self.con._finish_request() self.con.transport.loseConnection.assert_called_with() def test_on_headers_simple(self): self.con._remote_ip = Mock() self.con.request_callback = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTP/1.1\r\n" self.con._on_headers(data) self.assertEqual(self.con.request_callback.call_count, 1) def test_on_headers_invalid(self): self.con._remote_ip = Mock() self.con.request_callback = Mock() self.con.transport = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET /" self.con._on_headers(data) self.con.transport.loseConnection.assert_called_with() def test_on_headers_invalid_version(self): self.con._remote_ip = Mock() self.con.request_callback = Mock() self.con.transport = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTS/1.1" self.con._on_headers(data) self.con.transport.loseConnection.assert_called_with() def test_on_headers_content_length(self): self.con._remote_ip = Mock() self.con.setRawMode = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTP/1.1\r\n"\ "Content-Length: 5\r\n"\ "\r\n" self.con._on_headers(data) self.con.setRawMode.assert_called_with() self.assertEqual(self.con.content_length, 5) def test_on_headers_continue(self): self.con._remote_ip = Mock() self.con.transport = StringTransport() self.con.setRawMode = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTP/1.1\r\n"\ "Content-Length: 5\r\n"\ "Expect: 100-continue"\ "\r\n" self.con._on_headers(data) self.assertEqual( self.con.transport.io.getvalue().strip(), "HTTP/1.1 100 (Continue)" ) def test_on_headers_big_body(self): self.con._remote_ip = Mock() self.con.transport = StringTransport() self.con.setRawMode = Mock() self.con.__dict__['_remote_ip'] = "127.0.0.1" self.con.connectionMade() data = \ "GET / HTTP/1.1\r\n"\ "Content-Length: 10000000\r\n"\ "\r\n" self.con._on_headers(data) self.assertTrue(self.con._contentbuffer) def test_on_request_body_get(self): self.con.request_callback = Mock() self.con._request = Mock() self.con._request.method = "GET" self.con._request.headers = { } data = "" self.con._on_request_body(data) self.assertEqual(self.con.request_callback.call_count, 1) def test_on_request_body_post_form_data(self): self.con.request_callback = Mock() self.con._request = Mock() self.con._request.arguments = {} self.con._request.method = "POST" self.con._request.headers = { "Content-Type": "application/x-www-form-urlencoded" } data = "a=b" self.con._on_request_body(data) self.assertEqual(self.con.request_callback.call_count, 1) self.assertEqual(self.con._request.arguments, {"a": ["b"]}) def test_on_request_body_post_multipart_form_data(self): self.con.request_callback = Mock() self.con._request = Mock() self.con._request.arguments = {} self.con._request.method = "POST" self.con._request.headers = { "Content-Type": "multipart/form-data; boundary=AaB03x" } data = \ "--AaB03x\r\n"\ 'Content-Disposition: form-data; name="a"\r\n'\ "\r\n"\ "b\r\n"\ "--AaB03x--\r\n" self.con._on_request_body(data) self.assertEqual(self.con.request_callback.call_count, 1) self.assertEqual(self.con._request.arguments, {"a": ["b"]}) def test_remote_ip(self): self.con.transport = StringTransport() ip = self.con._remote_ip self.assertTrue(ip) def test_remote_ip_unix(self): self.con.transport = Mock() self.con.transport.getHost.return_value.name = "rawr" self.con.transport.getPeer.return_value = address.UNIXAddress("rawr") ip = self.con._remote_ip self.assertTrue(ip)