mirror of https://github.com/aria2/aria2
2008-04-20 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added --header option. You can specify any number of additional HTTP headers like: aria2 --header="X-A: 300" --header="X-B: 900" http://host/file Unlike other commad-line option, you can use --header option multiple times. * src/HelpItemFactory.cc * src/HttpRequest.{cc, h} * src/HttpRequestCommand.cc * src/OptionHandlerFactory.cc * src/OptionHandlerImpl.h * src/option_processing.cc * src/prefs.h * src/usage_text.h * test/HttpRequestTest.cc (testUserHeaders)pull/1/head
parent
c1c5e7369f
commit
3eb74629cb
16
ChangeLog
16
ChangeLog
|
@ -1,3 +1,19 @@
|
||||||
|
2008-04-20 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||||
|
|
||||||
|
Added --header option. You can specify any number of additional HTTP headers
|
||||||
|
like:
|
||||||
|
aria2 --header="X-A: 300" --header="X-B: 900" http://host/file
|
||||||
|
Unlike other commad-line option, you can use --header option multiple times.
|
||||||
|
* src/HelpItemFactory.cc
|
||||||
|
* src/HttpRequest.{cc, h}
|
||||||
|
* src/HttpRequestCommand.cc
|
||||||
|
* src/OptionHandlerFactory.cc
|
||||||
|
* src/OptionHandlerImpl.h
|
||||||
|
* src/option_processing.cc
|
||||||
|
* src/prefs.h
|
||||||
|
* src/usage_text.h
|
||||||
|
* test/HttpRequestTest.cc (testUserHeaders)
|
||||||
|
|
||||||
2008-04-20 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
2008-04-20 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||||
|
|
||||||
Eliminates the time lag between sequential downloads and commands in
|
Eliminates the time lag between sequential downloads and commands in
|
||||||
|
|
|
@ -432,6 +432,11 @@ TagContainerHandle HelpItemFactory::createHelpItems()
|
||||||
item->addTag(TAG_ADVANCED);
|
item->addTag(TAG_ADVANCED);
|
||||||
tc->addItem(item);
|
tc->addItem(item);
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
HelpItemHandle item(new HelpItem(PREF_HEADER, TEXT_HEADER));
|
||||||
|
item->addTag(TAG_ADVANCED);
|
||||||
|
tc->addItem(item);
|
||||||
|
}
|
||||||
{
|
{
|
||||||
HelpItemHandle item(new HelpItem("help", TEXT_HELP, TAG_BASIC));
|
HelpItemHandle item(new HelpItem("help", TEXT_HELP, TAG_BASIC));
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "prefs.h"
|
#include "prefs.h"
|
||||||
#include "AuthConfigFactory.h"
|
#include "AuthConfigFactory.h"
|
||||||
#include "AuthConfig.h"
|
#include "AuthConfig.h"
|
||||||
|
#include <numeric>
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -190,6 +191,12 @@ std::string HttpRequest::createRequest() const
|
||||||
if(cookiesValue.size()) {
|
if(cookiesValue.size()) {
|
||||||
requestLine += std::string("Cookie: ")+cookiesValue+"\r\n";
|
requestLine += std::string("Cookie: ")+cookiesValue+"\r\n";
|
||||||
}
|
}
|
||||||
|
// append additional headers given by user.
|
||||||
|
for(std::deque<std::string>::const_iterator i = _userHeaders.begin();
|
||||||
|
i != _userHeaders.end(); ++i) {
|
||||||
|
requestLine += (*i)+"\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
requestLine += "\r\n";
|
requestLine += "\r\n";
|
||||||
return requestLine;
|
return requestLine;
|
||||||
}
|
}
|
||||||
|
@ -218,6 +225,13 @@ std::string HttpRequest::getProxyAuthString() const {
|
||||||
Base64::encode(AuthConfigFactorySingleton::instance()->createAuthConfigForHttpProxy(request)->getAuthText())+"\r\n";
|
Base64::encode(AuthConfigFactorySingleton::instance()->createAuthConfigForHttpProxy(request)->getAuthText())+"\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HttpRequest::setUserHeaders(const std::string& userHeadersString)
|
||||||
|
{
|
||||||
|
std::deque<std::string> headers;
|
||||||
|
Util::slice(headers, userHeadersString, '\n', true);
|
||||||
|
_userHeaders = headers;
|
||||||
|
}
|
||||||
|
|
||||||
void HttpRequest::configure(const Option* option)
|
void HttpRequest::configure(const Option* option)
|
||||||
{
|
{
|
||||||
authEnabled = option->get(PREF_HTTP_AUTH_ENABLED) == V_TRUE;
|
authEnabled = option->get(PREF_HTTP_AUTH_ENABLED) == V_TRUE;
|
||||||
|
|
|
@ -66,6 +66,8 @@ private:
|
||||||
|
|
||||||
std::string userAgent;
|
std::string userAgent;
|
||||||
|
|
||||||
|
std::deque<std::string> _userHeaders;
|
||||||
|
|
||||||
std::string getHostText(const std::string& host, uint16_t port) const;
|
std::string getHostText(const std::string& host, uint16_t port) const;
|
||||||
|
|
||||||
std::string getProxyAuthString() const;
|
std::string getProxyAuthString() const;
|
||||||
|
@ -164,6 +166,8 @@ public:
|
||||||
{
|
{
|
||||||
this->userAgent = userAgent;
|
this->userAgent = userAgent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setUserHeaders(const std::string& userHeaders);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SharedHandle<HttpRequest> HttpRequestHandle;
|
typedef SharedHandle<HttpRequest> HttpRequestHandle;
|
||||||
|
|
|
@ -84,6 +84,7 @@ bool HttpRequestCommand::executeInternal() {
|
||||||
httpRequest->setUserAgent(e->option->get(PREF_USER_AGENT));
|
httpRequest->setUserAgent(e->option->get(PREF_USER_AGENT));
|
||||||
httpRequest->setRequest(req);
|
httpRequest->setRequest(req);
|
||||||
httpRequest->setEntityLength(_requestGroup->getTotalLength());
|
httpRequest->setEntityLength(_requestGroup->getTotalLength());
|
||||||
|
httpRequest->setUserHeaders(e->option->get(PREF_HEADER));
|
||||||
httpRequest->configure(e->option);
|
httpRequest->configure(e->option);
|
||||||
|
|
||||||
_httpConnection->sendRequest(httpRequest);
|
_httpConnection->sendRequest(httpRequest);
|
||||||
|
|
|
@ -126,7 +126,7 @@ OptionHandlers OptionHandlerFactory::createOptionHandlers()
|
||||||
handlers.push_back(SH(new NumberOptionHandler(PREF_STOP, 0, INT32_MAX)));
|
handlers.push_back(SH(new NumberOptionHandler(PREF_STOP, 0, INT32_MAX)));
|
||||||
handlers.push_back(SH(new ParameterOptionHandler(PREF_BT_MIN_CRYPTO_LEVEL, V_PLAIN, V_ARC4)));
|
handlers.push_back(SH(new ParameterOptionHandler(PREF_BT_MIN_CRYPTO_LEVEL, V_PLAIN, V_ARC4)));
|
||||||
handlers.push_back(SH(new BooleanOptionHandler(PREF_BT_REQUIRE_CRYPTO)));
|
handlers.push_back(SH(new BooleanOptionHandler(PREF_BT_REQUIRE_CRYPTO)));
|
||||||
|
handlers.push_back(SH(new CumulativeOptionHandler(PREF_HEADER, "\n")));
|
||||||
return handlers;
|
return handlers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -192,6 +192,25 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CumulativeOptionHandler : public NameMatchOptionHandler {
|
||||||
|
private:
|
||||||
|
std::string _delim;
|
||||||
|
public:
|
||||||
|
CumulativeOptionHandler(const std::string& optName,
|
||||||
|
const std::string& delim):
|
||||||
|
NameMatchOptionHandler(optName),
|
||||||
|
_delim(delim) {}
|
||||||
|
|
||||||
|
virtual ~CumulativeOptionHandler() {}
|
||||||
|
|
||||||
|
virtual void parseArg(Option* option, const std::string& optarg)
|
||||||
|
{
|
||||||
|
std::string value = option->get(_optName);
|
||||||
|
value += optarg+_delim;
|
||||||
|
option->put(_optName, value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class ParameterOptionHandler : public NameMatchOptionHandler {
|
class ParameterOptionHandler : public NameMatchOptionHandler {
|
||||||
private:
|
private:
|
||||||
std::deque<std::string> _validParamValues;
|
std::deque<std::string> _validParamValues;
|
||||||
|
|
|
@ -204,6 +204,7 @@ Option* option_processing(int argc, char* const argv[])
|
||||||
{ PREF_NO_CONF, no_argument, &lopt, 212 },
|
{ PREF_NO_CONF, no_argument, &lopt, 212 },
|
||||||
{ PREF_CONF_PATH, required_argument, &lopt, 213 },
|
{ PREF_CONF_PATH, required_argument, &lopt, 213 },
|
||||||
{ PREF_STOP, required_argument, &lopt, 214 },
|
{ PREF_STOP, required_argument, &lopt, 214 },
|
||||||
|
{ PREF_HEADER, required_argument, &lopt, 215 },
|
||||||
#if defined ENABLE_BITTORRENT || ENABLE_METALINK
|
#if defined ENABLE_BITTORRENT || ENABLE_METALINK
|
||||||
{ PREF_SHOW_FILES, no_argument, NULL, 'S' },
|
{ PREF_SHOW_FILES, no_argument, NULL, 'S' },
|
||||||
{ PREF_SELECT_FILE, required_argument, &lopt, 21 },
|
{ PREF_SELECT_FILE, required_argument, &lopt, 21 },
|
||||||
|
@ -402,6 +403,9 @@ Option* option_processing(int argc, char* const argv[])
|
||||||
case 214:
|
case 214:
|
||||||
cmdstream << PREF_STOP << "=" << optarg << "\n";
|
cmdstream << PREF_STOP << "=" << optarg << "\n";
|
||||||
break;
|
break;
|
||||||
|
case 215:
|
||||||
|
cmdstream << PREF_HEADER << "=" << optarg << "\n";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,6 +163,8 @@
|
||||||
#define PREF_ENABLE_HTTP_PIPELINING "enable-http-pipelining"
|
#define PREF_ENABLE_HTTP_PIPELINING "enable-http-pipelining"
|
||||||
// value: 1*digit
|
// value: 1*digit
|
||||||
#define PREF_MAX_HTTP_PIPELINING "max-http-pipelining"
|
#define PREF_MAX_HTTP_PIPELINING "max-http-pipelining"
|
||||||
|
// value: string
|
||||||
|
#define PREF_HEADER "header"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* HTTP proxy related preferences
|
* HTTP proxy related preferences
|
||||||
|
|
|
@ -330,3 +330,9 @@ _(" --conf-path=PATH Change the configuration file path to PATH.")
|
||||||
#define TEXT_STOP \
|
#define TEXT_STOP \
|
||||||
_(" --stop=SEC Stop application after SEC seconds has passed.\n" \
|
_(" --stop=SEC Stop application after SEC seconds has passed.\n" \
|
||||||
" If 0 is given, this feature is disabled.")
|
" If 0 is given, this feature is disabled.")
|
||||||
|
#define TEXT_HEADER \
|
||||||
|
_(" --header=HEADER Append HEADER to HTTP request header. You can use\n"\
|
||||||
|
" this option repeatedly to specify more than one\n"\
|
||||||
|
" header:\n"\
|
||||||
|
" aria2c --header=\"X-A: b78\" --header=\"X-B: 9J1\"\n"\
|
||||||
|
" http://host/file")
|
||||||
|
|
|
@ -22,6 +22,7 @@ class HttpRequestTest : public CppUnit::TestFixture {
|
||||||
CPPUNIT_TEST(testCreateProxyRequest);
|
CPPUNIT_TEST(testCreateProxyRequest);
|
||||||
CPPUNIT_TEST(testIsRangeSatisfied);
|
CPPUNIT_TEST(testIsRangeSatisfied);
|
||||||
CPPUNIT_TEST(testUserAgent);
|
CPPUNIT_TEST(testUserAgent);
|
||||||
|
CPPUNIT_TEST(testUserHeaders);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -36,6 +37,7 @@ public:
|
||||||
void testCreateProxyRequest();
|
void testCreateProxyRequest();
|
||||||
void testIsRangeSatisfied();
|
void testIsRangeSatisfied();
|
||||||
void testUserAgent();
|
void testUserAgent();
|
||||||
|
void testUserHeaders();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -557,4 +559,28 @@ void HttpRequestTest::testUserAgent()
|
||||||
CPPUNIT_ASSERT_EQUAL(expectedTextForProxy, httpRequest.createProxyRequest());
|
CPPUNIT_ASSERT_EQUAL(expectedTextForProxy, httpRequest.createProxyRequest());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HttpRequestTest::testUserHeaders()
|
||||||
|
{
|
||||||
|
SharedHandle<Request> request(new Request());
|
||||||
|
request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
|
||||||
|
|
||||||
|
HttpRequest httpRequest;
|
||||||
|
httpRequest.setRequest(request);
|
||||||
|
httpRequest.setUserHeaders("X-ARIA2: v0.13\nX-ARIA2-DISTRIBUTE: enabled\n");
|
||||||
|
|
||||||
|
std::string expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
|
||||||
|
"User-Agent: aria2\r\n"
|
||||||
|
"Accept: */*\r\n"
|
||||||
|
"Host: localhost\r\n"
|
||||||
|
"Pragma: no-cache\r\n"
|
||||||
|
"Cache-Control: no-cache\r\n"
|
||||||
|
"Connection: close\r\n"
|
||||||
|
"X-ARIA2: v0.13\r\n"
|
||||||
|
"X-ARIA2-DISTRIBUTE: enabled\r\n"
|
||||||
|
"\r\n";
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace aria2
|
} // namespace aria2
|
||||||
|
|
Loading…
Reference in New Issue