Last active
February 9, 2016 21:34
-
-
Save john-g-g/7407e94732f51da24b2f to your computer and use it in GitHub Desktop.
HTTP Transport Adapter for requests library which allows requests to be used on Google App Engine
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from requests.adapters import BaseAdapter | |
from requests.models import Response | |
from requests.cookies import extract_cookies_to_jar | |
from requests.utils import get_encoding_from_headers | |
from requests.structures import CaseInsensitiveDict | |
from urllib3.contrib.appengine import AppEngineManager | |
class GAEAdapter(BaseAdapter): | |
def __init__(self, headers=None, retries=None, validate_certificate=False): | |
super(GAEAdapter, self).__init__() | |
self.http = AppEngineManager() | |
def send(self, request, stream=None, timeout=None, verify=None, cert=None, | |
proxies=None, *kw): | |
resp = self.http.urlopen( | |
method=request.method, | |
url=request.url, | |
body=request.body, | |
headers=request.headers, | |
redirect=False) | |
return self.build_response(request, resp) | |
def build_response(self, req, resp): | |
"""Builds a :class:`Response <requests.Response>` object from a urllib3 | |
response. This should not be called from user code, and is only exposed | |
for use when subclassing the | |
:class:`HTTPAdapter <requests.adapters.HTTPAdapter>` | |
:param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. | |
:param resp: The urllib3 response object. | |
""" | |
response = Response() | |
# Fallback to None if there's no status_code, for whatever reason. | |
response.status_code = getattr(resp, 'status', None) | |
# Make headers case-insensitive. | |
response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) | |
# Set encoding. | |
response.encoding = get_encoding_from_headers(response.headers) | |
response._content = resp.data | |
response.reason = response.reason | |
if isinstance(req.url, bytes): | |
response.url = req.url.decode('utf-8') | |
else: | |
response.url = req.url | |
# Add new cookies from the server. | |
extract_cookies_to_jar(response.cookies, req, resp) | |
# Give the Response some context. | |
response.request = req | |
response.connection = self | |
return response |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage