38 """ The Fragmentation capability doesn't define any incoming operation 39 handlers, but provides methods to fragment outgoing messages """ 41 fragmentation_seed = 0
45 Capability.__init__(self, protocol)
47 def fragment(self, message, fragment_size, mid=None):
48 """ Serializes the provided message, then splits the serialized 49 message according to fragment_size, then sends the fragments. 51 If the size of the message is less than the fragment size, then 52 the original message is returned rather than a single fragment 54 Since fragmentation is typically only used for very large messages, 55 this method returns a generator for fragments rather than a list 58 message -- the message dict object to be fragmented 59 fragment_size -- the max size for the fragments 60 mid -- (optional) if provided, the fragment messages 61 will be given this id. Otherwise an id will be auto-generated. 63 Returns a generator of message dict objects representing the fragments 70 serialized = self.protocol.serialize(message, mid)
72 if serialized
is None:
75 message_length = len(serialized)
76 if message_length <= fragment_size:
79 msg_id = message.get(
"id",
None)
81 expected_duration = int(math.ceil(math.ceil(message_length / float(fragment_size))) * self.protocol.delay_between_messages)
83 log_msg =
"sending " + str(int(math.ceil(message_length / float(fragment_size)))) +
" parts [fragment size: " + str(fragment_size) +
"; expected duration: ~" + str(expected_duration) +
"s]" 84 self.protocol.log(
"info", log_msg)
89 """ Returns a generator of fragment messages """ 90 total = ((len(msg)-1) / size) + 1
92 for i
in range(0, len(msg), size):
93 fragment = msg[i:i+size]
98 """ Given a string fragment of the original message, creates 99 the appropriate fragment message """
def fragment(self, message, fragment_size, mid=None)
def __init__(self, protocol)
def _create_fragment(self, fragment, num, total, mid)
def _fragment_generator(self, msg, size, mid)