def _handle_requests(self, message_id: MessageType, payload: memoryview):
piece_index, begin, length = struct.unpack('!3I', cast(bytes, payload))
request = BlockRequest(piece_index, begin, length)
self._check_position_range(request)
if message_id == MessageType.request:
if length > PeerTCPClient.MAX_REQUEST_LENGTH:
raise ValueError('Requested {} bytes, but the current policy allows to accept requests '
'of not more than {} bytes'.format(length, PeerTCPClient.MAX_REQUEST_LENGTH))
if (self._am_choking or not self._peer_interested or
not self._download_info.pieces[piece_index].downloaded):
# If peer isn't interested but requesting, their peer_interested flag wasn't considered
# when selecting who to unchoke, so we may be not ready to upload to them.
# If requested piece is not downloaded yet, we shouldn't disconnect because our piece_downloaded flag
# could be removed because of file corruption.
return
await self._send_block(request)
await self.drain()
elif message_id == MessageType.cancel:
# Now we answer to a request immediately or reject and forget it,
# so there's no need to handle cancel messages
pass
评论列表
文章目录