aboutsummaryrefslogtreecommitdiffstats
path: root/libpathod/language
diff options
context:
space:
mode:
Diffstat (limited to 'libpathod/language')
-rw-r--r--libpathod/language/__init__.py10
-rw-r--r--libpathod/language/websockets.py12
2 files changed, 18 insertions, 4 deletions
diff --git a/libpathod/language/__init__.py b/libpathod/language/__init__.py
index 12378607..52ccf61c 100644
--- a/libpathod/language/__init__.py
+++ b/libpathod/language/__init__.py
@@ -57,6 +57,16 @@ def parse_pathoc(s):
return expanded
+def parse_websocket_frame(s):
+ try:
+ return websockets.WebsocketFrame.expr().parseString(
+ s,
+ parseAll = True
+ )[0]
+ except pp.ParseException as v:
+ raise exceptions.ParseException(v.msg, v.line, v.col)
+
+
def serve(msg, fp, settings):
"""
fp: The file pointer to write to.
diff --git a/libpathod/language/websockets.py b/libpathod/language/websockets.py
index 44c12f64..96dbce53 100644
--- a/libpathod/language/websockets.py
+++ b/libpathod/language/websockets.py
@@ -3,6 +3,7 @@ import netlib.websockets
import pyparsing as pp
from . import base, generators, actions, message
+NESTED_LEADER = "pathod!"
class WF(base.CaselessLiteral):
TOK = "wf"
@@ -160,6 +161,10 @@ class WebsocketFrame(message.Message):
resp = resp.setParseAction(klass)
return resp
+ @property
+ def nested_frame(self):
+ return self.tok(NestedFrame)
+
def resolve(self, settings, msg=None):
tokens = self.tokens[:]
if not self.mask and settings.is_client:
@@ -181,6 +186,9 @@ class WebsocketFrame(message.Message):
elif self.rawbody:
bodygen = self.rawbody.value.get_generator(settings)
length = len(self.rawbody.value.get_generator(settings))
+ elif self.nested_frame:
+ bodygen = NESTED_LEADER + self.nested_frame.parsed.spec()
+ length = len(bodygen)
else:
bodygen = None
length = 0
@@ -228,7 +236,3 @@ class WebsocketClientFrame(WebsocketFrame):
components = COMPONENTS + (
NestedFrame,
)
-
- @property
- def nested_frame(self):
- return self.tok(NestedFrame)