Skip to content

Instantly share code, notes, and snippets.

@dbnicholson
Created April 11, 2022 17:51
Show Gist options
  • Save dbnicholson/c2902cec7bb74d01ccc9327c0d8619f3 to your computer and use it in GitHub Desktop.
Save dbnicholson/c2902cec7bb74d01ccc9327c0d8619f3 to your computer and use it in GitHub Desktop.
Hack Kolibri content server to delay responses
#!/usr/bin/env python3
from argparse import ArgumentParser
from functools import partial
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
import logging
import os
import time
logger = logging.getLogger(__name__)
class DelayedHTTPRequestHandler(SimpleHTTPRequestHandler):
def __init__(self, *args, delay=0, **kwargs):
self.delay = delay
super().__init__(*args, **kwargs)
def do_GET(self):
if not self.path.startswith('/content/'):
return self.redirect_studio()
if self.delay > 0:
self.log_message('Delaying "%s" %d seconds',
self.requestline, self.delay)
time.sleep(self.delay)
super().do_GET()
def redirect_studio(self):
location = f'https://studio.learningequality.org{self.path}'
self.log_message('Redirecting %s to %s', self.path, location)
self.send_response(302, 'Found')
self.send_header('Location', location)
self.end_headers()
def main():
ap = ArgumentParser(description='HTTP server with delayed responses')
ap.add_argument('-r', '--root', default=os.getcwd(),
help='alternate root directory')
ap.add_argument('-d', '--delay', type=int, default=0,
help='seconds to delay GET responses')
ap.add_argument('-p', '--port', type=int, default=8000,
help='port to bind to (default: %(default)s)')
args = ap.parse_args()
addr = ('127.0.0.1', args.port)
handler_class = partial(DelayedHTTPRequestHandler,
directory=args.root,
delay=args.delay)
with ThreadingHTTPServer(addr, handler_class) as server:
print(f'Serving {args.root} from http://{addr[0]}:{addr[1]}')
try:
server.serve_forever()
except KeyboardInterrupt:
print('\nKeyboard interrupt received, exiting.')
return
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment