def test_on_headers_simple(self): with mock.patch.object(HTTPConnection, '_remote_ip', return_value=None) as m_obj: self.con = HTTPConnection() self.con.factory = Mock() self.con.request_callback = Mock() self.con._remote_ip = "127.0.0.1" self.con.connectionMade() data = b"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_version(self): with mock.patch.object(HTTPConnection, '_remote_ip', return_value=None) as m_obj: self.con = HTTPConnection() self.con.factory = Mock() self.con.request_callback = Mock() self.con.transport = Mock() self.con._remote_ip = "127.0.0.1" self.con.connectionMade() data = b"GET / HTTS/1.1" self.con._on_headers(data) self.con.transport.loseConnection.assert_called_with()
def test_on_headers_big_body(self): with mock.patch.object(HTTPConnection, '_remote_ip', return_value=None) as m_obj: self.con = HTTPConnection() self.con.factory = Mock() self.con.transport = StringTransport() self.con.setRawMode = Mock() self.con._remote_ip = "127.0.0.1" self.con.connectionMade() data = \ b"GET / HTTP/1.1\r\n"\ b"Content-Length: 10000000\r\n"\ b"\r\n" self.con._on_headers(data) self.assertTrue(self.con._contentbuffer)
def test_on_headers_content_length(self): with mock.patch.object(HTTPConnection, '_remote_ip', return_value=None) as m_obj: self.con = HTTPConnection() self.con.factory = Mock() self.con.setRawMode = Mock() self.con._remote_ip = "127.0.0.1" self.con.connectionMade() data = \ b"GET / HTTP/1.1\r\n" \ b"Content-Length: 5\r\n" \ b"\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): with mock.patch.object(HTTPConnection, '_remote_ip', return_value=None) as m_obj: self.con = HTTPConnection() self.con.factory = Mock() self.con.transport = StringTransport() self.con.setRawMode = Mock() self.con._remote_ip = "127.0.0.1" self.con.connectionMade() data = \ b"GET / HTTP/1.1\r\n"\ b"Content-Length: 5\r\n"\ b"Expect: 100-continue"\ b"\r\n" self.con._on_headers(data) self.assertEqual(self.con.transport.io.getvalue().strip(), b"HTTP/1.1 100 (Continue)")
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)
def setUp(self): self.con = HTTPConnection() self.con.factory = Mock()