Ejemplo n.º 1
0
def test_redirect_rfc1808_to_non_ascii_location():
    path = u"š"
    expected_path = b"%C5%A1"
    redirect_request = []  # stores the second request to the server

    def redirect_resp_handler(sock):
        consume_socket_content(sock, timeout=0.5)
        location = u"//{}:{}/{}".format(host, port, path)
        sock.send(b"HTTP/1.1 301 Moved Permanently\r\n"
                  b"Content-Length: 0\r\n"
                  b"Location: " + location.encode("utf8") + b"\r\n"
                  b"\r\n")
        redirect_request.append(consume_socket_content(sock, timeout=0.5))
        sock.send(b"HTTP/1.1 200 OK\r\n\r\n")

    close_server = threading.Event()
    server = Server(redirect_resp_handler, wait_to_close_event=close_server)
    with server as (host, port):
        url = u"http://{}:{}".format(host, port)
        r = requests.get(url=url, allow_redirects=True)
        assert r.status_code == 200
        assert len(r.history) == 1
        assert r.history[0].status_code == 301
        assert redirect_request[0].startswith(b"GET /" + expected_path +
                                              b" HTTP/1.1")
        assert r.url == u"{0}/{1}".format(url, expected_path.decode("ascii"))
        close_server.set()
Ejemplo n.º 2
0
 def test_basic_response(self):
     """the basic response server returns an empty http response"""
     with Server.basic_response_server() as (host, port):
         r = requests.get('http://{}:{}'.format(host, port))
         assert r.status_code == 200
         assert r.text == u''
         assert r.headers['Content-Length'] == '0'
Ejemplo n.º 3
0
def test_fragment_not_sent_with_request():
    """Verify that the fragment portion of a URI isn't sent to the server."""
    def response_handler(sock):
        req = consume_socket_content(sock, timeout=0.5)
        sock.send(b'HTTP/1.1 200 OK\r\n'
                  b'Content-Length: ' + bytes(len(req)) + b'\r\n'
                  b'\r\n' + req)

    close_server = threading.Event()
    server = Server(response_handler, wait_to_close_event=close_server)

    with server as (host, port):
        url = 'http://{}:{}/path/to/thing/#view=edit&token=hunter2'.format(
            host, port)
        r = requests.get(url)
        raw_request = r.content

        assert r.status_code == 200
        headers, body = raw_request.split(b'\r\n\r\n', 1)
        status_line, headers = headers.split(b'\r\n', 1)

        assert status_line == b'GET /path/to/thing/ HTTP/1.1'
        for frag in (b'view', b'edit', b'token', b'hunter2'):
            assert frag not in headers
            assert frag not in body

        close_server.set()
Ejemplo n.º 4
0
    def test_server_finishes_when_no_connections(self):
        """the server thread exits even if there are no connections"""
        server = Server.basic_response_server()
        with server:
            pass

        assert len(server.handler_results) == 0
Ejemplo n.º 5
0
 def test_basic_response(self):
     """the basic response server returns an empty http response"""
     with Server.basic_response_server() as (host, port):
         r = requests.get("http://{0}:{1}".format(host, port))
         assert r.status_code == 200
         assert r.text == u""
         assert r.headers["Content-Length"] == "0"
Ejemplo n.º 6
0
 def test_basic_response(self):
     """the basic response server returns an empty http response"""
     with Server.basic_response_server() as (host, port):
         r = requests.get('http://{}:{}'.format(host, port))
         assert r.status_code == 200
         assert r.text == u''
         assert r.headers['Content-Length'] == '0'
Ejemplo n.º 7
0
    def test_server_finishes_when_no_connections(self):
        """the server thread exits even if there are no connections"""
        server = Server.basic_response_server()
        with server:
            pass

        assert len(server.handler_results) == 0
