예제 #1
0
파일: websocket.py 프로젝트: vFense/vFense
 def decode_hixie(buf):
     end = buf.find(s2b('\xff'))
     return {
         'payload': b64decode(buf[1:end]),
         'hlen': 1,
         'masked': False,
         'length': end - 1,
         'left': len(buf) - (end + 1)
     }
예제 #2
0
 def decode_hixie(buf):
     end = buf.find(s2b("\xff"))
     return {
         "payload": b64decode(buf[1:end]),
         "hlen": 1,
         "masked": False,
         "length": end - 1,
         "left": len(buf) - (end + 1),
     }
예제 #3
0
파일: websocket.py 프로젝트: vFense/vFense
    def decode_hybi(buf, base64=False):
        """ Decode HyBi style WebSocket packets.
        Returns:
            {'fin'          : 0_or_1,
             'opcode'       : number,
             'masked'       : boolean,
             'hlen'         : header_bytes_number,
             'length'       : payload_bytes_number,
             'payload'      : decoded_buffer,
             'left'         : bytes_left_number,
             'close_code'   : number,
             'close_reason' : string}
        """

        f = {
            'fin': 0,
            'opcode': 0,
            'masked': False,
            'hlen': 2,
            'length': 0,
            'payload': None,
            'left': 0,
            'close_code': 1000,
            'close_reason': ''
        }

        blen = len(buf)
        f['left'] = blen

        if blen < f['hlen']:
            return f  # Incomplete frame header

        b1, b2 = unpack_from(">BB", buf)
        f['opcode'] = b1 & 0x0f
        f['fin'] = (b1 & 0x80) >> 7
        f['masked'] = (b2 & 0x80) >> 7

        f['length'] = b2 & 0x7f

        if f['length'] == 126:
            f['hlen'] = 4
            if blen < f['hlen']:
                return f  # Incomplete frame header
            (f['length'], ) = unpack_from('>xxH', buf)
        elif f['length'] == 127:
            f['hlen'] = 10
            if blen < f['hlen']:
                return f  # Incomplete frame header
            (f['length'], ) = unpack_from('>xxQ', buf)

        full_len = f['hlen'] + f['masked'] * 4 + f['length']

        if blen < full_len:  # Incomplete frame
            return f  # Incomplete frame header

        # Number of bytes that are part of the next frame(s)
        f['left'] = blen - full_len

        # Process 1 frame
        if f['masked']:
            # unmask payload
            f['payload'] = WebSocketServer.unmask(buf, f['hlen'], f['length'])
        else:
            print("Unmasked frame: %s" % repr(buf))
            f['payload'] = buf[(f['hlen'] + f['masked'] * 4):full_len]

        if base64 and f['opcode'] in [1, 2]:
            try:
                f['payload'] = b64decode(f['payload'])
            except:
                print("Exception while b64decoding buffer: %s" % repr(buf))
                raise

        if f['opcode'] == 0x08:
            if f['length'] >= 2:
                f['close_code'] = unpack_from(">H", f['payload'])[0]
            if f['length'] > 3:
                f['close_reason'] = f['payload'][2:]

        return f
예제 #4
0
    def decode_hybi(buf, base64=False):
        """ Decode HyBi style WebSocket packets.
        Returns:
            {'fin'          : 0_or_1,
             'opcode'       : number,
             'masked'       : boolean,
             'hlen'         : header_bytes_number,
             'length'       : payload_bytes_number,
             'payload'      : decoded_buffer,
             'left'         : bytes_left_number,
             'close_code'   : number,
             'close_reason' : string}
        """

        f = {
            "fin": 0,
            "opcode": 0,
            "masked": False,
            "hlen": 2,
            "length": 0,
            "payload": None,
            "left": 0,
            "close_code": 1000,
            "close_reason": "",
        }

        blen = len(buf)
        f["left"] = blen

        if blen < f["hlen"]:
            return f  # Incomplete frame header

        b1, b2 = unpack_from(">BB", buf)
        f["opcode"] = b1 & 0x0F
        f["fin"] = (b1 & 0x80) >> 7
        f["masked"] = (b2 & 0x80) >> 7

        f["length"] = b2 & 0x7F

        if f["length"] == 126:
            f["hlen"] = 4
            if blen < f["hlen"]:
                return f  # Incomplete frame header
            (f["length"],) = unpack_from(">xxH", buf)
        elif f["length"] == 127:
            f["hlen"] = 10
            if blen < f["hlen"]:
                return f  # Incomplete frame header
            (f["length"],) = unpack_from(">xxQ", buf)

        full_len = f["hlen"] + f["masked"] * 4 + f["length"]

        if blen < full_len:  # Incomplete frame
            return f  # Incomplete frame header

        # Number of bytes that are part of the next frame(s)
        f["left"] = blen - full_len

        # Process 1 frame
        if f["masked"]:
            # unmask payload
            f["payload"] = WebSocketServer.unmask(buf, f["hlen"], f["length"])
        else:
            print("Unmasked frame: %s" % repr(buf))
            f["payload"] = buf[(f["hlen"] + f["masked"] * 4) : full_len]

        if base64 and f["opcode"] in [1, 2]:
            try:
                f["payload"] = b64decode(f["payload"])
            except:
                print("Exception while b64decoding buffer: %s" % repr(buf))
                raise

        if f["opcode"] == 0x08:
            if f["length"] >= 2:
                f["close_code"] = unpack_from(">H", f["payload"])[0]
            if f["length"] > 3:
                f["close_reason"] = f["payload"][2:]

        return f