pull/1/head
Tatsuhiro Tsujikawa 2006-02-22 15:40:04 +00:00
parent 5a624f5a3d
commit cd5f591c41
7 changed files with 66 additions and 8 deletions

View File

@ -1,5 +1,14 @@
2006-02-22 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
2006-02-23 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
* Release 0.2.0
* main.cc:
* HttpInitiateConnectionCommand.{h,cc}:
* prefs.h:
* HttpConnection.{h,cc}: added --http-proxy-method option.
We can now use GET command in http proxy.
2006-02-22 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
* SplitSlowestSegmentSplitter.{h,cc}: This class provies algorithm
that splits slowest segment of SegmentMan::commands vector.
This is the default split algorithm of aria2.

View File

@ -41,22 +41,26 @@ void HttpConnection::sendProxyRequest() const {
string(" HTTP/1.1\r\n")+
"Host: "+getHost(req->getHost(), req->getPort())+"\r\n";
if(useProxyAuth()) {
request += "Proxy-Authorization: Basic "+
Base64::encode(option->get(PREF_HTTP_PROXY_USER)+":"+
option->get(PREF_HTTP_PROXY_PORT))+"\r\n";
request += getProxyAuthString();
}
request += "\r\n";
logger->info(MSG_SENDING_REQUEST, cuid, request.c_str());
socket->writeData(request.c_str(), request.size());
}
string HttpConnection::getProxyAuthString() const {
return "Proxy-Authorization: Basic "+
Base64::encode(option->get(PREF_HTTP_PROXY_USER)+":"+
option->get(PREF_HTTP_PROXY_PORT))+"\r\n";
}
string HttpConnection::getHost(const string& host, int port) const {
return host+(port == 80 || port == 443 ? "" : ":"+Util::llitos(port));
}
string HttpConnection::createRequest(const Segment& segment) const {
string request = string("GET ")+
(req->getProtocol() == "ftp" ?
(req->getProtocol() == "ftp" || useProxy() && useProxyGet() ?
req->getCurrentUrl() :
((req->getDir() == "/" ? "/" : req->getDir()+"/")+req->getFile()))+
string(" HTTP/1.1\r\n")+
@ -70,6 +74,9 @@ string HttpConnection::createRequest(const Segment& segment) const {
request += "Range: bytes="+
Util::llitos(segment.sp+segment.ds)+"-"+Util::llitos(segment.ep)+"\r\n";
}
if(useProxy() && useProxyAuth() && useProxyGet()) {
request += getProxyAuthString();
}
if(option->get(PREF_HTTP_AUTH_SCHEME) == V_BASIC) {
request += "Authorization: Basic "+
Base64::encode(option->get(PREF_HTTP_USER)+":"+
@ -96,6 +103,9 @@ int HttpConnection::receiveResponse(HttpHeader& headers) {
while(socket->isReadable(0)) {
int size = sizeof(buf)-1;
socket->peekData(buf, size);
if(size == 0) {
throw new DlRetryEx(EX_INVALID_RESPONSE);
}
buf[size] = '\0';
int hlenTemp = header.size();
header += buf;
@ -145,3 +155,7 @@ bool HttpConnection::useProxy() const {
bool HttpConnection::useProxyAuth() const {
return option->get(PREF_HTTP_PROXY_AUTH_ENABLED) == V_TRUE;
}
bool HttpConnection::useProxyGet() const {
return option->get(PREF_HTTP_PROXY_METHOD) == V_GET;
}

View File

@ -41,6 +41,8 @@ private:
string createRequest(const Segment& segment) const;
bool useProxy() const;
bool useProxyAuth() const;
bool useProxyGet() const;
string getProxyAuthString() const;
int cuid;
const Socket* socket;
const Request* req;

View File

@ -23,6 +23,7 @@
#include "HttpRequestCommand.h"
#include "HttpProxyRequestCommand.h"
#include "Util.h"
#include "DlAbortEx.h"
#include "message.h"
#include "prefs.h"
@ -40,8 +41,14 @@ bool HttpInitiateConnectionCommand::executeInternal(Segment segment) {
e->option->getAsInt(PREF_HTTP_PROXY_PORT));
socket->establishConnection(e->option->get(PREF_HTTP_PROXY_HOST),
e->option->getAsInt(PREF_HTTP_PROXY_PORT));
command = new HttpProxyRequestCommand(cuid, req, e, socket);
if(useProxyTunnel()) {
command = new HttpProxyRequestCommand(cuid, req, e, socket);
} else if(useProxyGet()) {
command = new HttpRequestCommand(cuid, req, e, socket);
} else {
// TODO
throw new DlAbortEx("ERROR");
}
} else {
e->logger->info(MSG_CONNECTING_TO_SERVER, cuid, req->getHost().c_str(),
req->getPort());
@ -55,3 +62,11 @@ bool HttpInitiateConnectionCommand::executeInternal(Segment segment) {
bool HttpInitiateConnectionCommand::useProxy() {
return e->option->get(PREF_HTTP_PROXY_ENABLED) == V_TRUE;
}
bool HttpInitiateConnectionCommand::useProxyGet() {
return e->option->get(PREF_HTTP_PROXY_METHOD) == V_GET;
}
bool HttpInitiateConnectionCommand::useProxyTunnel() {
return e->option->get(PREF_HTTP_PROXY_METHOD) == V_TUNNEL;
}

View File

@ -27,6 +27,8 @@
class HttpInitiateConnectionCommand : public AbstractCommand {
private:
bool useProxy();
bool useProxyGet();
bool useProxyTunnel();
protected:
/**
* Connect to the server.

View File

@ -124,6 +124,9 @@ void showUsage() {
cout << " --http-passwd=PASSWD Set HTTP password. This affects to all URLs." << endl;
cout << " --http-proxy-user=USER Set HTTP proxy user. This affects to all URLs" << endl;
cout << " --http-proxy-passwd=PASSWD Set HTTP proxy password. This affects to all URLs." << endl;
cout << " --http-proxy-method=METHOD Set the method to use in proxy request." << endl;
cout << " METHOD is either 'get' or 'tunnel'." << endl;
cout << " Default: tunnel" << endl;
cout << " --http-auth-scheme=SCHEME Set HTTP authentication scheme. Currently, basic" << endl;
cout << " is the only supported scheme. You MUST specify" << endl;
cout << " this option in order to use HTTP authentication" << endl;
@ -137,7 +140,7 @@ void showUsage() {
cout << " or 'ascii'." << endl;
cout << " Default: binary" << endl;
cout << " -p, --ftp-pasv Use passive mode in FTP." << endl;
cout << " --ftp-via-http-proxy=WAY Use HTTP proxy in FTP. WAY is either 'get' or" << endl;
cout << " --ftp-via-http-proxy=METHOD Use HTTP proxy in FTP. METHOD is either 'get' or" << endl;
cout << " 'tunnel'." << endl;
cout << " Default: tunnel" << endl;
cout << " -v, --version Print the version number and exit." << endl;
@ -175,6 +178,7 @@ int main(int argc, char* argv[]) {
op->put(PREF_TIMEOUT, "60");
op->put(PREF_MIN_SEGMENT_SIZE, "1048576");// 1M
op->put(PREF_MAX_TRIES, "5");
op->put(PREF_HTTP_PROXY_METHOD, V_TUNNEL);
op->put(PREF_FTP_USER, "anonymous");
op->put(PREF_FTP_PASSWD, "ARIA2USER@");
op->put(PREF_FTP_TYPE, V_BINARY);
@ -205,6 +209,7 @@ int main(int argc, char* argv[]) {
{ "ftp-pasv", no_argument, NULL, 'p' },
{ "ftp-via-http-proxy", required_argument, &lopt, 12 },
{ "min-segment-size", required_argument, &lopt, 13 },
{ "http-proxy-method", required_argument, &lopt, 14 },
{ "version", no_argument, NULL, 'v' },
{ "help", no_argument, NULL, 'h' },
{ 0, 0, 0, 0 }
@ -308,6 +313,15 @@ int main(int argc, char* argv[]) {
op->put(PREF_MIN_SEGMENT_SIZE, Util::llitos(size));
break;
}
case 14:
if(string(optarg) == V_GET || string(optarg) == V_TUNNEL) {
op->put(PREF_HTTP_PROXY_METHOD, optarg);
} else {
cerr << "http-proxy-method must be either 'get' or 'tunnel'." << endl;
showUsage();
exit(1);
}
break;
}
break;
}

View File

@ -72,6 +72,8 @@
#define PREF_HTTP_PROXY_PASSWD "http_proxy_passwd"
#define PREF_HTTP_PROXY_HOST "http_proxy_host"
#define PREF_HTTP_PROXY_PORT "http_proxy_port"
// values: get | tunnel
#define PREF_HTTP_PROXY_METHOD "http_proxy_method"
// values: true | false
#define PREF_HTTP_PROXY_ENABLED "http_proxy_enabled"
// values: true | false