aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod/protocols/websockets.py
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2015-07-24 17:43:41 +0200
committerMaximilian Hils <git@maximilianhils.com>2015-07-24 17:43:41 +0200
commitf8b4d666870163d6770aabefe212b8ecd981d490 (patch)
tree8c6f2fc9ef4c06c40a04514f651785540d278bf3 /libpathod/protocols/websockets.py
parent9a1bee31d6d7b92bf5b4cb68d853c856acdfb036 (diff)
parent96c9c4459f0bb9b76ab34f8c8d03d0e5d28621f4 (diff)
downloadmitmproxy-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.py54
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