aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod/language/websockets.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2015-06-04 17:18:06 +1200
committerAldo Cortesi <aldo@nullcube.com>2015-06-04 17:18:06 +1200
commit9fda74c65a632bda5176e2ccafbbcab2af27d77d (patch)
treea37c633bda76ae3f2c623bf1d14355279c0631d9 /libpathod/language/websockets.py
parent5bee061849b9e48d097b2aba3613e38f7282f36b (diff)
downloadmitmproxy-9fda74c65a632bda5176e2ccafbbcab2af27d77d.tar.gz
mitmproxy-9fda74c65a632bda5176e2ccafbbcab2af27d77d.tar.bz2
mitmproxy-9fda74c65a632bda5176e2ccafbbcab2af27d77d.zip
Clarify language API, stub out nested websocket frames
Diffstat (limited to 'libpathod/language/websockets.py')
-rw-r--r--libpathod/language/websockets.py42
1 files changed, 32 insertions, 10 deletions
diff --git a/libpathod/language/websockets.py b/libpathod/language/websockets.py
index 46daa467..3869bd85 100644
--- a/libpathod/language/websockets.py
+++ b/libpathod/language/websockets.py
@@ -3,16 +3,6 @@ import netlib.websockets
import pyparsing as pp
from . import base, generators, actions, message
-"""
- wf:ctext:b'foo'
- wf:c15:r'foo'
- wf:fin:rsv1:rsv2:rsv3:mask
- wf:-fin:-rsv1:-rsv2:-rsv3:-mask
- wf:l234
-
- wf:mask:r"foo
-"""
-
class WF(base.CaselessLiteral):
TOK = "wf"
@@ -79,6 +69,38 @@ class Times(base.Integer):
preamble = "x"
+class NestedFrame(base.Token):
+ def __init__(self, value):
+ self.value = value
+ try:
+ self.parsed = WebsocketFrame(
+ Response.expr().parseString(
+ value.val,
+ parseAll=True
+ )
+ )
+ except pp.ParseException as v:
+ raise exceptions.ParseException(v.msg, v.line, v.col)
+
+ @classmethod
+ def expr(klass):
+ e = pp.Literal("wf").suppress()
+ e = e + base.TokValueLiteral.expr()
+ return e.setParseAction(lambda x: klass(*x))
+
+ def values(self, settings):
+ return [
+ self.value.get_generator(settings),
+ ]
+
+ def spec(self):
+ return "s%s" % (self.value.spec())
+
+ def freeze(self, settings):
+ f = self.parsed.freeze(settings).spec()
+ return NestedFrame(base.TokValueLiteral(f.encode("string_escape")))
+
+
class WebsocketFrame(message.Message):
comps = (
OpCode,