summaryrefslogtreecommitdiff
path: root/src/HttpRequestCommand.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/HttpRequestCommand.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/HttpRequestCommand.cc')
-rw-r--r--src/HttpRequestCommand.cc50
1 files changed, 38 insertions, 12 deletions
diff --git a/src/HttpRequestCommand.cc b/src/HttpRequestCommand.cc
index b5559715..f61ca2a5 100644
--- a/src/HttpRequestCommand.cc
+++ b/src/HttpRequestCommand.cc
@@ -38,13 +38,17 @@
#include "HttpResponseCommand.h"
#include "HttpConnection.h"
#include "prefs.h"
+#include "SegmentMan.h"
HttpRequestCommand::HttpRequestCommand(int cuid,
const RequestHandle& req,
RequestGroup* requestGroup,
+ const HttpConnectionHandle& httpConnection,
DownloadEngine* e,
const SocketHandle& s)
- :AbstractCommand(cuid, req, requestGroup, e, s) {
+ :AbstractCommand(cuid, req, requestGroup, e, s),
+ _httpConnection(httpConnection)
+{
disableReadCheckSocket();
setWriteCheckSocket(socket);
}
@@ -56,21 +60,43 @@ bool HttpRequestCommand::executeInternal() {
if(req->getProtocol() == "https") {
socket->initiateSecureConnection();
}
- if(!e->option->getAsBool(PREF_HTTP_KEEP_ALIVE)) {
+ if(e->option->get(PREF_ENABLE_HTTP_PIPELINING) == V_TRUE) {
+ req->setKeepAlive(true);
+ } else if(e->option->get(PREF_ENABLE_HTTP_KEEP_ALIVE) == V_TRUE &&
+ !_requestGroup->getSegmentMan().isNull() &&
+ _requestGroup->getSegmentMan()->countFreePieceFrom(_segments.front()->getIndex()+1) <= 4) {
+ // TODO Do we need to consider the case where content-length is unknown?
+ // TODO parameterize the value which enables keep-alive, '4'
+ req->setKeepAlive(true);
+ } else {
req->setKeepAlive(false);
}
- HttpRequestHandle httpRequest = new HttpRequest();
- httpRequest->setUserAgent(e->option->get(PREF_USER_AGENT));
- httpRequest->setRequest(req);
- httpRequest->setSegment(segment);
- httpRequest->setEntityLength(_requestGroup->getTotalLength());
- httpRequest->configure(e->option);
- HttpConnectionHandle httpConnection = new HttpConnection(cuid, socket, e->option);
+ if(_segments.empty()) {
+ HttpRequestHandle httpRequest = new HttpRequest();
+ httpRequest->setUserAgent(e->option->get(PREF_USER_AGENT));
+ httpRequest->setRequest(req);
+ httpRequest->setSegment(0);
+ httpRequest->setEntityLength(_requestGroup->getTotalLength());
+ httpRequest->configure(e->option);
+
+ _httpConnection->sendRequest(httpRequest);
+ } else {
+ for(Segments::iterator itr = _segments.begin(); itr != _segments.end(); ++itr) {
+ SegmentHandle segment = *itr;
+ if(!_httpConnection->isIssued(segment)) {
+ HttpRequestHandle httpRequest = new HttpRequest();
+ httpRequest->setUserAgent(e->option->get(PREF_USER_AGENT));
+ httpRequest->setRequest(req);
+ httpRequest->setSegment(segment);
+ httpRequest->setEntityLength(_requestGroup->getTotalLength());
+ httpRequest->configure(e->option);
- httpConnection->sendRequest(httpRequest);
-
- Command* command = new HttpResponseCommand(cuid, req, _requestGroup, httpConnection, e, socket);
+ _httpConnection->sendRequest(httpRequest);
+ }
+ }
+ }
+ Command* command = new HttpResponseCommand(cuid, req, _requestGroup, _httpConnection, e, socket);
e->commands.push_back(command);
return true;
}