Example #1
0
 def _parse_string_to_message(self, stream):
     parts = []
     try:
         if not self.handshake['received']:  # must be handshake
             try:
                 parts.append(ord(stream.read(1)))
                 pstrlen = parts[0]
                 # protocol string,  reserved,  info hash,  peer_id
                 for l in (pstrlen, 8, 20, 20):
                     parts.append(stream.read(l))
                 info_hash, peer_id = parts[3], parts[4]
                 return messages.Handshake(peer_id, info_hash,
                                           reserved=parts[2],
                                           pstr=parts[1],
                                           msg_event=messages.INCOMING)
             except torrent_exceptions.RanDryException as e:
                 leftover = ''.join(parts)+e.unused
                 raise torrent_exceptions.LeftoverException(value=leftover)
         # normal message
         try:
             parts.append(stream.read(4))
             bytes_length_prefix = parts[0]
             length = four_bytes_to_int(bytes_length_prefix)
             if length == 0:
                 return messages.KeepAlive()
             parts.append(stream.read(length))
             msg_body = parts[1]
             msg_id = ord(msg_body[0])
             return messages.lookup[msg_id](msg_body[1:],
                                            from_string=True,
                                            msg_event=messages.INCOMING)
         except torrent_exceptions.RanDryException as e:
             leftover = ''.join(parts)+e.unused
             raise torrent_exceptions.LeftoverException(value=leftover)
     except torrent_exceptions.MessageParsingError as e:
         self.handle_exception(e)
Example #2
0
 def _parse_string(self):
     return [four_bytes_to_int(self._string[i:i+4])
             for i in (0, 4)]+[self._string[8:]]
Example #3
0
 def piece_index(self):
     return four_bytes_to_int(self.payload)