From 9109b3cc8cca05f34d3ddee062cf7f8bc401af31 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sat, 2 May 2015 16:17:00 +1200 Subject: Massive refactoring to split up language implementation. --- libpathod/language/websockets.py | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 libpathod/language/websockets.py (limited to 'libpathod/language/websockets.py') diff --git a/libpathod/language/websockets.py b/libpathod/language/websockets.py new file mode 100644 index 00000000..29b7311c --- /dev/null +++ b/libpathod/language/websockets.py @@ -0,0 +1,59 @@ + +import netlib.websockets +import contrib.pyparsing as pp +from . import base, generators + + +class WebsocketFrame(base._Message): + comps = ( + base.Body, + base.PauseAt, + base.DisconnectAt, + base.InjectAt + ) + logattrs = ["body"] + + @classmethod + def expr(klass): + parts = [i.expr() for i in klass.comps] + atom = pp.MatchFirst(parts) + resp = pp.And( + [ + base.WF.expr(), + base.Sep, + pp.ZeroOrMore(base.Sep + atom) + ] + ) + resp = resp.setParseAction(klass) + return resp + + def values(self, settings): + vals = [] + if self.body: + bodygen = self.body.value.get_generator(settings) + length = len(self.body.value.get_generator(settings)) + else: + bodygen = None + length = 0 + frame = netlib.websockets.FrameHeader( + mask = True, + payload_length = length + ) + vals = [frame.to_bytes()] + if self.body: + masker = netlib.websockets.Masker(frame.masking_key) + vals.append( + generators.TransformGenerator( + bodygen, + masker.mask + ) + ) + return vals + + def resolve(self, settings, msg=None): + return self.__class__( + [i.resolve(settings, msg) for i in self.tokens] + ) + + def spec(self): + return ":".join([i.spec() for i in self.tokens]) -- cgit v1.2.3