Ejemplo n.º 8
0
def test_digestauth_only_on_4xx():
    """Ensure we only send digestauth on 4xx challenges.

    See https://github.com/requests/requests/issues/3772.
    """
    text_200_chal = (b'HTTP/1.1 200 OK\r\n'
                     b'Content-Length: 0\r\n'
                     b'WWW-Authenticate: Digest nonce="6bf5d6e4da1ce66918800195d6b9130d"'
                     b', opaque="372825293d1c26955496c80ed6426e9e", '
                     b'realm="*****@*****.**", qop=auth\r\n\r\n')

    auth = requests.auth.HTTPDigestAuth('user', 'pass')

    def digest_response_handler(sock):
        # Respond to GET with a 200 containing www-authenticate header.
        request_content = consume_socket_content(sock, timeout=0.5)
        assert request_content.startswith(b"GET / HTTP/1.1")
        sock.send(text_200_chal)

        # Verify the client didn't respond with auth.
        request_content = consume_socket_content(sock, timeout=0.5)
        assert request_content == b''

        return request_content

    close_server = threading.Event()
    server = Server(digest_response_handler, wait_to_close_event=close_server)

    with server as (host, port):
        url = 'http://{0}:{1}/'.format(host, port)
        r = requests.get(url, auth=auth)
        # Verify server didn't receive auth from us.
        assert r.status_code == 200
        assert len(r.history) == 0
        close_server.set()
Ejemplo n.º 9
0
def test_conflicting_content_lengths():
    """Ensure we correctly throw an InvalidHeader error if multiple
    conflicting Content-Length headers are returned.
    """

    def multiple_content_length_response_handler(sock):
        request_content = consume_socket_content(sock, timeout=0.5)
        response = (
            b"HTTP/1.1 200 OK\r\n"
            b"Content-Type: text/plain\r\n"
            b"Content-Length: 16\r\n"
            b"Content-Length: 32\r\n\r\n"
            b"-- Bad Actor -- Original Content\r\n"
        )
        sock.send(response)

        return request_content

    close_server = threading.Event()
    server = Server(multiple_content_length_response_handler)

    with server as (host, port):
        url = f"http://{host}:{port}/"
        with pytest.raises(requests.exceptions.InvalidHeader):
            requests.get(url)
        close_server.set()
Ejemplo n.º 10
0
 def test_basic_response(self):
     """the basic response server returns an empty http response"""
     with Server.basic_response_server() as (host, port):
         r = requests.get(f"http://{host}:{port}")
         assert r.status_code == 200
         assert r.text == ""
         assert r.headers["Content-Length"] == "0"
Ejemplo n.º 11
0
def test_redirect_rfc1808_to_non_ascii_location():
    path = u'š'
    expected_path = b'%C5%A1'
    redirect_request = []  # stores the second request to the server

    def redirect_resp_handler(sock):
        consume_socket_content(sock, timeout=0.5)
        location = u'//{}:{}/{}'.format(host, port, path)
        sock.send(b'HTTP/1.1 301 Moved Permanently\r\n'
                  b'Content-Length: 0\r\n'
                  b'Location: ' + location.encode('utf8') + b'\r\n'
                  b'\r\n')
        redirect_request.append(consume_socket_content(sock, timeout=0.5))
        sock.send(b'HTTP/1.1 200 OK\r\n\r\n')

    close_server = threading.Event()
    server = Server(redirect_resp_handler, wait_to_close_event=close_server)

    with server as (host, port):
        url = u'http://{}:{}'.format(host, port)
        r = requests.get(url=url, allow_redirects=True)
        assert r.status_code == 200
        assert len(r.history) == 1
        assert r.history[0].status_code == 301
        assert redirect_request[0].startswith(b'GET /' + expected_path +
                                              b' HTTP/1.1')
        assert r.url == u'{}/{}'.format(url, expected_path.decode('ascii'))

        close_server.set()
Ejemplo n.º 12
0
    def test_server_finishes_on_error(self):
        """the server thread exits even if an exception exits the context manager"""
        server = Server.basic_response_server()
        with pytest.raises(Exception):
            with server:
                raise Exception()

        assert len(server.handler_results) == 0
Ejemplo n.º 13
0
    def test_server_finishes_on_error(self):
        """the server thread exits even if an exception exits the context manager"""
        server = Server.basic_response_server()
        with pytest.raises(Exception):
            with server:
                raise Exception()

        assert len(server.handler_results) == 0
Ejemplo n.º 14
0
 def test_server_closes(self):
     """the server closes when leaving the context manager"""
     with Server.basic_response_server() as (host, port):
         sock = socket.socket()
         sock.connect((host, port))
         sock.close()
     with pytest.raises(socket.error):
         new_sock = socket.socket()
         new_sock.connect((host, port))
Ejemplo n.º 15
0
    def test_text_response(self):
        """the text_response_server sends the given text"""
        server = Server.text_response_server("HTTP/1.1 200 OK\r\n" + "Content-Length: 6\r\n" + "\r\nroflol")

        with server as (host, port):
            r = requests.get("http://{0}:{1}".format(host, port))

            assert r.status_code == 200
            assert r.text == u"roflol"
            assert r.headers["Content-Length"] == "6"
