def test_header_encodings(elasticapm_client): """ Tests that headers are encoded as bytestrings. If they aren't, urllib assumes it needs to encode the data as well, which is already a zlib encoded bytestring, and explodes. """ headers = {compat.text_type("X"): compat.text_type("V")} elasticapm_client.server_version = (8, 0 ) # avoid making server_info request transport = Transport("http://localhost:9999", headers=headers, client=elasticapm_client) transport.start_thread() try: with mock.patch("elasticapm.transport.http.urllib3.PoolManager.urlopen" ) as mock_urlopen: mock_urlopen.return_value = mock.Mock(status=202) transport.send("") _, args, kwargs = mock_urlopen.mock_calls[0] if compat.PY2: assert isinstance(args[1], compat.binary_type) for k, v in kwargs["headers"].items(): assert isinstance(k, compat.binary_type) assert isinstance(v, compat.binary_type) finally: transport.close()
def test_ssl_cert_pinning_fails(waiting_httpsserver, elasticapm_client): if compat.PY3: waiting_httpsserver.serve_content( code=202, content="", headers={"Location": "https://example.com/foo"}) url = waiting_httpsserver.url else: # if we use the local test server here, execution blocks somewhere deep in OpenSSL on Python 2.7, presumably # due to a threading issue that has been fixed in later versions. To avoid that, we have to commit a minor # cardinal sin here and do an outside request to https://example.com (which will also fail the fingerprint # assertion). # # May the Testing Goat have mercy on our souls. url = "https://example.com" transport = Transport( url, server_cert=os.path.join(os.path.dirname(__file__), "wrong_cert.pem"), verify_server_cert=True, client=elasticapm_client, ) transport.start_thread() try: with pytest.raises(TransportException) as exc_info: transport.send(compat.b("x")) finally: transport.close() assert "Fingerprints did not match" in exc_info.value.args[0]
def test_send(waiting_httpserver, elasticapm_client): waiting_httpserver.serve_content(code=202, content="", headers={"Location": "http://example.com/foo"}) transport = Transport(waiting_httpserver.url, client=elasticapm_client) transport.start_thread() try: url = transport.send(compat.b("x")) assert url == "http://example.com/foo" finally: transport.close()
def test_timeout(mock_urlopen, elasticapm_client): transport = Transport("http://localhost", timeout=5, client=elasticapm_client) transport.start_thread() mock_urlopen.side_effect = MaxRetryError(None, None, reason=TimeoutError()) try: with pytest.raises(TransportException) as exc_info: transport.send("x") assert "timeout" in str(exc_info.value) finally: transport.close()
def test_ssl_verify_fails(waiting_httpsserver, elasticapm_client): waiting_httpsserver.serve_content(code=202, content="", headers={"Location": "http://example.com/foo"}) transport = Transport(waiting_httpsserver.url, client=elasticapm_client) transport.start_thread() try: with pytest.raises(TransportException) as exc_info: url = transport.send(compat.b("x")) assert "certificate verify failed" in str(exc_info) finally: transport.close()
def test_http_error(waiting_httpserver, elasticapm_client): waiting_httpserver.serve_content(code=418, content="I'm a teapot") transport = Transport(waiting_httpserver.url, client=elasticapm_client) transport.start_thread() try: with pytest.raises(TransportException) as exc_info: transport.send("x") for val in (418, "I'm a teapot"): assert str(val) in str(exc_info.value) finally: transport.close()
def test_generic_error(mock_urlopen, elasticapm_client): url, status, message, body = ("http://localhost:9999", 418, "I'm a teapot", "Nothing") transport = Transport(url, client=elasticapm_client) transport.start_thread() mock_urlopen.side_effect = Exception("Oopsie") try: with pytest.raises(TransportException) as exc_info: transport.send("x") assert "Oopsie" in str(exc_info.value) finally: transport.close()
def test_ssl_verify_disable_http(waiting_httpserver, elasticapm_client): """ Make sure that ``assert_hostname`` isn't passed in for http requests, even with verify_server_cert=False """ waiting_httpserver.serve_content(code=202, content="", headers={"Location": "http://example.com/foo"}) transport = Transport(waiting_httpserver.url, verify_server_cert=False, client=elasticapm_client) transport.start_thread() try: url = transport.send(compat.b("x")) assert url == "http://example.com/foo" finally: transport.close()
def test_ssl_cert_pinning(waiting_httpsserver, elasticapm_client): waiting_httpsserver.serve_content(code=202, content="", headers={"Location": "https://example.com/foo"}) cur_dir = os.path.dirname(os.path.realpath(__file__)) transport = Transport( waiting_httpsserver.url, server_cert=os.path.join(cur_dir, "..", "ca/server.pem"), verify_server_cert=True, client=elasticapm_client, ) transport.start_thread() try: url = transport.send(compat.b("x")) assert url == "https://example.com/foo" finally: transport.close()
def test_ssl_cert_pinning_http(waiting_httpserver, elasticapm_client): """ Won't fail, as with the other cert pinning test, since certs aren't relevant for http, only https. """ waiting_httpserver.serve_content(code=202, content="", headers={"Location": "http://example.com/foo"}) transport = Transport( waiting_httpserver.url, server_cert=os.path.join(os.path.dirname(__file__), "wrong_cert.pem"), verify_server_cert=True, client=elasticapm_client, ) transport.start_thread() try: url = transport.send(compat.b("x")) assert url == "http://example.com/foo" finally: transport.close()