You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.5 KiB
46 lines
1.5 KiB
import urllib |
|
|
|
from . import packet |
|
|
|
|
|
class Payload(object): |
|
"""Engine.IO payload.""" |
|
max_decode_packets = 16 |
|
|
|
def __init__(self, packets=None, encoded_payload=None): |
|
self.packets = packets or [] |
|
if encoded_payload is not None: |
|
self.decode(encoded_payload) |
|
|
|
def encode(self, jsonp_index=None): |
|
"""Encode the payload for transmission.""" |
|
encoded_payload = '' |
|
for pkt in self.packets: |
|
if encoded_payload: |
|
encoded_payload += '\x1e' |
|
encoded_payload += pkt.encode(b64=True) |
|
if jsonp_index is not None: |
|
encoded_payload = '___eio[' + \ |
|
str(jsonp_index) + \ |
|
']("' + \ |
|
encoded_payload.replace('"', '\\"') + \ |
|
'");' |
|
return encoded_payload |
|
|
|
def decode(self, encoded_payload): |
|
"""Decode a transmitted payload.""" |
|
self.packets = [] |
|
|
|
if len(encoded_payload) == 0: |
|
return |
|
|
|
# JSONP POST payload starts with 'd=' |
|
if encoded_payload.startswith('d='): |
|
encoded_payload = urllib.parse.parse_qs( |
|
encoded_payload)['d'][0] |
|
|
|
encoded_packets = encoded_payload.split('\x1e') |
|
if len(encoded_packets) > self.max_decode_packets: |
|
raise ValueError('Too many packets in payload') |
|
self.packets = [packet.Packet(encoded_packet=encoded_packet) |
|
for encoded_packet in encoded_packets]
|
|
|