aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-09-17 23:05:39 +0900
committerDaniel Stenberg <daniel@haxx.se>2012-10-01 22:03:07 +0200
commit42bbc5ce108e273a9890d2007ff55dd73c8d646c (patch)
tree66001d57862efa77c6f407fdcbb8938bca2b7d3a
parentc01b6f4d098347ddfa3ece4ac33d6cc0607b79dd (diff)
tool_metalink.c: Filtered resource URLs by type
In Metalink v3, the type attribute of url element indicates the type of the resource the URL points to. It can include URL to the meta data, such as BitTorrent metainfo file. In Curl, we are not interested in these meta data URLs. Instead, we are only interested in the HTTP and FTP URLs. This change filters out non-HTTP and FTP URLs. If we don't filter out them, it will be downloaded by curl and hash check will fail if hash is provided and next URL will be tried. This change will cut this useless network transfer.
-rw-r--r--src/tool_metalink.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/tool_metalink.c b/src/tool_metalink.c
index 316392781..103c88649 100644
--- a/src/tool_metalink.c
+++ b/src/tool_metalink.c
@@ -573,9 +573,24 @@ static metalinkfile *new_metalinkfile(metalink_file_t *fileinfo)
tail = &root;
for(p = fileinfo->resources; *p; ++p) {
metalink_resource *res;
- res = new_metalink_resource((*p)->url);
- tail->next = res;
- tail = res;
+ /* Filter by type if it is non-NULL. In Metalink v3, type
+ includes the type of the resource. In curl, we are only
+ interested in HTTP, HTTPS and FTP. In addition to them,
+ Metalink v3 file may contain bittorrent type URL, which
+ points to the BitTorrent metainfo file. We ignore it here.
+ In Metalink v4, type was deprecated and all
+ fileinfo->resources point to the target file. BitTorrent
+ metainfo file URL may be appeared in fileinfo->metaurls.
+ */
+ if((*p)->type == NULL ||
+ Curl_raw_equal((*p)->type, "http") ||
+ Curl_raw_equal((*p)->type, "https") ||
+ Curl_raw_equal((*p)->type, "ftp") ||
+ Curl_raw_equal((*p)->type, "ftps")) {
+ res = new_metalink_resource((*p)->url);
+ tail->next = res;
+ tail = res;
+ }
}
f->resource = root.next;
}