1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import threading
import sys
server_thread = None
server_port = None
class TBRequestHandler(BaseHTTPRequestHandler):
views = {}
def do_GET(self):
if self.path == '/quit':
global server_thread
server_thread = None
raise SystemExit
i = self.path.find('/', 1)
parts = self.path[1:].split('/', 1)
if not parts:
tp_name = 'traceback'
else:
tb_name = parts[0]
if not self.views.has_key(tb_name):
self.send_response(404)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write('traceback named %r not found' % tb_name)
else:
tbview = self.views[tb_name]
s = tbview.render(self.path)
self.send_response(200)
self.send_header("Content-Type", "text/html; charset=utf-8")
self.end_headers()
self.wfile.write(unicode(s).encode('utf8'))
def log_message(self, format, *args):
pass
class TBServer(HTTPServer):
def handle_error(self, request, client_address):
exc = sys.exc_info()[1]
if isinstance(exc, (SystemExit, KeyboardInterrupt)):
raise
else:
HTTPServer.handle_error(self, request, client_address)
def serve():
import socket
port = 8080
while 1:
try:
server = TBServer(('localhost', port), TBRequestHandler)
except socket.error:
port += 1
continue
else:
break
global server_port
server_port = port
print "serving on", port
server.serve_forever()
def start():
global server_thread
server_thread = threading.Thread(target=serve)
server_thread.start()
return server_thread
def stop():
if server_thread is None:
return
import urllib2
try:
urllib2.urlopen('http://localhost:%s/quit'%(server_port,))
except urllib2.HTTPError:
pass
def wait_until_interrupt():
if server_thread is None:
return
print "waiting"
import signal
try:
signal.pause()
except KeyboardInterrupt:
stop()
def publish_exc(exc):
if server_thread is None:
return
from pypy.tool.tb_server.render import TracebackView
x = TracebackView(exc)
print "traceback is at http://localhost:%d/%s" % (server_port, x.name)
if __name__ == "__main__":
t = start()
wait_until_interrupt()
|