Skip to content

Instantly share code, notes, and snippets.

@ryang14
Last active June 13, 2021 12:54
Show Gist options
  • Save ryang14/2363dd1dc9c22b64e12dfcf5c7d64a4a to your computer and use it in GitHub Desktop.
Save ryang14/2363dd1dc9c22b64e12dfcf5c7d64a4a to your computer and use it in GitHub Desktop.
Serve file add-on for CircuitPython WSGI server
import os
import time
class ServeFile:
def __init__(self, app, path="", webpath=""):
self._app = app
self._path = path
self._webpath = webpath
# Common MIME types from https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
self.mime_types = {
"aac": "audio/aac",
"abw": "application/x-abiword",
"arc": "application/x-freearc",
"avi": "video/x-msvideo",
"azw": "application/vnd.amazon.ebook",
"bin": "application/octet-stream",
"bmp": "image/bmp",
"bz": "application/x-bzip",
"bz2": "application/x-bzip2",
"csh": "application/x-csh",
"css": "text/css",
"csv": "text/csv",
"doc": "application/msword",
"docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"eot": "application/vnd.ms-fontobject",
"epub": "application/epub+zip",
"gz": "application/gzip",
"gif": "image/gif",
"html": "text/html",
"htm": "text/html",
"ico": "image/vnd.microsoft.icon",
"ics": "text/calendar",
"jar": "application/java-archive",
"jpeg .jpg": "image/jpeg",
"js": "text/javascript",
"json": "application/json",
"jsonld": "application/ld+json",
"mid": "audio/midi",
"midi": "audio/midi",
"mjs": "text/javascript",
"mp3": "audio/mpeg",
"cda": "application/x-cdf",
"mp4": "video/mp4",
"mpeg": "video/mpeg",
"mpkg": "application/vnd.apple.installer+xml",
"odp": "application/vnd.oasis.opendocument.presentation",
"ods": "application/vnd.oasis.opendocument.spreadsheet",
"odt": "application/vnd.oasis.opendocument.text",
"oga": "audio/ogg",
"ogv": "video/ogg",
"ogx": "application/ogg",
"opus": "audio/opus",
"otf": "font/otf",
"png": "image/png",
"pdf": "application/pdf",
"php": "application/x-httpd-php",
"ppt": "application/vnd.ms-powerpoint",
"pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
"rar": "application/vnd.rar",
"rtf": "application/rtf",
"sh": "application/x-sh",
"svg": "image/svg+xml",
"swf": "application/x-shockwave-flash",
"tar": "application/x-tar",
"tiff": "image/tiff",
"tif": "image/tiff",
"ts": "video/mp2t",
"ttf": "font/ttf",
"txt": "text/plain",
"vsd": "application/vnd.visio",
"wav": "audio/wav",
"weba": "audio/webm",
"webm": "video/webm",
"webp": "image/webp",
"woff": "font/woff",
"woff2": "font/woff2",
"xhtml": "application/xhtml+xml",
"xls": "application/vnd.ms-excel",
"xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"xml": "application/xml",
"xul": "application/vnd.mozilla.xul+xml",
"zip": "application/zip",
"7z": "application/x-7z-compressed"
}
app.on_request(["GET"], self._webpath + "/*.*",
lambda request: self.serve(request))
# Serve a static file
def serve(self, request):
try:
# Read in the file
with open(self._path + request.path, "r") as file:
(mode, ino, dev, nlink, uid, gid, size, atime,
mtime, ctime) = os.stat(self._path + request.path)
year, month, day, hour, minute, second = time.localtime(mtime)[
:-3]
return ("200 OK", [("Content-Type", self.set_mime_from_extention(request.path.split(".")[-1])), ("Last-Modified", "{}/{}/{} {}:{}:{}".format(day, month, year, hour, minute, second)), ("Content-Length", size), ("Cache-Control", "public, max-age=604800, immutable")], file.readlines())
except:
return ("404 not found", [], "Not Found")
# Use a file extention to set the MIME content type
def set_mime_from_extention(self, extention):
if extention in self.mime_types:
return self.mime_types[extention]
else:
return "text/plain"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment