Created
April 16, 2015 21:43
-
-
Save loadletter/23bb7b68654d20ba7d5d to your computer and use it in GitHub Desktop.
How iqdb.org shows download progress
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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