diff options
| -rw-r--r-- | libpathod/language/websockets.py | 23 | ||||
| -rw-r--r-- | libpathod/templates/docs_lang_websockets.html | 15 | ||||
| -rw-r--r-- | test/test_language_websocket.py | 11 | 
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", +        ) | 
