aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod/language
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
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')
-rw-r--r--libpathod/language/__init__.py11
-rw-r--r--libpathod/language/websockets.py42
2 files changed, 40 insertions, 13 deletions
diff --git a/libpathod/language/__init__.py b/libpathod/language/__init__.py
index 3cc7dfbe..e2e3e57d 100644
--- a/libpathod/language/__init__.py
+++ b/libpathod/language/__init__.py
@@ -9,7 +9,7 @@ from base import Settings
assert Settings # prevent pyflakes from messing with this
-def parse_response(s):
+def parse_pathod(s):
"""
May raise ParseException
"""
@@ -18,12 +18,17 @@ def parse_response(s):
except UnicodeError:
raise exceptions.ParseException("Spec must be valid ASCII.", 0, 0)
try:
- return http.Response.expr().parseString(s, parseAll=True)[0]
+ return pp.Or(
+ [
+ websockets.WebsocketFrame.expr(),
+ http.Response.expr(),
+ ]
+ ).parseString(s, parseAll=True)[0]
except pp.ParseException as v:
raise exceptions.ParseException(v.msg, v.line, v.col)
-def parse_requests(s):
+def parse_pathoc(s):
"""
May raise ParseException
"""
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,