Ejemplo n.º 16
0
 def test_requests_after_timeout_are_not_received(self):
     """the basic response handler times out when receiving requests"""
     server = Server.basic_response_server(request_timeout=1)
     with server as address:
         sock = socket.socket()
         sock.connect(address)
         time.sleep(1.5)
         sock.sendall(b'hehehe, not received')
         sock.close()
     assert server.handler_results[0] == b''
Ejemplo n.º 17
0
 def test_text_response(self):
     """the text_response_server sends the given text"""
     server = Server.text_response_server("HTTP/1.1 200 OK\r\n" +
                                          "Content-Length: 6\r\n" +
                                          "\r\nroflol")
     with server as (host, port):
         r = requests.get('http://{0}:{1}'.format(host, port))
         assert r.status_code == 200
         assert r.text == u'roflol'
         assert r.headers['Content-Length'] == '6'
Ejemplo n.º 18
0
 def test_request_recovery_with_bigger_timeout(self):
     """a biggest timeout can be specified"""
     server = Server.basic_response_server(request_timeout=3)
     data = b'bananadine'
     with server as address:
         sock = socket.socket()
         sock.connect(address)
         time.sleep(1.5)
         sock.sendall(data)
         sock.close()
     assert server.handler_results[0] == data
Ejemplo n.º 19
0
    def test_server_closes(self):
        """the server closes when leaving the context manager"""
        with Server.basic_response_server() as (host, port):
            sock = socket.socket()
            sock.connect((host, port))

            sock.close()

        with pytest.raises(socket.error):
            new_sock = socket.socket()
            new_sock.connect((host, port))
Ejemplo n.º 20
0
def test_chunked_upload():
    """can safely send generators"""
    close_server = threading.Event()
    server = Server.basic_response_server(wait_to_close_event=close_server)
    data = iter([b"a", b"b", b"c"])
    with server as (host, port):
        url = "http://{}:{}/".format(host, port)
        r = requests.post(url, data=data, stream=True)
        close_server.set()  # release server block
    assert r.status_code == 200
    assert r.request.headers["Transfer-Encoding"] == "chunked"
Ejemplo n.º 21
0
    def test_basic_waiting_server(self):
        """the server waits for the block_server event to be set before closing"""
        block_server = threading.Event()

        with Server.basic_response_server(wait_to_close_event=block_server) as (host, port):
            sock = socket.socket()
            sock.connect((host, port))
            sock.sendall(b'send something')
            time.sleep(2.5)
            sock.sendall(b'still alive')
            block_server.set()  # release server block
Ejemplo n.º 22
0
    def test_basic_waiting_server(self):
        """the server waits for the block_server event to be set before closing"""
        block_server = threading.Event()

        with Server.basic_response_server(wait_to_close_event=block_server) as (host, port):
            sock = socket.socket()
            sock.connect((host, port))
            sock.sendall(b'send something')
            time.sleep(2.5)
            sock.sendall(b'still alive')
            block_server.set() # release server block
Ejemplo n.º 23
0
    def test_requests_after_timeout_are_not_received(self):
        """the basic response handler times out when receiving requests"""
        server = Server.basic_response_server(request_timeout=1)

        with server as address:
            sock = socket.socket()
            sock.connect(address)
            time.sleep(1.5)
            sock.sendall(b'hehehe, not received')
            sock.close()

        assert server.handler_results[0] == b''
Ejemplo n.º 24
0
    def test_text_response(self):
        """the text_response_server sends the given text"""
        server = Server.text_response_server("HTTP/1.1 200 OK\r\n"
                                             "Content-Length: 6\r\n"
                                             "\r\nroflol")

        with server as (host, port):
            r = requests.get(f"http://{host}:{port}")

            assert r.status_code == 200
            assert r.text == "roflol"
            assert r.headers["Content-Length"] == "6"
