summaryrefslogtreecommitdiff
path: root/src/AbstractCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-10-17 16:26:51 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-10-17 16:26:51 +0000
commit884a139e725f4c3968929dca734eef6812cf2e6f (patch)
tree725212a598e43041bca09a082da1cf1cd6e7c8e6 /src/AbstractCommand.cc
parent343228629a69870cf47640a63e32f7b237403aa5 (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.cc20
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();