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)
def _parse_string(self): return [four_bytes_to_int(self._string[i:i+4]) for i in (0, 4)]+[self._string[8:]]
def piece_index(self): return four_bytes_to_int(self.payload)