Skip to content

Instantly share code, notes, and snippets.

@deepredsky
Last active November 7, 2021 20:48
Show Gist options
  • Save deepredsky/0a92152d2b2b50acfbbda347f9389845 to your computer and use it in GitHub Desktop.
Save deepredsky/0a92152d2b2b50acfbbda347f9389845 to your computer and use it in GitHub Desktop.
import http.server
import socketserver
import urllib.request
import shutil
import os
import hashlib
import sys
class CacheHandler(http.server.CGIHTTPRequestHandler):
def do_OPTIONS(self):
self.send_response(200, "ok")
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header("Access-Control-Allow-Headers", "X-Requested-With")
def do_POST(self):
m = hashlib.md5()
content_len = int(self.headers.get('Content-Length'))
post_body = self.rfile.read(content_len)
m.update(post_body)
cache_filename = m.hexdigest() + ".cached"
if not os.path.exists(cache_filename):
print("cache miss")
with open(cache_filename + ".temp", "wb") as output:
req = urllib.request.Request("http://localhost:3000/" + self.path)
# copy request headers
for k in self.headers:
if k not in ["Host"]:
req.add_header(k, self.headers[k])
try:
resp = urllib.request.urlopen(req, data=post_body)
shutil.copyfileobj(resp, output)
os.rename(cache_filename + ".temp", cache_filename)
except urllib.error.HTTPError as err:
self.send_response(err.code)
self.end_headers()
return
else:
print("cache hit, reading from " + cache_filename)
with open(cache_filename, "rb") as cached:
self.send_response(200)
self.end_headers()
shutil.copyfileobj(cached, self.wfile)
socketserver.TCPServer.allow_reuse_address = True
with socketserver.TCPServer(("", 8000), CacheHandler) as httpd:
print("Starting server at http://localhost:8000")
try:
httpd.serve_forever()
except KeyboardInterrupt:
sys.exit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment