summaryrefslogtreecommitdiff
path: root/src/FtpInitiateConnectionCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-11-05 12:30:22 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-11-05 12:30:22 +0000
commit93a49e484065d47b5d8426ab3c5a5f12ec8899d4 (patch)
tree4d1e0eb211d549393551cc8579a2b3aa0bf2f762 /src/FtpInitiateConnectionCommand.cc
parent4797b0e72dc8de97a04670f66a98a249065052fc (diff)
2008-11-05 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added the ability to pool proxy connection. The conneciton in FTP with proxy-method=GET is not pooled. Proxy-Connection header will not be sent when sending CONNECT method. * src/DownloadEngine.cc * src/DownloadEngine.h * src/FtpFinishDownloadCommand.cc * src/FtpInitiateConnectionCommand.cc * src/FtpNegotiationCommand.cc * src/HttpDownloadCommand.cc * src/HttpInitiateConnectionCommand.cc * src/HttpRequest.cc * src/HttpRequest.h * src/HttpResponse.cc * src/HttpSkipResponseCommand.cc * test/HttpRequestTest.cc * test/HttpResponseTest.cc
Diffstat (limited to 'src/FtpInitiateConnectionCommand.cc')
-rw-r--r--src/FtpInitiateConnectionCommand.cc61
1 files changed, 42 insertions, 19 deletions
diff --git a/src/FtpInitiateConnectionCommand.cc b/src/FtpInitiateConnectionCommand.cc
index a31670d1..f0f65948 100644
--- a/src/FtpInitiateConnectionCommand.cc
+++ b/src/FtpInitiateConnectionCommand.cc
@@ -68,26 +68,49 @@ Command* FtpInitiateConnectionCommand::createNextCommand
{
Command* command;
if(!proxyRequest.isNull()) {
- logger->info(MSG_CONNECTING_TO_SERVER, cuid,
- proxyRequest->getHost().c_str(), proxyRequest->getPort());
- socket.reset(new SocketCore());
- socket->establishConnection(resolvedAddresses.front(),
- proxyRequest->getPort());
-
- if(e->option->get(PREF_PROXY_METHOD) == V_GET) {
- SharedHandle<HttpConnection> hc
- (new HttpConnection(cuid, socket, e->option));
-
- HttpRequestCommand* c =
- new HttpRequestCommand(cuid, req, _requestGroup, hc, e, socket);
- c->setProxyRequest(proxyRequest);
- command = c;
- } else if(e->option->get(PREF_PROXY_METHOD) == V_TUNNEL) {
- command = new FtpTunnelRequestCommand(cuid, req, _requestGroup, e,
- proxyRequest, socket);
+ std::map<std::string, std::string> options;
+ SharedHandle<SocketCore> pooledSocket =
+ e->popPooledSocket(options, req->getHost(), req->getPort());
+ if(pooledSocket.isNull()) {
+ logger->info(MSG_CONNECTING_TO_SERVER, cuid,
+ proxyRequest->getHost().c_str(), proxyRequest->getPort());
+ socket.reset(new SocketCore());
+ socket->establishConnection(resolvedAddresses.front(),
+ proxyRequest->getPort());
+
+ if(e->option->get(PREF_PROXY_METHOD) == V_GET) {
+ SharedHandle<HttpConnection> hc
+ (new HttpConnection(cuid, socket, e->option));
+
+ HttpRequestCommand* c =
+ new HttpRequestCommand(cuid, req, _requestGroup, hc, e, socket);
+ c->setProxyRequest(proxyRequest);
+ command = c;
+ } else if(e->option->get(PREF_PROXY_METHOD) == V_TUNNEL) {
+ command = new FtpTunnelRequestCommand(cuid, req, _requestGroup, e,
+ proxyRequest, socket);
+ } else {
+ // TODO
+ throw DlAbortEx("ERROR");
+ }
} else {
- // TODO
- throw DlAbortEx("ERROR");
+ if(e->option->get(PREF_PROXY_METHOD) == V_TUNNEL) {
+ command =
+ new FtpNegotiationCommand(cuid, req, _requestGroup, e, pooledSocket,
+ FtpNegotiationCommand::SEQ_SEND_CWD,
+ options["baseWorkingDir"]);
+ } else if(e->option->get(PREF_PROXY_METHOD) == V_GET) {
+ SharedHandle<HttpConnection> hc
+ (new HttpConnection(cuid, pooledSocket, e->option));
+
+ HttpRequestCommand* c =
+ new HttpRequestCommand(cuid, req, _requestGroup, hc, e, pooledSocket);
+ c->setProxyRequest(proxyRequest);
+ command = c;
+ } else {
+ // TODO
+ throw DlAbortEx("ERROR");
+ }
}
} else {
std::map<std::string, std::string> options;