Ejemplo n.º 25
0
def test_digestauth_401_count_reset_on_redirect():
    """Ensure we correctly reset num_401_calls after a successful digest auth,
    followed by a 302 redirect to another digest auth prompt.

    See https://github.com/requests/requests/issues/1979.
    """
    text_401 = (
        b"HTTP/1.1 401 UNAUTHORIZED\r\n"
        b"Content-Length: 0\r\n"
        b'WWW-Authenticate: Digest nonce="6bf5d6e4da1ce66918800195d6b9130d"'
        b', opaque="372825293d1c26955496c80ed6426e9e", '
        b'realm="*****@*****.**", qop=auth\r\n\r\n')
    text_302 = b"HTTP/1.1 302 FOUND\r\n" b"Content-Length: 0\r\n" b"Location: /\r\n\r\n"
    text_200 = b"HTTP/1.1 200 OK\r\n" b"Content-Length: 0\r\n\r\n"
    expected_digest = (b'Authorization: Digest username="******", '
                       b'realm="*****@*****.**", '
                       b'nonce="6bf5d6e4da1ce66918800195d6b9130d", uri="/"')
    auth = requests.auth.HTTPDigestAuth("user", "pass")

    def digest_response_handler(sock):
        # Respond to initial GET with a challenge.
        request_content = consume_socket_content(sock, timeout=0.5)
        assert request_content.startswith(b"GET / HTTP/1.1")
        sock.send(text_401)
        # Verify we receive an Authorization header in response, then redirect.
        request_content = consume_socket_content(sock, timeout=0.5)
        assert expected_digest in request_content
        sock.send(text_302)
        # Verify Authorization isn't sent to the redirected host,
        # then send another challenge.
        request_content = consume_socket_content(sock, timeout=0.5)
        assert b"Authorization:" not in request_content
        sock.send(text_401)
        # Verify Authorization is sent correctly again, and return 200 OK.
        request_content = consume_socket_content(sock, timeout=0.5)
        assert expected_digest in request_content
        sock.send(text_200)
        return request_content

    close_server = threading.Event()
    server = Server(digest_response_handler, wait_to_close_event=close_server)
    with server as (host, port):
        url = "http://{}:{}/".format(host, port)
        r = requests.get(url, auth=auth)
        # Verify server succeeded in authenticating.
        assert r.status_code == 200
        # Verify Authorization was sent in final request.
        assert "Authorization" in r.request.headers
        assert r.request.headers["Authorization"].startswith("Digest ")
        # Verify redirect happened as we expected.
        assert r.history[0].status_code == 302
        close_server.set()
Ejemplo n.º 26
0
def test_chunked_upload():
    """can safely send generators"""
    close_server = threading.Event()
    server = Server.basic_response_server(wait_to_close_event=close_server)
    data = iter([b'a', b'b', b'c'])

    with server as (host, port):
        url = 'http://{0}:{1}/'.format(host, port)
        r = requests.post(url, data=data, stream=True)
        close_server.set()  # release server block

    assert r.status_code == 200
    assert r.request.headers['Transfer-Encoding'] == 'chunked'
Ejemplo n.º 27
0
 def test_multiple_requests(self):
     """multiple requests can be served"""
     requests_to_handle = 5
     server = Server.basic_response_server(
         requests_to_handle=requests_to_handle)
     with server as (host, port):
         server_url = 'http://{}:{}'.format(host, port)
         for _ in range(requests_to_handle):
             r = requests.get(server_url)
             assert r.status_code == 200
         # the (n+1)th request fails
         with pytest.raises(requests.exceptions.ConnectionError):
             r = requests.get(server_url)
Ejemplo n.º 28
0
    def test_text_bom_response(self):
        """the text_response_server sends the given text with UTF-8 BOM"""
        server = Server.text_response_server(
            "HTTP/1.1 200 OK\r\n" +
            "Content-Type: text/html; charset=UTF-8\r\n" +
            u'\r\n\ufeff<doctype html><html><body>ジェーピーニック</body></html>')

        with server as (host, port):
            r = requests.get('http://{}:{}'.format(host, port))

            assert r.status_code == 200
            assert r.text == u'<doctype html><html><body>ジェーピーニック</body></html>'
            assert r.headers['Content-Type'] == 'text/html; charset=UTF-8'
Ejemplo n.º 29
0
    def test_request_recovery_with_bigger_timeout(self):
        """a biggest timeout can be specified"""
        server = Server.basic_response_server(request_timeout=3)
        data = b'bananadine'

        with server as address:
            sock = socket.socket()
            sock.connect(address)
            time.sleep(1.5)
            sock.sendall(data)
            sock.close()

        assert server.handler_results[0] == data
Ejemplo n.º 30
0
def test_chunked_upload():
    """can safely send generators"""
    close_server = threading.Event()
    server = Server.basic_response_server(wait_to_close_event=close_server)
    data = iter([b'a', b'b', b'c'])

    with server as (host, port):
        url = 'http://{0}:{1}/'.format(host, port)
        r = requests.post(url, data=data, stream=True)
        close_server.set()  # release server block

    assert r.status_code == 200
    assert r.request.headers['Transfer-Encoding'] == 'chunked'
