diff venv/lib/python2.7/site-packages/requests_toolbelt/auth/guess.py @ 0:d67268158946 draft

planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
author bcclaywell
date Mon, 12 Oct 2015 17:43:33 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/venv/lib/python2.7/site-packages/requests_toolbelt/auth/guess.py	Mon Oct 12 17:43:33 2015 -0400
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+"""The module containing the code for GuessAuth."""
+from requests import auth
+from requests import cookies
+
+
+class GuessAuth(auth.AuthBase):
+    """Guesses the auth type by the WWW-Authentication header."""
+    def __init__(self, username, password):
+        self.username = username
+        self.password = password
+        self.auth = None
+        self.pos = None
+
+    def handle_401(self, r, **kwargs):
+        """Resends a request with auth headers, if needed."""
+
+        www_authenticate = r.headers.get('www-authenticate', '').lower()
+
+        if 'basic' in www_authenticate:
+            if self.pos is not None:
+                r.request.body.seek(self.pos)
+
+            # Consume content and release the original connection
+            # to allow our new request to reuse the same one.
+            r.content
+            r.raw.release_conn()
+            prep = r.request.copy()
+            if not hasattr(prep, '_cookies'):
+                prep._cookies = cookies.RequestsCookieJar()
+            cookies.extract_cookies_to_jar(prep._cookies, r.request, r.raw)
+            prep.prepare_cookies(prep._cookies)
+
+            self.auth = auth.HTTPBasicAuth(self.username, self.password)
+            prep = self.auth(prep)
+            _r = r.connection.send(prep, **kwargs)
+            _r.history.append(r)
+            _r.request = prep
+
+            return _r
+
+        if 'digest' in www_authenticate:
+            self.auth = auth.HTTPDigestAuth(self.username, self.password)
+            # Digest auth would resend the request by itself. We can take a
+            # shortcut here.
+            return self.auth.handle_401(r, **kwargs)
+
+    def __call__(self, request):
+        if self.auth is not None:
+            return self.auth(request)
+
+        try:
+            self.pos = request.body.tell()
+        except AttributeError:
+            pass
+
+        request.register_hook('response', self.handle_401)
+        return request