diff options
author | Thomas Kriechbaumer <thomas@kriechbaumer.name> | 2016-08-18 17:31:43 +0200 |
---|---|---|
committer | Thomas Kriechbaumer <thomas@kriechbaumer.name> | 2016-09-01 09:56:14 +0200 |
commit | d12515f84b32b3157fa99ac3c3a7a7318f9626ba (patch) | |
tree | 5fee9c57965ebbee51227eb374029b89dbe56cca /netlib/websockets/masker.py | |
parent | 281d779fa3eb6b81ec76d046337275c0a82eff46 (diff) | |
download | mitmproxy-d12515f84b32b3157fa99ac3c3a7a7318f9626ba.tar.gz mitmproxy-d12515f84b32b3157fa99ac3c3a7a7318f9626ba.tar.bz2 mitmproxy-d12515f84b32b3157fa99ac3c3a7a7318f9626ba.zip |
websockets: refactor implementation and add tests
Diffstat (limited to 'netlib/websockets/masker.py')
-rw-r--r-- | netlib/websockets/masker.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/netlib/websockets/masker.py b/netlib/websockets/masker.py new file mode 100644 index 00000000..bd39ed6a --- /dev/null +++ b/netlib/websockets/masker.py @@ -0,0 +1,33 @@ +from __future__ import absolute_import + +import six + + +class Masker(object): + """ + Data sent from the server must be masked to prevent malicious clients + from sending data over the wire in predictable patterns. + + Servers do not have to mask data they send to the client. + https://tools.ietf.org/html/rfc6455#section-5.3 + """ + + def __init__(self, key): + self.key = key + self.offset = 0 + + def mask(self, offset, data): + result = bytearray(data) + for i in range(len(data)): + if six.PY2: + result[i] ^= ord(self.key[offset % 4]) + else: + result[i] ^= self.key[offset % 4] + offset += 1 + result = bytes(result) + return result + + def __call__(self, data): + ret = self.mask(self.offset, data) + self.offset += len(ret) + return ret |