summaryrefslogtreecommitdiff
path: root/src/HttpRequestCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-04-22 07:15:35 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-04-22 07:15:35 +0000
commit1c7c6f989800b10d3820614123dcfc7d90677c85 (patch)
treeda975ff7108b488e8ebde512db6a10179d88ea2e /src/HttpRequestCommand.cc
parentf1816a1d4b4b1fda84533500c7c15de05799a058 (diff)
2008-04-22 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Rewritten HTTP keep-alive and pipelining routine. * src/AbstractCommand.cc * src/HttpConnection.cc * src/HttpDownloadCommand.cc * src/HttpRequest.cc * src/HttpRequestCommand.cc * src/HttpResponseCommand.cc * src/Request.cc * src/Request.h * src/RequestGroup.cc * test/HttpRequestTest.cc * test/HttpResponseTest.cc * test/RequestTest.cc
Diffstat (limited to 'src/HttpRequestCommand.cc')
-rw-r--r--src/HttpRequestCommand.cc64
1 files changed, 31 insertions, 33 deletions
diff --git a/src/HttpRequestCommand.cc b/src/HttpRequestCommand.cc
index 4f5bc131..cc76a9be 100644
--- a/src/HttpRequestCommand.cc
+++ b/src/HttpRequestCommand.cc
@@ -47,12 +47,13 @@
namespace aria2 {
-HttpRequestCommand::HttpRequestCommand(int cuid,
- const RequestHandle& req,
- RequestGroup* requestGroup,
- const HttpConnectionHandle& httpConnection,
- DownloadEngine* e,
- const SocketHandle& s)
+HttpRequestCommand::HttpRequestCommand
+(int cuid,
+ const RequestHandle& req,
+ RequestGroup* requestGroup,
+ const HttpConnectionHandle& httpConnection,
+ DownloadEngine* e,
+ const SocketHandle& s)
:AbstractCommand(cuid, req, requestGroup, e, s),
_httpConnection(httpConnection)
{
@@ -62,44 +63,41 @@ HttpRequestCommand::HttpRequestCommand(int cuid,
HttpRequestCommand::~HttpRequestCommand() {}
+static SharedHandle<HttpRequest>
+createHttpRequest(const SharedHandle<Request>& req,
+ const SharedHandle<Segment>& segment,
+ uint64_t totalLength,
+ const Option* option)
+{
+ HttpRequestHandle httpRequest(new HttpRequest());
+ httpRequest->setUserAgent(option->get(PREF_USER_AGENT));
+ httpRequest->setRequest(req);
+ httpRequest->setSegment(segment);
+ httpRequest->setEntityLength(totalLength);
+ httpRequest->setUserHeaders(option->get(PREF_HEADER));
+ httpRequest->configure(option);
+
+ return httpRequest;
+}
+
bool HttpRequestCommand::executeInternal() {
socket->setBlockingMode();
if(req->getProtocol() == "https") {
socket->initiateSecureConnection();
}
- 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);
- }
if(_segments.empty()) {
- HttpRequestHandle httpRequest(new HttpRequest());
- httpRequest->setUserAgent(e->option->get(PREF_USER_AGENT));
- httpRequest->setRequest(req);
- httpRequest->setEntityLength(_requestGroup->getTotalLength());
- httpRequest->setUserHeaders(e->option->get(PREF_HEADER));
- httpRequest->configure(e->option);
-
+ HttpRequestHandle httpRequest
+ (createHttpRequest(req, SharedHandle<Segment>(),
+ _requestGroup->getTotalLength(), e->option));
_httpConnection->sendRequest(httpRequest);
} else {
for(Segments::iterator itr = _segments.begin(); itr != _segments.end(); ++itr) {
- SegmentHandle segment = *itr;
+ const 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->setUserHeaders(e->option->get(PREF_HEADER));
- httpRequest->configure(e->option);
-
+ HttpRequestHandle httpRequest
+ (createHttpRequest(req, segment,
+ _requestGroup->getTotalLength(), e->option));
_httpConnection->sendRequest(httpRequest);
}
}