diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-11-05 12:30:22 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-11-05 12:30:22 +0000 |
| commit | 93a49e484065d47b5d8426ab3c5a5f12ec8899d4 (patch) | |
| tree | 4d1e0eb211d549393551cc8579a2b3aa0bf2f762 /src/FtpInitiateConnectionCommand.cc | |
| parent | 4797b0e72dc8de97a04670f66a98a249065052fc (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.cc | 61 |
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; |
