Skip to content

Instantly share code, notes, and snippets.

@loadletter
Created April 16, 2015 21:43
Show Gist options
  • Save loadletter/23bb7b68654d20ba7d5d to your computer and use it in GitHub Desktop.
Save loadletter/23bb7b68654d20ba7d5d to your computer and use it in GitHub Desktop.
How iqdb.org shows download progress
#!/usr/bin/python
import os,SimpleHTTPServer,SocketServer,socket,cgi,urlparse,time
PORT = 8025
HOSTNAME = socket.gethostbyaddr(socket.gethostname())[0]
HEAD="""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><title>Multi-service image search - Search results</title>
<script type="text/javascript"><!--
function progress(txt,txt2) {
try { document.getElementById('urlstat').firstChild.nodeValue=txt+txt2; } catch (e) { document.write(txt+" "); }
}
--></script>
</head><body>
<h1>Multi-service image search</h1>
<div class='notice'>Retrieving http://google.com/ (5357 KB)...
<span id='urlstat'>1%</span></div>
"""
PROGRESS="<script type='text/javascript'>progress('%s','');</script>\n"
TAIL="</body></html>"
class webDispatcher(SimpleHTTPServer.SimpleHTTPRequestHandler):
def req_hello(self):
self.send_response(200)
self.send_header("Content-Type","text/html")
self.end_headers()
self.wfile.write('Hello. Go to <a href="/form">the form<a>.')
self.wfile.close()
def req_form(self):
self.send_response(200)
self.send_header("Content-Type","text/html")
self.end_headers()
self.wfile.write(HEAD.encode('utf-8'))
start_time = time.time()
for i in xrange(2, 101):
self.wfile.write((PROGRESS % '%i%%' % i).encode('utf-8'))
time.sleep(0.05)
eta = time.time() - start_time
self.wfile.write((PROGRESS % 'OK, %.1f seconds.' % eta).encode('utf-8'))
self.wfile.write(TAIL.encode('utf-8'))
self.wfile.close()
def do_GET(self):
params = cgi.parse_qs(urlparse.urlparse(self.path).query)
action = urlparse.urlparse(self.path).path[1:]
if action=="": action="hello"
methodname = "req_"+action
try:
getattr(self, methodname)(**params)
except AttributeError:
self.send_response(404)
self.send_header("Content-Type","text/html")
self.end_headers()
self.wfile.write("404 - Not found")
except TypeError: # URL not called with the proper parameters
self.send_response(400)
self.send_header("Content-Type","text/html")
self.end_headers()
self.wfile.write("400 - Bad request")
httpd = SocketServer.ThreadingTCPServer(('', PORT), webDispatcher)
print u"Server listening at http://%s:%s" % (HOSTNAME,PORT)
httpd.serve_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment