这个补丁的作用,修改重定向时对引用及cookie的处理,使其能正确下载国内多数下载网站的防盗链链接。
补丁修改的机制说明:
在30x重定向时,RFC的HTTP标准规定不能发送Cookie, 不能使用引用。但国内多数下载站点这两者都同时使用,而且设置Cookie的域名比较复杂,这些都被作为防盗链的手段广泛使用,使其只能在浏览器中下载,遵守标准的普通下载工具却无法正常下载这些链接。
针对这种情况,在aria2中修正机制,在记录cookie的时候对域名进行处理,只保留有二级域名, 在查找cookie的时候也只是使用二级域名进行查询。
在做redirect的时候,仍旧按照服务器的响应记录cookie, 并在redirect请求中使用这些cookie。
在做redirect的时候,使用本次地址作为引用发送给服务器。
用户在--header参数中传递的Cookie会与本次服务器设置的Cookie合并,一起用于下一次转向链接的请求。
测试网站列表:
非凡软件下载
sina下载 down.tech.sina.com.cn
www.greendown.cn
...
如果您测试了其他站点,请email我。
补丁如下:
aria2-1.9.2_redirect_no_cookie_no_refer.patch
diff --git a/src/HttpRequest.cc b/src/HttpRequest.cc
index c6c0afb..dfc981f 100644
--- a/src/HttpRequest.cc
+++ b/src/HttpRequest.cc
@@ -218,9 +218,10 @@ std::string HttpRequest::createRequest()
builtinHds.push_back(std::make_pair("Referer:", getPreviousURI()));
}
if(!_cookieStorage.isNull()) {
+ std::string baseDomain = util::getBaseDomainName(getHost());
std::string cookiesValue;
std::vector<Cookie> cookies =
- _cookieStorage->criteriaFind(getHost(),
+ _cookieStorage->criteriaFind(baseDomain, // getHost(),
getDir(),
Time().getTime(),
getProtocol() == Request::PROTO_HTTPS ?
@@ -235,15 +236,25 @@ std::string HttpRequest::createRequest()
}
for(std::vector<std::pair<std::string, std::string> >::const_iterator i =
builtinHds.begin(), eoi = builtinHds.end(); i != eoi; ++i) {
- std::vector<std::string>::const_iterator j = _headers.begin();
- std::vector<std::string>::const_iterator jend = _headers.end();
+ // std::vector<std::string>::const_iterator j = _headers.begin();
+ // std::vector<std::string>::const_iterator jend = _headers.end();
+ std::vector<std::string>::iterator j = _headers.begin();
+ std::vector<std::string>::iterator jend = _headers.end();
for(; j != jend; ++j) {
if(util::startsWith(*j, (*i).first)) {
break;
}
}
+ // hacked by liuguangzhao@users.sf.net
+ // if user header is not cookie, override it, or leave it there no touched.
+ // for this case, the best methord is combine to cookies part to one Cookie: header line
if(j == jend) {
strappend(requestLine, (*i).first, " ", (*i).second, A2STR::CRLF);
+ } else {
+ // combine the new cookie to header line
+ if (util::startsWith((*i).first, "Cookie") && !util::endsWith(*j, (*i).second)) {
+ (*j) += ";" + (*i).second;
+ }
}
}
// append additional headers given by user.
diff --git a/src/HttpResponse.cc b/src/HttpResponse.cc
index 6957fe9..79de4bd 100644
--- a/src/HttpResponse.cc
+++ b/src/HttpResponse.cc
@@ -116,11 +116,13 @@ std::string HttpResponse::determinFilename() const
void HttpResponse::retrieveCookie()
{
+ // hacked by liuguangzhao@users.sf.net
+ std::string baseDomain = util::getBaseDomainName(httpRequest->getHost());
std::vector<std::string> v = httpHeader->get(HttpHeader::SET_COOKIE);
for(std::vector<std::string>::const_iterator itr = v.begin(), eoi = v.end();
itr != eoi; ++itr) {
httpRequest->getCookieStorage()->parseAndStore(*itr,
- httpRequest->getHost(),
+ baseDomain, // httpRequest->getHost(),
httpRequest->getDir());
}
}
diff --git a/src/Request.cc b/src/Request.cc
index 9fbba5a..4204c0a 100644
--- a/src/Request.cc
+++ b/src/Request.cc
@@ -125,7 +125,8 @@ void Request::setReferer(const std::string& uri)
}
bool Request::redirectUri(const std::string& uri) {
- _previousUri = A2STR::NIL;
+ // _previousUri = A2STR::NIL;
+ _previousUri = _uri; // hacked by liuguangzhao@users.sf.net
_supportsPersistentConnection = true;
++_redirectCount;
std::string redirectedUri;
diff --git a/src/util.cc b/src/util.cc
index 58a37d4..bb10bdc 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -1305,6 +1305,48 @@ void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group)
}
}
+// hacked by liuguangzhao@users.sf.net
+/*
+ only leave the last 2 or three domain parts
+ */
+ std::string getBaseDomainName(const std::string &s)
+ {
+ std::string baseDomain;
+ std::string ts = s;
+ if (util::isNumericHost(s)) {
+ return s;
+ }
+ size_t colonPos = ts.find(':');
+ if (colonPos != std::string::npos) {
+ ts.resize(colonPos);
+ }
+
+ std::vector<std::string> domParts;
+ std::string delims(".");
+ util::split(ts, std::back_inserter(domParts), delims);
+
+ int minDomParts = 2;
+ int domLevel = domParts.size();
+ if (domParts.at(domLevel - 1) == "cn"
+ || domParts.at(domLevel - 1) == "cc"
+ || domParts.at(domLevel - 1) == "us") {
+ if (domParts.at(domLevel - 2) == "org"
+ || domParts.at(domLevel - 2) == "com"
+ || domParts.at(domLevel - 2) == "net"
+ || domParts.at(domLevel - 2) == "info") {
+ minDomParts = 3;
+ }
+ }
+
+ baseDomain = domParts.at(domLevel - 2) + "." + domParts.at(domLevel - 1);
+ if (minDomParts == 3) {
+ baseDomain = domParts.at(domLevel - 3) + "." + baseDomain;
+ }
+
+ return baseDomain;
+ }
+
+
} // namespace util
} // namespace aria2
diff --git a/src/util.h b/src/util.h
index 9e1c2a5..01b6a1c 100644
--- a/src/util.h
+++ b/src/util.h
@@ -395,6 +395,9 @@ bool inSameCidrBlock(const std::string& ip1, const std::string& ip2, int bits);
void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group);
+ // hacked by liuguangzhao@users.sf.net
+ std::string getBaseDomainName(const std::string &s);
+
} // namespace util
} // namespace aria2
分享到:
相关推荐
这个"Aria2+ffmpeg+m3u8下载工具(windows版)"是一个专为Windows用户设计的高效解决方案,整合了Aria2、ffmpeg以及jQuery等技术,方便用户批量下载并转换m3u8格式的视频。 首先,Aria2是一个轻量级的多协议、多源...
**aria2下载神器** aria2是一款强大的开源下载工具,它以其多线程、分段下载的能力而备受赞誉,尤其在处理大文件时,能够显著提高下载速度。在本文中,我们将深入探讨aria2的主要功能、使用方法以及如何通过web控制...
**Aria2下载工具详解** Aria2是一款轻量级、多协议、多源的下载管理器,以其高效、稳定和强大的特性深受广大用户喜爱。它支持HTTP、HTTPS、FTP、BitTorrent等多种协议,可以同时从多个源进行下载,极大地提高了下载...
可以方便的把百度网盘的下载地址导出到 aria2/aria2-rpc,支持 YAAW
**aria2下载工具详解** aria2是一款开源、免费且功能强大的多协议、多源下载工具。它支持HTTP、HTTPS、FTP、BitTorrent等协议,并具备断点续传、多线程下载、分块下载等功能,使得大文件下载更加高效、稳定。在日常...
FlyVR.Aria2.Aria2cRuntime.Load(new FlyVR.Aria2.Aria2cSettings() { Aria2Args = "", Aria2Host = "localhost", Aria2Path = "aria2c.exe(aria2c的路径)", Aria2Port = 6800 }); FlyVR.Aria2.Aria2c faa = new ...
aria2写的一个简易下载例子"主要展示了如何结合Qt的QProcess类和aria2下载工具,创建一个简单的下载管理器。通过理解和应用上述知识点,开发者不仅可以实现文件的高效下载,还能为用户提供友好的交互体验。对于需要...
Aria2 是一个轻量级、多协议、高效的命令行下载工具,支持多种协议和多线程下载,常用于加速文件下载以及处理大文件下载任务。它的主要功能和特点如下: 1. 多协议支持 Aria2 支持多种下载协议,包括: ...
这个方法特别适用于处理大文件,因为aria2支持多线程和断点续传,可以显著提高下载速度。下面将详细介绍如何配置和使用这一组合。 首先,我们需要安装aria2。在Ubuntu终端中输入以下命令: ```bash sudo apt ...
标题中的"Aria2下载器.zip(多线程优化版)win10可用"指的是一个针对Windows 10操作系统优化过的Aria2下载工具的压缩包。Aria2是一款开源、轻量级且功能强大的下载管理器,支持多种协议,如HTTP(S)、FTP、SFTP、...
1. **安装aria2c**: 首先,你需要下载aria2c的Windows版本,如压缩包文件"aria2-1.18.8-win-32bit-build1",解压后将可执行文件`aria2c.exe`放在系统的PATH环境变量所包含的目录下,这样就可以在任何地方通过命令行...
Aria2-不限速全平台下载利器, 3.1 Aria2 for macOS 3.1.1 懒人版 — Aria2GUI(客户端,推荐) 下载安装Aria2GUI.dmg,位于网盘的Aria2 for Mac文件夹中,或者 github 地址:aria2gui mac 1.3.5客户端。 Aria2是...
Photon——可直接下载磁力链接、基于aria2 的免费多线程下载工具Photon 是一款基于 aria2 的、免费的多线程下载软件,拥有易用、友好的图形界面,支持 磁力链,HTTP/HTTPS,BT 和 Metalink。 aria2 以其好用又难用而...
标题中的“一个Windows下载器,使用C++,基于Aria2c开发”表明这是一个使用C++编程语言在Windows操作系统上构建的下载管理器程序。它利用了Aria2c库来实现高效的多线程、多源下载功能。Aria2c是一款轻量级的命令行...
aria2 是一个轻量级、多协议且支持多源的下载工具,它可以同时从多个来源和协议下载文件,从而显著提高下载速度。而 aria2GUI 将这个强大的命令行工具包装成了用户友好的图形界面,使得非技术用户也能轻松操作。 在...
2. **分块下载与断点续传**:`aria2`可以将大文件分割成多个部分同时下载,并且在下载过程中支持断点续传,即使下载中断,也能从上次中断的地方继续。 3. **限速与优先级设置**:用户可以根据网络状况设定下载速度...
2. **配置aria2c**:在aria2c的配置文件(通常为`aria2.conf`)中,可以设置全局参数,比如下载目录、最大速度限制等。同时,可以启用JSON-RPC接口,这将允许我们通过其他程序(如浏览器扩展)来控制aria2c。 3. **...
它提供了一个直观的用户界面,用户可以通过浏览器来管理和监控Aria2的下载任务,包括添加新的下载链接、查看下载进度、暂停或恢复任务、设置下载选项等。这对于需要批量处理下载任务或者希望远程控制下载的用户来说...
1. **多源下载**:Aria2支持同时从多个源进行下载,这可以显著提高下载速度,尤其是在网络环境不稳定或资源有限的情况下。它可以从HTTP(S)、FTP、BitTorrent等协议下载文件。 2. **多线程下载**:Aria2允许在一个...
综上所述,这个压缩包提供了一套完整的aria2下载工具,让用户可以更高效地从百度网盘下载大文件。用户需要阅读README.md了解如何配置和使用aria2,然后使用aria2c.exe或aria2.exe启动下载。aria2.conf的配置可以根据...