aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/websockets/masker.py
diff options
context:
space:
mode:
authorThomas Kriechbaumer <thomas@kriechbaumer.name>2016-08-18 17:31:43 +0200
committerThomas Kriechbaumer <thomas@kriechbaumer.name>2016-09-01 09:56:14 +0200
commitd12515f84b32b3157fa99ac3c3a7a7318f9626ba (patch)
tree5fee9c57965ebbee51227eb374029b89dbe56cca /netlib/websockets/masker.py
parent281d779fa3eb6b81ec76d046337275c0a82eff46 (diff)
downloadmitmproxy-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.py33
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