diff options
author | Aldo Cortesi <aldo@nullcube.com> | 2015-05-02 16:17:00 +1200 |
---|---|---|
committer | Aldo Cortesi <aldo@nullcube.com> | 2015-05-02 16:17:00 +1200 |
commit | 9109b3cc8cca05f34d3ddee062cf7f8bc401af31 (patch) | |
tree | 2d1f2f4ed115a9bc7c26eb87e697b34fe860368f /libpathod/language/websockets.py | |
parent | 601cdf70c7339a59537cc8402e4f2648f398b28d (diff) | |
download | mitmproxy-9109b3cc8cca05f34d3ddee062cf7f8bc401af31.tar.gz mitmproxy-9109b3cc8cca05f34d3ddee062cf7f8bc401af31.tar.bz2 mitmproxy-9109b3cc8cca05f34d3ddee062cf7f8bc401af31.zip |
Massive refactoring to split up language implementation.
Diffstat (limited to 'libpathod/language/websockets.py')
-rw-r--r-- | libpathod/language/websockets.py | 59 |
1 files changed, 59 insertions, 0 deletions
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]) |