aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod/pathod.py
diff options
context:
space:
mode:
Diffstat (limited to 'libpathod/pathod.py')
-rw-r--r--libpathod/pathod.py42
1 files changed, 30 insertions, 12 deletions
diff --git a/libpathod/pathod.py b/libpathod/pathod.py
index 6b385a47..abce15fe 100644
--- a/libpathod/pathod.py
+++ b/libpathod/pathod.py
@@ -11,6 +11,8 @@ from netlib import tcp, http, wsgi, certutils, websockets
from . import version, app, language, utils, log
import language.http
import language.actions
+import language.exceptions
+import language.websockets
DEFAULT_CERT_DOMAIN = "pathod.net"
@@ -102,21 +104,37 @@ class PathodHandler(tcp.BaseHandler):
def handle_websocket(self):
lr = self.rfile if self.server.logreq else None
lw = self.wfile if self.server.logresp else None
- with log.Log(self.logfp, self.server.hexdump, lr, lw) as lg:
- while True:
+ while True:
+ with log.Log(self.logfp, self.server.hexdump, lr, lw) as lg:
try:
frm = websockets.Frame.from_file(self.rfile)
- retlog = dict(
- type="wsframe",
- frame=dict(
- ),
- cipher=None,
- )
- self.addlog(retlog)
+ except tcp.NetLibIncomplete, e:
+ lg("Error reading websocket frame: %s"%e)
break
- except tcp.NetLibTimeout: # pragma: no cover
- pass
- lg(frm.human_readable())
+ lg(frm.human_readable())
+ retlog = dict(
+ type="wsframe",
+ frame=dict(
+ ),
+ cipher=None,
+ )
+ ld = language.websockets.NESTED_LEADER
+ if frm.payload.startswith(ld):
+ nest = frm.payload[len(ld):]
+ try:
+ wf = language.parse_websocket_frame(nest)
+ except language.exceptions.ParseException, v:
+ lg(
+ "Parse error in reflected frame specifcation:"
+ " %s" % v.msg
+ )
+ break
+ frame_log = language.serve(
+ wf,
+ self.wfile,
+ self.settings
+ )
+ self.addlog(retlog)
return self.handle_websocket, None
def handle_http_connect(self, connect, lg):