bypass parser during download

This commit is contained in:
Victor Shyba 2019-02-07 20:20:39 -03:00
parent a616582733
commit 5586a226c2

View file

@ -32,6 +32,8 @@ class BlobExchangeClientProtocol(asyncio.Protocol):
if self._response_fut and not self._response_fut.done(): if self._response_fut and not self._response_fut.done():
self._response_fut.cancel() self._response_fut.cancel()
return return
if self._blob_bytes_received and not self.writer.closed():
return self._write(data)
response = BlobResponse.deserialize(data) response = BlobResponse.deserialize(data)
@ -51,23 +53,27 @@ class BlobExchangeClientProtocol(asyncio.Protocol):
if response.blob_data and self.writer and not self.writer.closed(): if response.blob_data and self.writer and not self.writer.closed():
log.debug("got %i blob bytes from %s:%i", len(response.blob_data), self.peer_address, self.peer_port) log.debug("got %i blob bytes from %s:%i", len(response.blob_data), self.peer_address, self.peer_port)
# write blob bytes if we're writing a blob and have blob bytes to write # write blob bytes if we're writing a blob and have blob bytes to write
if len(response.blob_data) > (self.blob.get_length() - self._blob_bytes_received): self._write(response.blob_data)
data = response.blob_data[:(self.blob.get_length() - self._blob_bytes_received)]
log.warning("got more than asked from %s:%d, probable sendfile bug", self.peer_address, self.peer_port)
else: def _write(self, data):
data = response.blob_data if len(data) > (self.blob.get_length() - self._blob_bytes_received):
self._blob_bytes_received += len(data) data = data[:(self.blob.get_length() - self._blob_bytes_received)]
try: log.warning("got more than asked from %s:%d, probable sendfile bug", self.peer_address, self.peer_port)
self.writer.write(data) else:
return data = data
except IOError as err: self._blob_bytes_received += len(data)
log.error("error downloading blob from %s:%i: %s", self.peer_address, self.peer_port, err) try:
if self._response_fut and not self._response_fut.done(): self.writer.write(data)
self._response_fut.set_exception(err) return
except (asyncio.CancelledError, asyncio.TimeoutError) as err: # TODO: is this needed? except IOError as err:
log.error("%s downloading blob from %s:%i", str(err), self.peer_address, self.peer_port) log.error("error downloading blob from %s:%i: %s", self.peer_address, self.peer_port, err)
if self._response_fut and not self._response_fut.done(): if self._response_fut and not self._response_fut.done():
self._response_fut.set_exception(err) self._response_fut.set_exception(err)
except (asyncio.CancelledError, asyncio.TimeoutError) as err: # TODO: is this needed?
log.error("%s downloading blob from %s:%i", str(err), self.peer_address, self.peer_port)
if self._response_fut and not self._response_fut.done():
self._response_fut.set_exception(err)
async def _download_blob(self) -> typing.Tuple[bool, bool]: async def _download_blob(self) -> typing.Tuple[bool, bool]:
""" """