URL
{ "URL", URL, ARGS, 1, "?" },
{ "URL", URL, ARGS, 1, "?" },
LOCATE URL
| SITE SP URL CRLF check_secure
fetch_ssl(conn_t *conn, const struct url *URL, int verbose)
if (!SSL_set_tlsext_host_name(conn->ssl, __DECONST(char *, URL->host))) {
URL->host);
if (!fetch_ssl_verify_hname(conn->ssl_cert, URL->host)) {
URL->host);
(void)URL;
fetchGet(struct url *URL, const char *flags)
return (fetchXGet(URL, NULL, flags));
fetchPut(struct url *URL, const char *flags)
if (strcmp(URL->scheme, SCHEME_FILE) == 0)
return (fetchPutFile(URL, flags));
else if (strcmp(URL->scheme, SCHEME_FTP) == 0)
return (fetchPutFTP(URL, flags));
else if (strcmp(URL->scheme, SCHEME_HTTP) == 0)
return (fetchPutHTTP(URL, flags));
else if (strcmp(URL->scheme, SCHEME_HTTPS) == 0)
return (fetchPutHTTP(URL, flags));
fetchStat(struct url *URL, struct url_stat *us, const char *flags)
if (strcmp(URL->scheme, SCHEME_FILE) == 0)
return (fetchStatFile(URL, us, flags));
else if (strcmp(URL->scheme, SCHEME_FTP) == 0)
return (fetchStatFTP(URL, us, flags));
else if (strcmp(URL->scheme, SCHEME_HTTP) == 0)
return (fetchStatHTTP(URL, us, flags));
else if (strcmp(URL->scheme, SCHEME_HTTPS) == 0)
return (fetchStatHTTP(URL, us, flags));
fetchList(struct url *URL, const char *flags)
if (strcmp(URL->scheme, SCHEME_FILE) == 0)
return (fetchListFile(URL, flags));
else if (strcmp(URL->scheme, SCHEME_FTP) == 0)
return (fetchListFTP(URL, flags));
else if (strcmp(URL->scheme, SCHEME_HTTP) == 0)
return (fetchListHTTP(URL, flags));
else if (strcmp(URL->scheme, SCHEME_HTTPS) == 0)
return (fetchListHTTP(URL, flags));
fetchXGetURL(const char *URL, struct url_stat *us, const char *flags)
if ((u = fetchParseURL(URL)) == NULL)
fetchGetURL(const char *URL, const char *flags)
return (fetchXGetURL(URL, NULL, flags));
fetchPutURL(const char *URL, const char *flags)
if ((u = fetchParseURL(URL)) == NULL)
fetchStatURL(const char *URL, struct url_stat *us, const char *flags)
if ((u = fetchParseURL(URL)) == NULL)
fetchListURL(const char *URL, const char *flags)
if ((u = fetchParseURL(URL)) == NULL)
fetchParseURL(const char *URL)
if ((p = strstr(URL, ":/"))) {
if (p - URL > URL_SCHEMELEN)
for (i = 0; URL + i < p; i++)
u->scheme[i] = tolower((unsigned char)URL[i]);
URL = ++p;
if (URL[1] == '/')
URL = (p += 2);
p = URL;
if (!*URL || *URL == '/' || *URL == '.' ||
strchr(URL, '/') == NULL && strchr(URL, ':') == NULL))
p = strpbrk(URL, "/@");
q = fetch_pctdecode(u->user, URL, URL_USERLEN);
p = URL;
fetchXGet(struct url *URL, struct url_stat *us, const char *flags)
if (strcmp(URL->scheme, SCHEME_FILE) == 0)
return (fetchXGetFile(URL, us, flags));
else if (strcmp(URL->scheme, SCHEME_FTP) == 0)
return (fetchXGetFTP(URL, us, flags));
else if (strcmp(URL->scheme, SCHEME_HTTP) == 0)
return (fetchXGetHTTP(URL, us, flags));
else if (strcmp(URL->scheme, SCHEME_HTTPS) == 0)
return (fetchXGetHTTP(URL, us, flags));
http_connect(struct url *URL, struct url *purl, const char *flags)
curl = (purl != NULL) ? purl : URL;
if (strcmp(URL->scheme, SCHEME_HTTPS) == 0 && purl) {
http_cmd(conn, "CONNECT %s:%d HTTP/1.1", URL->host, URL->port);
http_cmd(conn, "Host: %s:%d", URL->host, URL->port);
if (strcmp(URL->scheme, SCHEME_HTTPS) == 0 &&
fetch_ssl(conn, URL, verbose) == -1) {
http_request(struct url *URL, const char *op, struct url_stat *us,
return (http_request_body(URL, op, us, purl, flags, NULL, NULL));
http_request_body(struct url *URL, const char *op, struct url_stat *us,
url = URL;
if (url != URL)
if (URL->offset > 0 && offset > URL->offset) {
URL->offset = offset;
URL->length = clength;
if (url != URL)
if (url != URL)
fetchXGetHTTP(struct url *URL, struct url_stat *us, const char *flags)
return (http_request(URL, "GET", us, http_get_proxy(URL, flags), flags));
fetchGetHTTP(struct url *URL, const char *flags)
return (fetchXGetHTTP(URL, NULL, flags));
fetchPutHTTP(struct url *URL __unused, const char *flags __unused)
fetchStatHTTP(struct url *URL, struct url_stat *us, const char *flags)
f = http_request(URL, "HEAD", us, http_get_proxy(URL, flags), flags);
fetchReqHTTP(struct url *URL, const char *method, const char *flags,
return (http_request_body(URL, method, NULL, http_get_proxy(URL, flags),
query_auth(struct url *URL)
URL->scheme, URL->host, URL->port);
if (fgets(URL->user, sizeof URL->user, stdin) == NULL)
for (i = strlen(URL->user); i >= 0; --i)
if (URL->user[i] == '\r' || URL->user[i] == '\n')
URL->user[i] = '\0';
nopwd = (fgets(URL->pwd, sizeof URL->pwd, stdin) == NULL);
nopwd = (fgets(URL->pwd, sizeof URL->pwd, stdin) == NULL);
for (i = strlen(URL->pwd); i >= 0; --i)
if (URL->pwd[i] == '\r' || URL->pwd[i] == '\n')
URL->pwd[i] = '\0';
fetch(char *URL, const char *path, int *is_http)
if (*URL == '\0') {
if ((url = fetchParseURL(URL)) == NULL) {
warnx("%s: parse error", URL);
warnx("%s: %s", URL, fetchLastErrString);
warnx("%s: %s", URL, fetchLastErrString);
warnx("%s: size unknown", URL);
URL, (intmax_t)S_size, (intmax_t)us.size);
warnx("%s: size of remote file is not known", URL);
warnx("%s: gap in resume mode", URL);
warnx("%s: file has changed", URL);
warnx("%s: %s", URL, fetchLastErrString);
warn("%s", URL);