mirror of
https://github.com/kennethreitz/requests.git
synced 2026-06-05 22:50:18 +00:00
Merge branch 'master' into proposed/3.0.0
This commit is contained in:
+44
-1
@@ -1650,7 +1650,7 @@ class TestRequests:
|
||||
def tell(self):
|
||||
return 0
|
||||
|
||||
def seek(self, pos):
|
||||
def seek(self, pos, whence=0):
|
||||
raise OSError()
|
||||
|
||||
def __iter__(self):
|
||||
@@ -1924,6 +1924,49 @@ class TestRequests:
|
||||
assert 'Transfer-Encoding' in prepared_request.headers
|
||||
assert 'Content-Length' not in prepared_request.headers
|
||||
|
||||
def test_custom_redirect_mixin(self, httpbin):
|
||||
"""Tests a custom mixin to overwrite ``get_redirect_target``.
|
||||
|
||||
Ensures a subclassed ``requests.Session`` can handle a certain type of
|
||||
malformed redirect responses.
|
||||
|
||||
1. original request receives a proper response: 302 redirect
|
||||
2. following the redirect, a malformed response is given:
|
||||
status code = HTTP 200
|
||||
location = alternate url
|
||||
3. the custom session catches the edge case and follows the redirect
|
||||
"""
|
||||
url_final = httpbin('html')
|
||||
querystring_malformed = urlencode({'location': url_final})
|
||||
url_redirect_malformed = httpbin('response-headers?%s' % querystring_malformed)
|
||||
querystring_redirect = urlencode({'url': url_redirect_malformed})
|
||||
url_redirect = httpbin('redirect-to?%s' % querystring_redirect)
|
||||
urls_test = [url_redirect,
|
||||
url_redirect_malformed,
|
||||
url_final,
|
||||
]
|
||||
|
||||
class CustomRedirectSession(requests.Session):
|
||||
def get_redirect_target(self, resp):
|
||||
# default behavior
|
||||
if resp.is_redirect:
|
||||
return resp.headers['location']
|
||||
# edge case - check to see if 'location' is in headers anyways
|
||||
location = resp.headers.get('location')
|
||||
if location and (location != resp.url):
|
||||
return location
|
||||
return None
|
||||
|
||||
session = CustomRedirectSession()
|
||||
r = session.get(urls_test[0])
|
||||
assert len(r.history) == 2
|
||||
assert r.status_code == 200
|
||||
assert r.history[0].status_code == 302
|
||||
assert r.history[0].is_redirect
|
||||
assert r.history[1].status_code == 200
|
||||
assert not r.history[1].is_redirect
|
||||
assert r.url == urls_test[2]
|
||||
|
||||
|
||||
class TestCaseInsensitiveDict:
|
||||
|
||||
|
||||
+49
-3
@@ -161,7 +161,7 @@ class TestGetEnvironProxies:
|
||||
'http://localhost.localdomain:5000/v1.0/',
|
||||
))
|
||||
def test_bypass(self, url):
|
||||
assert get_environ_proxies(url) == {}
|
||||
assert get_environ_proxies(url, no_proxy=None) == {}
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'url', (
|
||||
@@ -170,7 +170,32 @@ class TestGetEnvironProxies:
|
||||
'http://www.requests.com/',
|
||||
))
|
||||
def test_not_bypass(self, url):
|
||||
assert get_environ_proxies(url) != {}
|
||||
assert get_environ_proxies(url, no_proxy=None) != {}
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'url', (
|
||||
'http://192.168.1.1:5000/',
|
||||
'http://192.168.1.1/',
|
||||
'http://www.requests.com/',
|
||||
))
|
||||
def test_bypass_no_proxy_keyword(self, url):
|
||||
no_proxy = '192.168.1.1,requests.com'
|
||||
assert get_environ_proxies(url, no_proxy=no_proxy) == {}
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'url', (
|
||||
'http://192.168.0.1:5000/',
|
||||
'http://192.168.0.1/',
|
||||
'http://172.16.1.1/',
|
||||
'http://172.16.1.1:5000/',
|
||||
'http://localhost.localdomain:5000/v1.0/',
|
||||
))
|
||||
def test_not_bypass_no_proxy_keyword(self, url, monkeypatch):
|
||||
# This is testing that the 'no_proxy' argument overrides the
|
||||
# environment variable 'no_proxy'
|
||||
monkeypatch.setenv('http_proxy', 'http://proxy.example.com:3128/')
|
||||
no_proxy = '192.168.1.1,requests.com'
|
||||
assert get_environ_proxies(url, no_proxy=no_proxy) != {}
|
||||
|
||||
|
||||
class TestIsIPv4Address:
|
||||
@@ -525,7 +550,7 @@ def test_should_bypass_proxies(url, expected, monkeypatch):
|
||||
"""
|
||||
monkeypatch.setenv('no_proxy', '192.168.0.0/24,127.0.0.1,localhost.localdomain,172.16.1.1')
|
||||
monkeypatch.setenv('NO_PROXY', '192.168.0.0/24,127.0.0.1,localhost.localdomain,172.16.1.1')
|
||||
assert should_bypass_proxies(url) == expected
|
||||
assert should_bypass_proxies(url, no_proxy=None) == expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
@@ -553,3 +578,24 @@ def test_add_dict_to_cookiejar(cookiejar):
|
||||
)
|
||||
def test_unicode_is_ascii(value, expected):
|
||||
assert unicode_is_ascii(value) is expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'url, expected', (
|
||||
('http://192.168.0.1:5000/', True),
|
||||
('http://192.168.0.1/', True),
|
||||
('http://172.16.1.1/', True),
|
||||
('http://172.16.1.1:5000/', True),
|
||||
('http://localhost.localdomain:5000/v1.0/', True),
|
||||
('http://172.16.1.12/', False),
|
||||
('http://172.16.1.12:5000/', False),
|
||||
('http://google.com:5000/v1.0/', False),
|
||||
))
|
||||
def test_should_bypass_proxies_no_proxy(
|
||||
url, expected, monkeypatch):
|
||||
"""Tests for function should_bypass_proxies to check if proxy
|
||||
can be bypassed or not using the 'no_proxy' argument
|
||||
"""
|
||||
no_proxy = '192.168.0.0/24,127.0.0.1,localhost.localdomain,172.16.1.1'
|
||||
# Test 'no_proxy' argument
|
||||
assert should_bypass_proxies(url, no_proxy=no_proxy) == expected
|
||||
|
||||
Reference in New Issue
Block a user