Ejemplo n.º 31
0
    def test_json_bom_response(self):
        """the text_response_server sends the given JSON with UTF-8 BOM"""
        server = Server.text_response_server(
            "HTTP/1.1 200 OK\r\n" +
            "Content-Type: application/json; charset=utf-8\r\n" +
            u'\r\n\ufeff{"success": true}')

        with server as (host, port):
            r = requests.get('http://{}:{}'.format(host, port))

            assert r.status_code == 200
            assert r.json() == {'success': True}
            assert r.headers[
                'Content-Type'] == 'application/json; charset=utf-8'
Ejemplo n.º 32
0
def test_incorrect_content_length():
    """Test ConnectionError raised for incomplete responses"""
    close_server = threading.Event()
    server = Server.text_response_server("HTTP/1.1 200 OK\r\n" +
                                         "Content-Length: 50\r\n\r\n" +
                                         "Hello World.")
    with server as (host, port):
        url = "http://{0}:{1}/".format(host, port)
        r = requests.Request("GET", url).prepare()
        s = requests.Session()
        with pytest.raises(requests.exceptions.ConnectionError) as e:
            resp = s.send(r)
        assert "12 bytes read, 38 more expected" in str(e)
        close_server.set()  # release server block
Ejemplo n.º 33
0
    def test_multiple_requests(self):
        """multiple requests can be served"""
        requests_to_handle = 5

        server = Server.basic_response_server(requests_to_handle=requests_to_handle)

        with server as (host, port):
            server_url = 'http://{}:{}'.format(host, port)
            for _ in range(requests_to_handle):
                r = requests.get(server_url)
                assert r.status_code == 200

            # the (n+1)th request fails
            with pytest.raises(requests.exceptions.ConnectionError):
                r = requests.get(server_url)
Ejemplo n.º 34
0
def test_use_proxy_from_environment(httpbin, var, scheme):
    url = "{0}://httpbin.org".format(scheme)
    fake_proxy = Server(
    )  # do nothing with the requests; just close the socket
    with fake_proxy as (host, port):
        proxy_url = "socks5://{}:{}".format(host, port)
        kwargs = {var: proxy_url}
        with override_environ(**kwargs):
            # fake proxy's lack of response will cause a ConnectionError
            with pytest.raises(requests.exceptions.ConnectionError):
                requests.get(url)
        # the fake proxy received a request
        assert len(fake_proxy.handler_results) == 1
        # it had actual content (not checking for SOCKS protocol for now)
        assert len(fake_proxy.handler_results[0]) > 0
Ejemplo n.º 35
0
def test_chunked_upload_uses_only_specified_host_header():
    """Ensure we use only the specified Host header for chunked requests."""
    close_server = threading.Event()
    server = Server(echo_response_handler, wait_to_close_event=close_server)

    data = iter([b"a", b"b", b"c"])
    custom_host = "sample-host"

    with server as (host, port):
        url = f"http://{host}:{port}/"
        r = requests.post(url, data=data, headers={"Host": custom_host}, stream=True)
        close_server.set()  # release server block

    expected_header = b"Host: %s\r\n" % custom_host.encode("utf-8")
    assert expected_header in r.content
    assert r.content.count(b"Host: ") == 1
Ejemplo n.º 36
0
def test_chunked_upload_doesnt_skip_host_header():
    """Ensure we don't omit all Host headers with chunked requests."""
    close_server = threading.Event()
    server = Server(echo_response_handler, wait_to_close_event=close_server)

    data = iter([b'a', b'b', b'c'])

    with server as (host, port):
        expected_host = '{}:{}'.format(host, port)
        url = 'http://{}:{}/'.format(host, port)
        r = requests.post(url, data=data, stream=True)
        close_server.set()  # release server block

    expected_header = b'Host: %s\r\n' % expected_host.encode('utf-8')
    assert expected_header in r.content
    assert r.content.count(b'Host: ') == 1
Ejemplo n.º 37
0
 def test_basic(self):
     """messages are sent and received properly"""
     question = b"sucess?"
     answer = b"yeah, success"
     def handler(sock):
         text = sock.recv(1000)
         assert text == question 
         sock.sendall(answer)
     
     with Server(handler) as (host, port):
         sock = socket.socket()
         sock.connect((host, port))
         sock.sendall(question)
         text = sock.recv(1000)
         assert text == answer
         sock.close()
