diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2007-10-17 16:26:51 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2007-10-17 16:26:51 +0000 |
| commit | 884a139e725f4c3968929dca734eef6812cf2e6f (patch) | |
| tree | 725212a598e43041bca09a082da1cf1cd6e7c8e6 /src/AbstractCommand.cc | |
| parent | 343228629a69870cf47640a63e32f7b237403aa5 (diff) | |
2007-10-18 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added HTTP/1.1 keep alive and pipelining support.
See --enable-http-keep-alive and --enable-http-pipelining
option.
* src/AbstractCommand.{h, cc}: Now it has one-to-many relation
to
Segment.
* src/HttpDownloadCommand.{h, cc}
* src/OptionHandlerFactory.cc
* src/HttpConnection.{h, cc}
* src/version_usage.cc
* src/HttpInitiateConnectionCommand.cc
* src/FtpInitiateConnectionCommand.cc
* src/Segment.h
* src/HttpRequestCommand.{h, cc}
* src/option_processing.cc
* src/prefs.h
* src/HttpResponseCommand.cc
* src/SegmentMan.{h, cc}
* src/FtpNegotiateCommand.cc
* src/HttpProxyResponseCommand.cc
* src/Request.cc
* src/HttpRequest.cc
* src/DownloadCommand.cc
* test/HttpRequestTest.cc
* test/RequestTest.cc
Diffstat (limited to 'src/AbstractCommand.cc')
| -rw-r--r-- | src/AbstractCommand.cc | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc index e4bd954b..9705386f 100644 --- a/src/AbstractCommand.cc +++ b/src/AbstractCommand.cc @@ -65,7 +65,6 @@ AbstractCommand::AbstractCommand(int32_t cuid, const SocketHandle& s): Command(cuid), RequestGroupAware(requestGroup), req(req), e(e), socket(s), - segment(0), checkSocketIsReadable(false), checkSocketIsWritable(false), nameResolverCheck(false) { @@ -107,12 +106,23 @@ bool AbstractCommand::execute() { !checkSocketIsReadable && !checkSocketIsWritable && !nameResolverCheck) { checkPoint.reset(); if(!_requestGroup->getPieceStorage().isNull()) { - if(segment.isNull()) { - segment = _requestGroup->getSegmentMan()->getSegment(cuid); + _segments = _requestGroup->getSegmentMan()->getInFlightSegment(cuid); + int32_t maxSegments; + if(req->isKeepAlive() && e->option->get(PREF_ENABLE_HTTP_PIPELINING) == V_TRUE) { + maxSegments = e->option->getAsInt(PREF_MAX_HTTP_PIPELINING); + } else { + maxSegments = 1; + } + while((int32_t)_segments.size() < maxSegments) { + SegmentHandle segment = _requestGroup->getSegmentMan()->getSegment(cuid); if(segment.isNull()) { - logger->info(MSG_NO_SEGMENT_AVAILABLE, cuid); - return prepareForRetry(1); + break; } + _segments.push_back(segment); + } + if(_segments.empty()) { + logger->info(MSG_NO_SEGMENT_AVAILABLE, cuid); + return prepareForRetry(1); } } return executeInternal(); |
