aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod
diff options
context:
space:
mode:
Diffstat (limited to 'libpathod')
-rw-r--r--libpathod/app.py4
-rw-r--r--libpathod/cmdline.py4
-rw-r--r--libpathod/language/__init__.py11
-rw-r--r--libpathod/language/websockets.py42
-rw-r--r--libpathod/pathoc.py6
-rw-r--r--libpathod/pathod.py2
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(