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/HttpRequestCommand.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/HttpRequestCommand.cc')
| -rw-r--r-- | src/HttpRequestCommand.cc | 50 |
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; } |
