import urlparse from BaseHTTPServer import BaseHTTPRequestHandler from SimpleHTTPServer import SimpleHTTPRequestHandler import SocketServer import sys import json import threading import time import os from graphstate import GraphState class VizHandler(SimpleHTTPRequestHandler): """ Handles requests to the server """ def __init__(self, *args, **kwargs): SimpleHTTPRequestHandler.__init__(self, *args, **kwargs) def get_state(self): """ Get the current graphstate state """ self.send_response(200) self.send_header('Content-Type', 'application/json') self.end_headers() state = self.server.state self.wfile.write(state.to_json()) def do_GET(self, *args, **kwargs): """ Someone belled the server """ parsed_path = urlparse.urlparse(self.path) if parsed_path.path == "/state": return self.get_state() else: return SimpleHTTPRequestHandler.do_GET(self, *args, **kwargs) class Server(SocketServer.TCPServer): """ Serves the good stuff """ allow_reuse_address = True def __init__(self, port=8000): self.port = port self.state = None SocketServer.TCPServer.__init__( self, ("127.0.0.1", self.port), VizHandler) def update(self, state): """ Update the in-memory state """ self.state = state def run(self): """ Run in such a way that keyboard interrupts are caught properly """ try: self.serve_forever() except KeyboardInterrupt: self.shutdown() def start(self): """ Start in a new thread """ thread = threading.Thread(None, self.run) thread.daemon = True thread.start() print "Server running at http://localhost:{}/".format(self.port) def demograph(): """ A graph for testing with """ g = GraphState() g.add_edge(0, 1) g.add_edge(1, 2) g.add_edge(2, 0) g.add_edge(0, 3) g.add_edge(100, 200) return g if __name__ == '__main__': where = os.path.join(sys.path[0], "../static") os.chdir(where) server = Server() server.start() g = demograph() g.layout() while True: server.update(g) time.sleep(1) server.shutdown()