Esempio n. 1
0
 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)
Esempio n. 2
0
 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()
Esempio n. 3
0
    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)
Esempio n. 4
0
 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)
Esempio n. 5
0
 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)
Esempio n. 6
0
 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)")
Esempio n. 7
0
    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)
Esempio n. 8
0
    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)
Esempio n. 9
0
 def setUp(self):
     self.con = HTTPConnection()
     self.con.factory = Mock()
Esempio n. 10
0
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)
Esempio n. 11
0
 def setUp(self):
     self.con = HTTPConnection()
     self.con.factory = Mock()
Esempio n. 12
0
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)