aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2015-06-04 20:23:05 +1200
committerAldo Cortesi <aldo@nullcube.com>2015-06-04 20:23:05 +1200
commit182b79ab9ec3f59e17536b135e90eaa91e577111 (patch)
tree605830f75674c8e1794cf5c8a3fec43d941f2fe8
parentfb1b9113a101e2b5bf174140f95f06131f23e91f (diff)
downloadmitmproxy-182b79ab9ec3f59e17536b135e90eaa91e577111.tar.gz
mitmproxy-182b79ab9ec3f59e17536b135e90eaa91e577111.tar.bz2
mitmproxy-182b79ab9ec3f59e17536b135e90eaa91e577111.zip
Refactor to allow dropping to websockets on any anchor point
-rw-r--r--libpathod/pathod.py53
1 files changed, 32 insertions, 21 deletions
diff --git a/libpathod/pathod.py b/libpathod/pathod.py
index 839b5406..6b385a47 100644
--- a/libpathod/pathod.py
+++ b/libpathod/pathod.py
@@ -243,29 +243,40 @@ class PathodHandler(tcp.BaseHandler):
lg(s)
return None, dict(type="error", msg=s)
+ m = utils.MemBool()
+ websocket_key = websockets.check_client_handshake(headers)
+ self.settings.websocket_key = websocket_key
+
+ # If this is a websocket initiation, we respond with a proper
+ # server response, unless over-ridden.
+ if websocket_key:
+ anchor_spec = language.parse_pathod("ws")
+ else:
+ anchor_spec = None
for i in self.server.anchors:
if i[0].match(path):
- lg("crafting anchor: %s" % path)
- nexthandler, retlog["response"] = self.serve_crafted(i[1])
- return nexthandler, retlog
-
- m = utils.MemBool()
- if m(self.server.craftanchor.match(path)):
- spec = urllib.unquote(path)[len(m.v.group()):]
- websocket_key = websockets.check_client_handshake(headers)
- self.settings.websocket_key = websocket_key
- if websocket_key and not spec:
- spec = "ws"
- lg("crafting spec: %s" % spec)
- try:
- crafted = language.parse_pathod(spec)
- except language.ParseException as v:
- lg("Parse error: %s" % v.msg)
- crafted = language.http.make_error_response(
- "Parse Error",
- "Error parsing response spec: %s\n" % v.msg + v.marked()
- )
- nexthandler, retlog["response"] = self.serve_crafted(crafted)
+ anchor_spec = i[1]
+ break
+ else:
+ if m(self.server.craftanchor.match(path)):
+ spec = urllib.unquote(path)[len(m.v.group()):]
+ if spec:
+ try:
+ anchor_spec = language.parse_pathod(spec)
+ except language.ParseException as v:
+ lg("Parse error: %s" % v.msg)
+ anchor_spec = language.http.make_error_response(
+ "Parse Error",
+ "Error parsing response spec: %s\n" % (
+ v.msg + v.marked()
+ )
+ )
+
+ if anchor_spec:
+ lg("crafting spec: %s" % anchor_spec)
+ nexthandler, retlog["response"] = self.serve_crafted(
+ anchor_spec
+ )
if nexthandler and websocket_key:
return self.handle_websocket, retlog
else: