Skip to content

Instantly share code, notes, and snippets.

@john-g-g
Last active February 9, 2016 21:34
Show Gist options
  • Save john-g-g/7407e94732f51da24b2f to your computer and use it in GitHub Desktop.
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
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
@john-g-g
Copy link
Author

john-g-g commented Feb 8, 2016

Usage

from collections import OrderedDict

import requests
from adapter import GAEAdapter

gae_adapter = GAEAdapter()
s = requests.Session()
s.adapters = OrderedDict()
s.mount('http',gae_adapter)

s.get('https://google.com')

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment