summaryrefslogtreecommitdiff
path: root/src/AbstractCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-01-30 00:17:54 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-01-30 00:17:54 +0900
commitcf2fa33fe0d73f7001d262beee5e8aba03544126 (patch)
tree338c442bac72e4ea7920970de6bc122b3485ad68 /src/AbstractCommand.cc
parent96247475315f6373c31f53bb658c7d59f48e8171 (diff)
WinTLS: Fix hang because of buffered received data
WinTLSSession buffers received decrypted data into its own buffer. If read is requested, it copies the data from its buffer. But if requested buffer size is less than decrypted buffer, some of the data is left in the buffer. Previously, we had no facility to check the existence of this pending data. If this data is the last requested data from remote server, we may end up waiting for read event even if we have already data in our buffer, which may cause hang. This commit fixes this issue by introducing function to return the buffered length in TLSSession. SocketCore also provides the same function, which delegates to TLSSession object.
Diffstat (limited to 'src/AbstractCommand.cc')
-rw-r--r--src/AbstractCommand.cc7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc
index 27762cc8..c2ead096 100644
--- a/src/AbstractCommand.cc
+++ b/src/AbstractCommand.cc
@@ -148,6 +148,10 @@ bool AbstractCommand::shouldProcess() const
if (socketRecvBuffer_ && !socketRecvBuffer_->bufferEmpty()) {
return true;
}
+
+ if (socket_ && socket_->getRecvBufferedLength()) {
+ return true;
+ }
}
if (checkSocketIsWritable_ && writeEventEnabled()) {
@@ -916,7 +920,8 @@ const std::shared_ptr<PieceStorage>& AbstractCommand::getPieceStorage() const
void AbstractCommand::checkSocketRecvBuffer()
{
- if (socketRecvBuffer_->bufferEmpty()) {
+ if (socketRecvBuffer_->bufferEmpty() &&
+ socket_->getRecvBufferedLength() == 0) {
return;
}