diff options
author | Maximilian Hils <git@maximilianhils.com> | 2015-07-24 17:43:41 +0200 |
---|---|---|
committer | Maximilian Hils <git@maximilianhils.com> | 2015-07-24 17:43:41 +0200 |
commit | f8b4d666870163d6770aabefe212b8ecd981d490 (patch) | |
tree | 8c6f2fc9ef4c06c40a04514f651785540d278bf3 /libpathod/protocols/websockets.py | |
parent | 9a1bee31d6d7b92bf5b4cb68d853c856acdfb036 (diff) | |
parent | 96c9c4459f0bb9b76ab34f8c8d03d0e5d28621f4 (diff) | |
download | mitmproxy-f8b4d666870163d6770aabefe212b8ecd981d490.tar.gz mitmproxy-f8b4d666870163d6770aabefe212b8ecd981d490.tar.bz2 mitmproxy-f8b4d666870163d6770aabefe212b8ecd981d490.zip |
Merge pull request #31 from Kriechi/protocol-refactor
HTTP protocol refactoring
Diffstat (limited to 'libpathod/protocols/websockets.py')
-rw-r--r-- | libpathod/protocols/websockets.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/libpathod/protocols/websockets.py b/libpathod/protocols/websockets.py new file mode 100644 index 00000000..890f06c8 --- /dev/null +++ b/libpathod/protocols/websockets.py @@ -0,0 +1,54 @@ +import time + +from netlib import tcp, http, wsgi, certutils, websockets, odict +from .. import version, app, language, utils, log + +class WebsocketsProtocol: + + def __init__(self, pathod_handler): + self.pathod_handler = pathod_handler + + def handle_websocket(self, logger): + while True: + with logger.ctx() as lg: + started = time.time() + try: + frm = websockets.Frame.from_file(self.pathod_handler.rfile) + except tcp.NetLibIncomplete as e: + lg("Error reading websocket frame: %s" % e) + break + ended = time.time() + lg(frm.human_readable()) + retlog = dict( + type="inbound", + protocol="websockets", + started=started, + duration=ended - started, + frame=dict( + ), + cipher=None, + ) + if self.pathod_handler.ssl_established: + retlog["cipher"] = self.pathod_handler.get_current_cipher() + self.pathod_handler.addlog(retlog) + ld = language.websockets.NESTED_LEADER + if frm.payload.startswith(ld): + nest = frm.payload[len(ld):] + try: + wf_gen = language.parse_websocket_frame(nest) + except language.exceptions.ParseException as v: + logger.write( + "Parse error in reflected frame specifcation:" + " %s" % v.msg + ) + return None, None + for frm in wf_gen: + with logger.ctx() as lg: + frame_log = language.serve( + frm, + self.pathod_handler.wfile, + self.pathod_handler.settings + ) + lg("crafting websocket spec: %s" % frame_log["spec"]) + self.pathod_handler.addlog(frame_log) + return self.handle_websocket, None |