Tree2
[siwg.git] / connect6_www / ws / connect6_wsh.py
blobf9e2d63ac47de260c1a20d981b4d0ad6af244a42
1 from mod_pywebsocket import msgutil
2 from mod_pywebsocket.util import DeflateSocket
3 import re, socket, select
4 import common
6 SERVER_NAME = socket.getfqdn() or 'localhost'
7 ALLOWED_CMDS = (
8 'init', 'startgame', 'move', 'feedback', 'setoption', 'getmove', 'forcemove', 'stop', 'endgame', 'quit',
9 'connect', 'bestmove', 'error', 'concede', 'info',
12 def rejoin(cmd):
13 return ' '.join(cmd)
15 def clean(x):
16 if x[0] == '\x00':
17 return x[1:]
18 return x
20 def web_socket_do_extra_handshake(request):
21 pass
23 def web_socket_transfer_data(request):
24 cmd = msgutil.receive_message(request)
25 print cmd
26 if cmd != 'INIT':
27 return
29 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
30 server.bind((SERVER_NAME, 0))
31 server.listen(2)
32 port = server.getsockname()[1]
34 msgutil.send_message(request, '_INIT_OK %s:%d' % (SERVER_NAME, port))
35 browser = request._request_handler.connection
36 inn = [server, browser]
37 client = None
39 # serve
40 while True:
41 rdy, _, _ = select.select(inn, [], [])
42 for n in rdy:
43 if n is browser: # websocket
44 cmd = msgutil.receive_message(request)
45 if cmd is None: #close
46 print 'BROWSER CLOSE'
47 server.close()
48 return
49 else:
50 cmd = cmd.split()
51 print 'B', cmd
52 cmd[0] = clean(cmd[0])
53 if cmd[0] in ALLOWED_CMDS and client is not None:
54 client.msg(rejoin(cmd))
55 elif n is server: # new connection
56 new, _ = n.accept()
57 if client: # only one client at a time
58 print "SERVER REJECTED (ALREADY CONNECTED)"
59 new.close()
60 continue
61 print "SERVER CONNECTED"
62 client = new
63 inn.append(client)
64 msgutil.send_message(request, '_SER_CON')
65 else: # client
66 try:
67 cmd = n.parse()
68 print 'S', cmd
69 cmd[0] = clean(cmd[0])
70 if cmd[0] in ALLOWED_CMDS:
71 msgutil.send_message(request, rejoin(cmd))
72 except IOError:
73 print "SERVER DISCONNECTED"
74 n.close()
75 inn.remove(n)
76 client = None
77 msgutil.send_message(request, '_SER_DIS')