Skip to content

Instantly share code, notes, and snippets.

@ajtucker
Created March 3, 2020 09:35
Show Gist options
  • Select an option

  • Save ajtucker/ae0180476c50bc5d00e13bbe5f98aacd to your computer and use it in GitHub Desktop.

Select an option

Save ajtucker/ae0180476c50bc5d00e13bbe5f98aacd to your computer and use it in GitHub Desktop.
import requests
import functools
import os
from io import BytesIO
class Resp(BytesIO):
def __init__(self, stream, status=200, headers=None):
self.status = status
self.headers = headers or {}
self.reason = requests.status_codes._codes.get(
status, ['']
)[0].upper().replace('_', ' ')
BytesIO.__init__(self, stream)
@property
def _original_response(self):
return self
@property
def msg(self):
return self
def read(self, chunk_size, **kwargs):
return BytesIO.read(self, chunk_size)
def info(self):
return self
def get_all(self, name, default):
result = self.headers.get(name)
if not result:
return default
return [result]
def getheaders(self, name):
return self.get_all(name, [])
def release_conn(self):
self.close()
class LocalFileAdapter(requests.adapters.HTTPAdapter):
def build_response_from_file(self, request):
file_path = request.url[7:]
with open(file_path, 'rb') as file:
buff = bytearray(os.path.getsize(file_path))
file.readinto(buff)
resp = Resp(buff)
r = self.build_response(request, resp)
return r
def send(self, request, stream=False, timeout=None,
verify=True, cert=None, proxies=None):
return self.build_response_from_file(request)
def session_init_wrapper(old_init):
@functools.wraps(old_init)
def new_init(self):
old_init(self)
self.mount('file://', LocalFileAdapter())
return new_init
requests.Session.__init__ = session_init_wrapper(requests.Session.__init__)
print(requests.get('file://scratch.txt').text)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment