File: server.py

package info (click to toggle)
pypy3 7.0.0%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 111,848 kB
  • sloc: python: 1,291,746; ansic: 74,281; asm: 5,187; cpp: 3,017; sh: 2,533; makefile: 544; xml: 243; lisp: 45; csh: 21; awk: 4
file content (96 lines) | stat: -rw-r--r-- 2,566 bytes parent folder | download | duplicates (10)
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()