mirror of https://github.com/aria2/aria2
2008-10-23 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Pool connection when redirection occurs with Content-Length = 0. * src/HttpSkipResponseCommand.cc * src/HttpSkipResponseCommand.hpull/1/head
parent
d538c9ae97
commit
90c6d5072b
|
@ -1,3 +1,9 @@
|
|||
2008-10-23 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||
|
||||
Pool connection when redirection occurs with Content-Length = 0.
|
||||
* src/HttpSkipResponseCommand.cc
|
||||
* src/HttpSkipResponseCommand.h
|
||||
|
||||
2008-10-22 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||
|
||||
Fixed the bug that causes time out when redirection occurs with
|
||||
|
|
|
@ -80,6 +80,13 @@ void HttpSkipResponseCommand::setTransferEncodingDecoder
|
|||
bool HttpSkipResponseCommand::executeInternal()
|
||||
{
|
||||
if(_totalLength == 0 && _transferEncodingDecoder.isNull()) {
|
||||
// If content-length header is present and it's value is 0, then
|
||||
// pool socket for reuse.
|
||||
// If content-length header is not present, then EOF is expected in the end.
|
||||
// In this case, the content is thrown away and socket cannot be pooled.
|
||||
if(_httpResponse->getHttpHeader()->defined(HttpHeader::CONTENT_LENGTH)) {
|
||||
poolConnection();
|
||||
}
|
||||
return processResponse();
|
||||
}
|
||||
const size_t BUFSIZE = 16*1024;
|
||||
|
@ -118,12 +125,7 @@ bool HttpSkipResponseCommand::executeInternal()
|
|||
finished = _transferEncodingDecoder->finished();
|
||||
}
|
||||
if(finished) {
|
||||
if(!e->option->getAsBool(PREF_HTTP_PROXY_ENABLED) &&
|
||||
req->supportsPersistentConnection()) {
|
||||
std::pair<std::string, uint16_t> peerInfo;
|
||||
socket->getPeerInfo(peerInfo);
|
||||
e->poolSocket(peerInfo.first, peerInfo.second, socket);
|
||||
}
|
||||
poolConnection();
|
||||
return processResponse();
|
||||
} else {
|
||||
setWriteCheckSocketIf(socket, socket->wantWrite());
|
||||
|
@ -132,6 +134,16 @@ bool HttpSkipResponseCommand::executeInternal()
|
|||
}
|
||||
}
|
||||
|
||||
void HttpSkipResponseCommand::poolConnection() const
|
||||
{
|
||||
if(!e->option->getAsBool(PREF_HTTP_PROXY_ENABLED) &&
|
||||
req->supportsPersistentConnection()) {
|
||||
std::pair<std::string, uint16_t> peerInfo;
|
||||
socket->getPeerInfo(peerInfo);
|
||||
e->poolSocket(peerInfo.first, peerInfo.second, socket);
|
||||
}
|
||||
}
|
||||
|
||||
bool HttpSkipResponseCommand::processResponse()
|
||||
{
|
||||
if(_httpResponse->isRedirect()) {
|
||||
|
|
|
@ -56,6 +56,8 @@ private:
|
|||
uint64_t _receivedBytes;
|
||||
|
||||
bool processResponse();
|
||||
|
||||
void poolConnection() const;
|
||||
protected:
|
||||
virtual bool executeInternal();
|
||||
public:
|
||||
|
|
Loading…
Reference in New Issue