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 ]