aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2015-05-17 11:04:53 +1200
committerAldo Cortesi <aldo@nullcube.com>2015-05-17 11:04:53 +1200
commitcd2fb13b3e9ced39059f3d6572fd8806d0026d2e (patch)
treed22f5d48705272516cf04e9793db33371c29abc7
parente4feba54330e1afcfb8d48bce8c474659aba281c (diff)
downloadmitmproxy-cd2fb13b3e9ced39059f3d6572fd8806d0026d2e.tar.gz
mitmproxy-cd2fb13b3e9ced39059f3d6572fd8806d0026d2e.tar.bz2
mitmproxy-cd2fb13b3e9ced39059f3d6572fd8806d0026d2e.zip
websockets: replace the "raw" with a simpler mechanism
You can now say "knone" to specifiy that no key should be generated under any circumstances.
-rw-r--r--libpathod/language/websockets.py23
-rw-r--r--libpathod/templates/docs_lang_websockets.html15
-rw-r--r--test/test_language_websocket.py11
3 files changed, 25 insertions, 24 deletions
diff --git a/libpathod/language/websockets.py b/libpathod/language/websockets.py
index 599cdb88..428f3b4d 100644
--- a/libpathod/language/websockets.py
+++ b/libpathod/language/websockets.py
@@ -9,7 +9,6 @@ from . import base, generators, actions, message
wf:fin:rsv1:rsv2:rsv3:mask
wf:-fin:-rsv1:-rsv2:-rsv3:-mask
- wf:k"mask"
wf:l234
"""
@@ -35,10 +34,6 @@ class Body(base.Value):
preamble = "b"
-class Raw(base.CaselessLiteral):
- TOK = "r"
-
-
class Fin(base.Boolean):
name = "fin"
@@ -64,6 +59,11 @@ class Key(base.FixedLengthValue):
length = 4
+class KeyNone(base.CaselessLiteral):
+ unique_name = "Key"
+ TOK = "knone"
+
+
class WebsocketFrame(message.Message):
comps = (
Body,
@@ -78,9 +78,8 @@ class WebsocketFrame(message.Message):
actions.PauseAt,
actions.DisconnectAt,
actions.InjectAt,
+ KeyNone,
Key,
-
- Raw,
)
logattrs = ["body"]
@property
@@ -119,6 +118,10 @@ class WebsocketFrame(message.Message):
def key(self):
return self.tok(Key)
+ @property
+ def knone(self):
+ return self.tok(KeyNone)
+
@classmethod
def expr(klass):
parts = [i.expr() for i in klass.comps]
@@ -139,7 +142,7 @@ class WebsocketFrame(message.Message):
tokens.append(
Mask(True)
)
- if self.mask and self.mask.value and not self.key:
+ if not self.knone and self.mask and self.mask.value and not self.key:
tokens.append(
Key(base.TokValueLiteral(os.urandom(4)))
)
@@ -159,7 +162,9 @@ class WebsocketFrame(message.Message):
)
if self.mask and self.mask.value:
frameparts["mask"] = True
- if self.key:
+ if self.knone:
+ frameparts["masking_key"] = None
+ elif self.key:
key = self.key.values(settings)[0][:]
frameparts["masking_key"] = key
for i in ["opcode", "fin", "rsv1", "rsv2", "rsv3", "mask"]:
diff --git a/libpathod/templates/docs_lang_websockets.html b/libpathod/templates/docs_lang_websockets.html
index 9eb1ec25..a77ac251 100644
--- a/libpathod/templates/docs_lang_websockets.html
+++ b/libpathod/templates/docs_lang_websockets.html
@@ -48,7 +48,8 @@
<td> k<a href="#valuespec">VALUE</a> </td>
<td>
Set the masking key. The resulting value must be exactly 4
- bytes long.
+ bytes long. The special form <b>knone</b> specifies that no key
+ should be set, even if the mask bit is on.
</td>
</tr>
@@ -68,18 +69,6 @@
</tr>
<tr>
- <td> r </td>
- <td>
- Create a "raw" frame:
- <ul>
- <li> Don't auto-generate the masking key if the mask flag is
- set </li>
-
- <li> Don't set the mask flag if masking key is set. </li>
- </td>
- </tr>
-
- <tr>
<td> [-]rsv1 </td>
<td>
Set or un-set the <b>rsv1</b> bit.
diff --git a/test/test_language_websocket.py b/test/test_language_websocket.py
index 5e2ccb88..f9e8310a 100644
--- a/test/test_language_websocket.py
+++ b/test/test_language_websocket.py
@@ -17,7 +17,7 @@ class TestWebsocketFrame:
"wf:b'foo'",
"wf:cbinary",
"wf:c1",
- "wf:r",
+ "wf:mask:knone",
"wf:fin",
"wf:fin:rsv1:rsv2:rsv3:mask",
"wf:-fin:-rsv1:-rsv2:-rsv3:-mask",
@@ -67,7 +67,7 @@ class TestWebsocketFrame:
assert self.fr("wf:ctext").header.opcode ==\
netlib.websockets.OPCODE.TEXT
- def test_auto_raw(self):
+ def test_construction(self):
# Simple server frame
frm = self.fr("wf:b'foo'")
assert not frm.header.mask
@@ -99,3 +99,10 @@ class TestWebsocketFrame:
# We're reading back a corrupted frame - the first 3 characters of the
# mask is mis-interpreted as the payload
assert frm.payload == "abc"
+
+ def test_knone(self):
+ tutils.raises(
+ "expected 4 bytes",
+ self.fr,
+ "wf:b'foo':mask:knone",
+ )