blob: 776c8a19de35b21dd558c603fccf895d1ef2902b [file] [log] [blame]
# File src/library/utils/R/windows/download.file.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2020 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
download.file <-
function(url, destfile, method, quiet = FALSE, mode = "w",
cacheOK = TRUE, extra = getOption("download.file.extra"),
headers = NULL, ...)
{
destfile # check supplied
method <- if (missing(method))
getOption("download.file.method", default = "auto")
else
match.arg(method, c("auto", "internal", "wininet", "libcurl",
"wget", "curl", "lynx"))
if(missing(mode) && length(grep("\\.(gz|bz2|xz|tgz|zip|rd[as]|RData)$",
URLdecode(url))))
mode <- "wb"
if(method == "auto") {
if(length(url) != 1L || typeof(url) != "character")
stop("'url' must be a length-one character vector");
method <-
if(startsWith(url, "ftps:") && capabilities("libcurl")) "libcurl"
else "wininet"
}
nh <- names(headers)
if(length(nh) != length(headers) || any(nh == "") || anyNA(headers) || anyNA(nh))
stop("'headers' must have names and must not be NA")
switch(method,
"internal" =, "wininet" = {
headers <- if(length(headers)) paste0(nh, ": ", headers, "\r\n", collapse = "")
status <- .External(C_download, url, destfile, quiet, mode, cacheOK,
headers, method == "wininet")
},
"libcurl" = {
headers <- if(length(headers)) paste0(nh, ": ", headers)
status <- .Internal(curlDownload(url, destfile, quiet, mode, cacheOK,
headers))
},
"wget" = {
if(length(url) != 1L || typeof(url) != "character")
stop("'url' must be a length-one character vector");
if(length(destfile) != 1L || typeof(destfile) != "character")
stop("'destfile' must be a length-one character vector");
if(quiet) extra <- c(extra, "--quiet")
if(!cacheOK) extra <- c(extra, "--cache=off")
status <- system(paste("wget",
paste(extra, collapse = " "),
shQuote(url),
"-O", shQuote(path.expand(destfile))))
if(status) stop("'wget' call had nonzero exit status")
},
"curl" = {
if(length(url) != 1L || typeof(url) != "character")
stop("'url' must be a length-one character vector");
if(length(destfile) != 1L || typeof(url) != "character")
stop("'destfile' must be a length-one character vector");
if(quiet) extra <- c(extra, "-s -S")
if(!cacheOK) extra <- c(extra, paste("-H", shQuote("Pragma: no-cache")))
status <- system(paste("curl",
paste(extra, collapse = " "),
shQuote(url),
" -o", shQuote(path.expand(destfile))))
if(status) stop("'curl' call had nonzero exit status")
},
"lynx" =
stop("method 'lynx' is defunct", domain = NA))
if(status > 0L)
warning("download had nonzero exit status")
invisible(status)
}