diff options
Diffstat (limited to 'libpathod')
-rw-r--r-- | libpathod/app.py | 4 | ||||
-rw-r--r-- | libpathod/cmdline.py | 4 | ||||
-rw-r--r-- | libpathod/language/__init__.py | 11 | ||||
-rw-r--r-- | libpathod/language/websockets.py | 42 | ||||
-rw-r--r-- | libpathod/pathoc.py | 6 | ||||
-rw-r--r-- | libpathod/pathod.py | 2 |
6 files changed, 48 insertions, 21 deletions
diff --git a/libpathod/app.py b/libpathod/app.py index 20225ff7..a9058279 100644 --- a/libpathod/app.py +++ b/libpathod/app.py @@ -135,9 +135,9 @@ def make_app(noapi, debug): try: if is_request: - r = language.parse_requests(spec)[0] + r = language.parse_pathoc(spec)[0] else: - r = language.parse_response(spec) + r = language.parse_pathod(spec) except language.ParseException as v: args["syntaxerror"] = str(v) args["marked"] = v.marked() diff --git a/libpathod/cmdline.py b/libpathod/cmdline.py index 67d5646a..2279262d 100644 --- a/libpathod/cmdline.py +++ b/libpathod/cmdline.py @@ -189,7 +189,7 @@ def args_pathoc(argv, stdout=sys.stdout, stderr=sys.stderr): data = open(r).read() r = data try: - reqs.extend(language.parse_requests(r)) + reqs.extend(language.parse_pathoc(r)) except language.ParseException as v: print >> stderr, "Error parsing request spec: %s" % v.msg print >> stderr, v.marked() @@ -400,7 +400,7 @@ def args_pathod(argv, stdout=sys.stdout, stderr=sys.stderr): data = open(spec).read() spec = data try: - req = language.parse_response(spec) + req = language.parse_pathod(spec) except language.ParseException as v: print >> stderr, "Error parsing anchor spec: %s" % v.msg print >> stderr, v.marked() 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, diff --git a/libpathod/pathoc.py b/libpathod/pathoc.py index 59c88910..f7268193 100644 --- a/libpathod/pathoc.py +++ b/libpathod/pathoc.py @@ -270,7 +270,7 @@ class Pathoc(tcp.TCPClient): """ with self.log() as log: if isinstance(r, basestring): - r = language.parse_requests(r)[0] + r = language.parse_pathoc(r)[0] log(">> %s" % r) try: language.serve(r, self.wfile, self.settings) @@ -316,7 +316,7 @@ class Pathoc(tcp.TCPClient): """ with self.log() as log: if isinstance(r, basestring): - r = language.parse_requests(r)[0] + r = language.parse_pathoc(r)[0] log(">> %s" % r) resp, req = None, None try: @@ -355,7 +355,7 @@ class Pathoc(tcp.TCPClient): May raise http.HTTPError, tcp.NetLibError """ if isinstance(r, basestring): - r = language.parse_requests(r)[0] + r = language.parse_pathoc(r)[0] if isinstance(r, language.http.Request): if r.ws: return self.websocket_start(r, self.websocket_get_frame) diff --git a/libpathod/pathod.py b/libpathod/pathod.py index c5ad942a..f536ce38 100644 --- a/libpathod/pathod.py +++ b/libpathod/pathod.py @@ -226,7 +226,7 @@ class PathodHandler(tcp.BaseHandler): spec = "ws" lg("crafting spec: %s" % spec) try: - crafted = language.parse_response(spec) + crafted = language.parse_pathod(spec) except language.ParseException as v: lg("Parse error: %s" % v.msg) crafted = language.http.make_error_response( |