Index: client/third_party/google/auth/transport/_http_client.py |
diff --git a/client/third_party/google/auth/transport/_http_client.py b/client/third_party/google/auth/transport/_http_client.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3cf5583eeb321161ed849f46e772a2ee3ffba724 |
--- /dev/null |
+++ b/client/third_party/google/auth/transport/_http_client.py |
@@ -0,0 +1,111 @@ |
+# Copyright 2016 Google Inc. |
+# |
+# Licensed under the Apache License, Version 2.0 (the "License"); |
+# you may not use this file except in compliance with the License. |
+# You may obtain a copy of the License at |
+# |
+# http://www.apache.org/licenses/LICENSE-2.0 |
+# |
+# Unless required by applicable law or agreed to in writing, software |
+# distributed under the License is distributed on an "AS IS" BASIS, |
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+# See the License for the specific language governing permissions and |
+# limitations under the License. |
+ |
+"""Transport adapter for http.client, for internal use only.""" |
+ |
+import logging |
+import socket |
+ |
+from six.moves import http_client |
+from six.moves import urllib |
+ |
+from google.auth import exceptions |
+from google.auth import transport |
+ |
+_LOGGER = logging.getLogger(__name__) |
+ |
+ |
+class Response(transport.Response): |
+ """http.client transport response adapter. |
+ |
+ Args: |
+ response (http.client.HTTPResponse): The raw http client response. |
+ """ |
+ def __init__(self, response): |
+ self._status = response.status |
+ self._headers = { |
+ key.lower(): value for key, value in response.getheaders()} |
+ self._data = response.read() |
+ |
+ @property |
+ def status(self): |
+ return self._status |
+ |
+ @property |
+ def headers(self): |
+ return self._headers |
+ |
+ @property |
+ def data(self): |
+ return self._data |
+ |
+ |
+class Request(transport.Request): |
+ """http.client transport request adapter.""" |
+ |
+ def __call__(self, url, method='GET', body=None, headers=None, |
+ timeout=None, **kwargs): |
+ """Make an HTTP request using http.client. |
+ |
+ Args: |
+ url (str): The URI to be requested. |
+ method (str): The HTTP method to use for the request. Defaults |
+ to 'GET'. |
+ body (bytes): The payload / body in HTTP request. |
+ headers (Mapping): Request headers. |
+ timeout (Optional(int)): The number of seconds to wait for a |
+ response from the server. If not specified or if None, the |
+ socket global default timeout will be used. |
+ kwargs: Additional arguments passed throught to the underlying |
+ :meth:`~http.client.HTTPConnection.request` method. |
+ |
+ Returns: |
+ Response: The HTTP response. |
+ |
+ Raises: |
+ google.auth.exceptions.TransportError: If any exception occurred. |
+ """ |
+ # socket._GLOBAL_DEFAULT_TIMEOUT is the default in http.client. |
+ if timeout is None: |
+ timeout = socket._GLOBAL_DEFAULT_TIMEOUT |
+ |
+ # http.client doesn't allow None as the headers argument. |
+ if headers is None: |
+ headers = {} |
+ |
+ # http.client needs the host and path parts specified separately. |
+ parts = urllib.parse.urlsplit(url) |
+ path = urllib.parse.urlunsplit( |
+ ('', '', parts.path, parts.query, parts.fragment)) |
+ |
+ if parts.scheme != 'http': |
+ raise exceptions.TransportError( |
+ 'http.client transport only supports the http scheme, {}' |
+ 'was specified'.format(parts.scheme)) |
+ |
+ connection = http_client.HTTPConnection(parts.netloc) |
+ |
+ try: |
+ _LOGGER.debug('Making request: %s %s', method, url) |
+ |
+ connection.request( |
+ method, path, body=body, headers=headers, **kwargs) |
+ response = connection.getresponse() |
+ return Response(response) |
+ |
+ except (http_client.HTTPException, socket.error) as exc: |
+ raise exceptions.TransportError(exc) |
+ |
+ finally: |
+ connection.close() |