summaryrefslogtreecommitdiff
path: root/openid
diff options
context:
space:
mode:
authorVlastimil Zíma <vlastimil.zima@nic.cz>2018-05-02 13:17:04 +0200
committerVlastimil Zíma <vlastimil.zima@nic.cz>2018-05-02 13:17:04 +0200
commit05e4a307a0edcc38b4a5f902610f067b1e058645 (patch)
treed3347eeecac63cca96541c5c7f96205c09c28fbb /openid
parentf7da776f0127f28e526dde3ac14bedcd2c98a526 (diff)
downloadopenid-05e4a307a0edcc38b4a5f902610f067b1e058645.tar.gz
Update default fetcher selection
Diffstat (limited to 'openid')
-rw-r--r--openid/fetchers.py17
-rw-r--r--openid/test/test_fetchers.py31
2 files changed, 43 insertions, 5 deletions
diff --git a/openid/fetchers.py b/openid/fetchers.py
index fa25184..2328fc9 100644
--- a/openid/fetchers.py
+++ b/openid/fetchers.py
@@ -52,11 +52,20 @@ def fetch(url, body=None, headers=None):
def createHTTPFetcher():
"""Create a default HTTP fetcher instance
- prefers Curl to urllib2."""
- if pycurl is None:
- fetcher = Urllib2Fetcher()
- else:
+ Preferences:
+ 1. requests
+ 2. curl
+ 3. httplib2
+ 4. urllib2
+ """
+ if requests is not None:
+ fetcher = RequestsFetcher()
+ elif pycurl is not None:
fetcher = CurlHTTPFetcher()
+ elif httplib2 is not None:
+ fetcher = HTTPLib2Fetcher()
+ else:
+ fetcher = Urllib2Fetcher()
return fetcher
diff --git a/openid/test/test_fetchers.py b/openid/test/test_fetchers.py
index 36698ba..57b9089 100644
--- a/openid/test/test_fetchers.py
+++ b/openid/test/test_fetchers.py
@@ -7,7 +7,7 @@ from cStringIO import StringIO
from urllib import addinfourl
import responses
-from mock import Mock
+from mock import Mock, patch, sentinel
from openid import fetchers
@@ -18,6 +18,35 @@ except ImportError:
else:
from requests.exceptions import ConnectionError, InvalidSchema
+
+class TestHTTPLib2Fetcher(object):
+ """Mock of HTTPLib2Fetcher for test of fetcher selection."""
+
+
+class TestCreateHTTPFetcher(unittest.TestCase):
+ """Test default selection of `createHTTPFetcher` function."""
+
+ fetcher_selection = {
+ # (requests, pycurl, httplib2) -> fetcher
+ (sentinel.requests, sentinel.pycurl, sentinel.httplib2): fetchers.RequestsFetcher,
+ (sentinel.requests, sentinel.pycurl, None): fetchers.RequestsFetcher,
+ (sentinel.requests, None, sentinel.httplib2): fetchers.RequestsFetcher,
+ (sentinel.requests, None, None): fetchers.RequestsFetcher,
+ (None, sentinel.pycurl, sentinel.httplib2): fetchers.CurlHTTPFetcher,
+ (None, sentinel.pycurl, None): fetchers.CurlHTTPFetcher,
+ (None, None, sentinel.httplib2): TestHTTPLib2Fetcher,
+ (None, None, None): fetchers.Urllib2Fetcher,
+ }
+
+ def test_requests(self):
+ for (requests, pycurl, httplib2), fetcher_cls in self.fetcher_selection.items():
+ with patch.multiple(fetchers, requests=requests, pycurl=pycurl, httplib2=httplib2,
+ # HTTPLib2Fetcher actually calls httplib2 on init.
+ # Patch it as it's not necessary for selection test.
+ HTTPLib2Fetcher=TestHTTPLib2Fetcher):
+ self.assertIsInstance(fetchers.createHTTPFetcher(), fetcher_cls)
+
+
# XXX: make these separate test cases