diff options
author | Aldo Cortesi <aldo@nullcube.com> | 2015-06-04 23:57:23 +1200 |
---|---|---|
committer | Aldo Cortesi <aldo@nullcube.com> | 2015-06-04 23:57:23 +1200 |
commit | 0a7da6a9b1b878cbfabf437759031f816161fab7 (patch) | |
tree | b287c636e98a5ba850c8a3da0c44a06e3d0a53a1 /libpathod/pathod.py | |
parent | 9311d605964a346e9a51bc841bfcdf5d38e392a1 (diff) | |
download | mitmproxy-0a7da6a9b1b878cbfabf437759031f816161fab7.tar.gz mitmproxy-0a7da6a9b1b878cbfabf437759031f816161fab7.tar.bz2 mitmproxy-0a7da6a9b1b878cbfabf437759031f816161fab7.zip |
Rudimentary support for reflected websocket frames.
Diffstat (limited to 'libpathod/pathod.py')
-rw-r--r-- | libpathod/pathod.py | 42 |
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): |