diff --git a/tests/integration/cassettes/DoAsyncRequesttest_httpx_test_test_behind_proxy.yml b/tests/integration/cassettes/DoAsyncRequesttest_httpx_test_test_behind_proxy.yml new file mode 100644 index 0000000..be02476 --- /dev/null +++ b/tests/integration/cassettes/DoAsyncRequesttest_httpx_test_test_behind_proxy.yml @@ -0,0 +1,33 @@ +interactions: +- request: + body: '' + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate, br + connection: + - keep-alive + host: + - httpbin.org + user-agent: + - python-httpx/0.12.1 + method: GET + uri: https://httpbin.org/headers + response: + content: "{\n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\"\ + : \"gzip, deflate, br\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\"\ + : \"python-httpx/0.12.1\", \n \"X-Amzn-Trace-Id\": \"Root=1-5ea778c9-ea76170da792abdbf7614067\"\ + \n }\n}\n" + headers: + access-control-allow-credentials: 'true' + access-control-allow-origin: '*' + connection: keep-alive + content-length: '226' + content-type: application/json + date: Tue, 28 Apr 2020 00:28:57 GMT + server: gunicorn/19.9.0 + via: my_own_proxy + http_version: HTTP/1.1 + status_code: 200 +version: 1 diff --git a/tests/integration/cassettes/DoSyncRequesttest_httpx_test_test_behind_proxy.yml b/tests/integration/cassettes/DoSyncRequesttest_httpx_test_test_behind_proxy.yml new file mode 100644 index 0000000..a9382c1 --- /dev/null +++ b/tests/integration/cassettes/DoSyncRequesttest_httpx_test_test_behind_proxy.yml @@ -0,0 +1,43 @@ +interactions: +- request: + body: null + headers: + accept: + - '*/*' + accept-encoding: + - gzip, deflate, br + connection: + - keep-alive + host: + - httpbin.org + user-agent: + - python-httpx/0.12.1 + method: GET + uri: https://localhost:8080/headers + response: + body: + string: "{\n \"headers\": {\n \"Accept\": \"*/*\", \n \"Accept-Encoding\"\ + : \"gzip, deflate, br\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\"\ + : \"python-httpx/0.12.1\", \n \"X-Amzn-Trace-Id\": \"Root=1-5ea778ca-c402f3ae901e78b3435b0a0c\"\ + \n }\n}\n" + headers: + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Origin: + - '*' + Connection: + - keep-alive + Content-Length: + - '226' + Content-Type: + - application/json + Date: + - Tue, 28 Apr 2020 00:28:58 GMT + Server: + - gunicorn/19.9.0 + Via: + - my_own_proxy + status: + code: 200 + message: OK +version: 1 diff --git a/tests/integration/test_httpx.py b/tests/integration/test_httpx.py index fee9eeb..141419f 100644 --- a/tests/integration/test_httpx.py +++ b/tests/integration/test_httpx.py @@ -1,6 +1,7 @@ from unittest.mock import MagicMock import pytest import contextlib +import os import vcr # noqa: E402 from vcr.stubs.httpx_stubs import _get_next_url @@ -186,3 +187,27 @@ class TestGetNextUrl: response.url = "http://github.com/" response.headers = {} assert _get_next_url(response) is None + + +def test_behind_proxy(do_request): + # This is recorded because otherwise we should have a live proxy somewhere. + yml = ( + os.path.dirname(os.path.realpath(__file__)) + + "/cassettes/" + + do_request.__name__ + + "test_httpx_test_test_behind_proxy.yml" + ) + url = "https://httpbin.org/headers" + proxy = "http://localhost:8080" + proxies = {"http": proxy, "https": proxy} + + with vcr.use_cassette(yml): + response = do_request(proxies=proxies, verify=False)("GET", url) + + with vcr.use_cassette(yml) as cassette: + cassette_response = do_request(proxies=proxies, verify=False)("GET", url) + cassette_response.request.url == url + assert cassette.play_count == 1 + + assert cassette_response.headers["Via"] == "my_own_proxy", str(cassette_response.headers) + assert cassette_response.request.url == response.request.url diff --git a/vcr/stubs/httpx_stubs.py b/vcr/stubs/httpx_stubs.py index ff5011b..1f63502 100644 --- a/vcr/stubs/httpx_stubs.py +++ b/vcr/stubs/httpx_stubs.py @@ -68,7 +68,11 @@ def _record_responses(cassette, vcr_request, real_response): past_vcr_request = _make_vcr_request(past_real_response.request) cassette.append(past_vcr_request, _to_serialized_response(past_real_response)) - vcr_request = _make_vcr_request(real_response.request) + if real_response.history: + # If there was a redirection keep we want the request which will hold the + # final redirect value + vcr_request = _make_vcr_request(real_response.request) + cassette.append(vcr_request, _to_serialized_response(real_response)) return real_response