diff options
| author | Aldo Cortesi <aldo@nullcube.com> | 2015-06-04 17:18:06 +1200 |
|---|---|---|
| committer | Aldo Cortesi <aldo@nullcube.com> | 2015-06-04 17:18:06 +1200 |
| commit | 9fda74c65a632bda5176e2ccafbbcab2af27d77d (patch) | |
| tree | a37c633bda76ae3f2c623bf1d14355279c0631d9 /libpathod/language | |
| parent | 5bee061849b9e48d097b2aba3613e38f7282f36b (diff) | |
| download | mitmproxy-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__.py | 11 | ||||
| -rw-r--r-- | libpathod/language/websockets.py | 42 |
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, |
