summaryrefslogtreecommitdiff
path: root/tests/fixtureapps/filewrapper.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/fixtureapps/filewrapper.py')
-rw-r--r--tests/fixtureapps/filewrapper.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/tests/fixtureapps/filewrapper.py b/tests/fixtureapps/filewrapper.py
new file mode 100644
index 0000000..63df5a6
--- /dev/null
+++ b/tests/fixtureapps/filewrapper.py
@@ -0,0 +1,93 @@
+import io
+import os
+
+here = os.path.dirname(os.path.abspath(__file__))
+fn = os.path.join(here, "groundhog1.jpg")
+
+
+class KindaFilelike(object): # pragma: no cover
+ def __init__(self, bytes):
+ self.bytes = bytes
+
+ def read(self, n):
+ bytes = self.bytes[:n]
+ self.bytes = self.bytes[n:]
+ return bytes
+
+
+class UnseekableIOBase(io.RawIOBase): # pragma: no cover
+ def __init__(self, bytes):
+ self.buf = io.BytesIO(bytes)
+
+ def writable(self):
+ return False
+
+ def readable(self):
+ return True
+
+ def seekable(self):
+ return False
+
+ def read(self, n):
+ return self.buf.read(n)
+
+
+def app(environ, start_response): # pragma: no cover
+ path_info = environ["PATH_INFO"]
+ if path_info.startswith("/filelike"):
+ f = open(fn, "rb")
+ f.seek(0, 2)
+ cl = f.tell()
+ f.seek(0)
+ if path_info == "/filelike":
+ headers = [
+ ("Content-Length", str(cl)),
+ ("Content-Type", "image/jpeg"),
+ ]
+ elif path_info == "/filelike_nocl":
+ headers = [("Content-Type", "image/jpeg")]
+ elif path_info == "/filelike_shortcl":
+ # short content length
+ headers = [
+ ("Content-Length", "1"),
+ ("Content-Type", "image/jpeg"),
+ ]
+ else:
+ # long content length (/filelike_longcl)
+ headers = [
+ ("Content-Length", str(cl + 10)),
+ ("Content-Type", "image/jpeg"),
+ ]
+ else:
+ with open(fn, "rb") as fp:
+ data = fp.read()
+ cl = len(data)
+ f = KindaFilelike(data)
+ if path_info == "/notfilelike":
+ headers = [
+ ("Content-Length", str(len(data))),
+ ("Content-Type", "image/jpeg"),
+ ]
+ elif path_info == "/notfilelike_iobase":
+ headers = [
+ ("Content-Length", str(len(data))),
+ ("Content-Type", "image/jpeg"),
+ ]
+ f = UnseekableIOBase(data)
+ elif path_info == "/notfilelike_nocl":
+ headers = [("Content-Type", "image/jpeg")]
+ elif path_info == "/notfilelike_shortcl":
+ # short content length
+ headers = [
+ ("Content-Length", "1"),
+ ("Content-Type", "image/jpeg"),
+ ]
+ else:
+ # long content length (/notfilelike_longcl)
+ headers = [
+ ("Content-Length", str(cl + 10)),
+ ("Content-Type", "image/jpeg"),
+ ]
+
+ start_response("200 OK", headers)
+ return environ["wsgi.file_wrapper"](f, 8192)