Ejemplo n.º 38
0
def test_chunked_upload_doesnt_skip_host_header():
    """Ensure we don't omit all Host headers with chunked requests."""
    close_server = threading.Event()
    server = Server(echo_response_handler, wait_to_close_event=close_server)

    data = iter([b"a", b"b", b"c"])

    with server as (host, port):
        expected_host = f"{host}:{port}"
        url = f"http://{host}:{port}/"
        r = requests.post(url, data=data, stream=True)
        close_server.set()  # release server block

    expected_header = b"Host: %s\r\n" % expected_host.encode("utf-8")
    assert expected_header in r.content
    assert r.content.count(b"Host: ") == 1
Ejemplo n.º 39
0
 def test_request_recovery(self):
     """can check the requests content"""
     # TODO: figure out why this sometimes fails when using pytest-xdist.
     server = Server.basic_response_server(requests_to_handle=2)
     first_request = b'put your hands up in the air'
     second_request = b'put your hand down in the floor'
     with server as address:
         sock1 = socket.socket()
         sock2 = socket.socket()
         sock1.connect(address)
         sock1.sendall(first_request)
         sock1.close()
         sock2.connect(address)
         sock2.sendall(second_request)
         sock2.close()
     assert server.handler_results[0] == first_request
     assert server.handler_results[1] == second_request
Ejemplo n.º 40
0
def test_digestauth_401_only_sent_once():
    """Ensure we correctly respond to a 401 challenge once, and then
    stop responding if challenged again.
    """
    text_401 = (
        b'HTTP/1.1 401 UNAUTHORIZED\r\n'
        b'Content-Length: 0\r\n'
        b'WWW-Authenticate: Digest nonce="6bf5d6e4da1ce66918800195d6b9130d"'
        b', opaque="372825293d1c26955496c80ed6426e9e", '
        b'realm="*****@*****.**", qop=auth\r\n\r\n')

    expected_digest = (b'Authorization: Digest username="******", '
                       b'realm="*****@*****.**", '
                       b'nonce="6bf5d6e4da1ce66918800195d6b9130d", uri="/"')

    auth = requests.auth.HTTPDigestAuth('user', 'pass')

    def digest_failed_response_handler(sock):
        # Respond to initial GET with a challenge.
        request_content = consume_socket_content(sock, timeout=0.5)
        assert request_content.startswith(b"GET / HTTP/1.1")
        sock.send(text_401)

        # Verify we receive an Authorization header in response, then
        # challenge again.
        request_content = consume_socket_content(sock, timeout=0.5)
        assert expected_digest in request_content
        sock.send(text_401)

        # Verify the client didn't respond to second challenge.
        request_content = consume_socket_content(sock, timeout=0.5)
        assert request_content == b''

        return request_content

    close_server = threading.Event()
    server = Server(digest_failed_response_handler,
                    wait_to_close_event=close_server)

    with server as (host, port):
        url = 'http://{0}:{1}/'.format(host, port)
        r = requests.get(url, auth=auth)
        # Verify server didn't authenticate us.
        assert r.status_code == 401
        assert r.history[0].status_code == 401
        close_server.set()
Ejemplo n.º 41
0
def test_chunked_encoding_error():
    """get a ChunkedEncodingError if the server returns a bad response"""
    def incomplete_chunked_response_handler(sock):
        request_content = consume_socket_content(sock, timeout=0.5)

        # The server never ends the request and doesn't provide any valid chunks
        sock.send(b"HTTP/1.1 200 OK\r\n" + b"Transfer-Encoding: chunked\r\n")

        return request_content

    close_server = threading.Event()
    server = Server(incomplete_chunked_response_handler)

    with server as (host, port):
        url = 'http://{}:{}/'.format(host, port)
        with pytest.raises(requests.exceptions.ChunkedEncodingError):
            r = requests.get(url)
        close_server.set()  # release server block
Ejemplo n.º 42
0
    def test_request_recovery(self):
        """can check the requests content"""
        server = Server.basic_response_server(requests_to_handle=2)
        first_request = b'put your hands up in the air'
        second_request = b'put your hand down in the floor'

        with server as address:
            sock1 = socket.socket()
            sock2 = socket.socket()

            sock1.connect(address)
            sock1.sendall(first_request)
            sock1.close()

            sock2.connect(address)
            sock2.sendall(second_request)
            sock2.close()

        assert server.handler_results[0] == first_request
        assert server.handler_results[1] == second_request