import requests
from io import BytesIO, SEEK_SET, SEEK_END
from tempfile import NamedTemporaryFile
from pathlib import Path
[docs]class ResponseFile(object):
def __init__(self, content):
self._tmpfile = NamedTemporaryFile("wb")
self._tmpfile.write(content)
self._tmpfile.seek(0)
@property
def name(self):
return self._tmpfile.name
[docs] def open(self):
return self._tmpfile
[docs]class ResponseStream(object):
def __init__(self, request_iter):
self._bytes = BytesIO()
self._iterator = request_iter
def _load_all(self):
self._bytes.seek(0, SEEK_END)
for chunk in self._iterator:
self._bytes.write(chunk)
def _load_until(self, end_position):
current_position = self._bytes.seek(0, SEEK_END)
while current_position < end_position:
try:
current_position += self._bytes.write(next(self._iterator))
except StopIteration:
break
[docs] def tell(self):
return self._bytes.tell()
[docs] def read(self, size=None):
current_position = self._bytes.tell()
if size is None:
self._load_all()
else:
end_position = current_position + size
self._load_until(end_position)
self._bytes.seek(current_position)
return self._bytes.read(size)
[docs] def seek(self, position, whence=SEEK_SET):
if whence == SEEK_END:
self._load_all()
else:
self._bytes.seek(position, whence)