url
OCSP_crlID_new(const char *url, long *n, char *tim)
if (url) {
if (!(ASN1_STRING_set(cid->crlUrl, url, -1)))
OCSP_parse_url(const char *url, char **phost, char **pport, char **ppath,
if (strncmp(url, "https://", 8) == 0) {
host = strdup(url + 8);
} else if (strncmp(url, "http://", 7) == 0)
host = strdup(url + 7);
#define BIO_set_url(b,url) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,0,(char *)(url))
#define BIO_get_url(b,url) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url))
int OCSP_parse_url(const char *url, char **phost, char **pport,
X509_EXTENSION *OCSP_crlID_new(const char *url, long *n, char *tim);
fetch_ssl(conn_t *conn, const struct url *URL, int verbose)
__DECONST(struct url *, URL)->host)) {
fetch_netrc_auth(struct url *url)
if (url->netrcfd < 0)
url->netrcfd = fetch_netrc_open();
if (url->netrcfd < 0)
if ((f = fdopen(url->netrcfd, "r")) == NULL) {
close(url->netrcfd);
url->netrcfd = -1;
DEBUGF("searching netrc for %s\n", url->host);
strcasecmp(word, url->host) == 0) {
if (snprintf(url->user, sizeof(url->user),
"%s", word) > (int)sizeof(url->user)) {
url->user[0] = '\0';
if (snprintf(url->pwd, sizeof(url->pwd),
"%s", word) > (int)sizeof(url->pwd)) {
url->pwd[0] = '\0';
url->netrcfd = -1;
url->netrcfd = -1;
int fetch_ssl(conn_t *, const struct url *, int);
int fetch_netrc_auth(struct url *url);
FILE *http_request(struct url *, const char *,
struct url_stat *, struct url *, const char *);
FILE *http_request_body(struct url *, const char *,
struct url_stat *, struct url *, const char *,
FILE *ftp_request(struct url *, const char *,
struct url_stat *, struct url *, const char *);
fetchGet(struct url *URL, const char *flags)
fetchPut(struct url *URL, const char *flags)
fetchStat(struct url *URL, struct url_stat *us, const char *flags)
fetchList(struct url *URL, const char *flags)
struct url *u;
struct url *u;
struct url *u;
struct url *u;
struct url *
struct url *u;
struct url *
struct url *u;
fetchFreeURL(struct url *u)
fetchXGet(struct url *URL, struct url_stat *us, const char *flags)
struct url_ent *fetchListFile(struct url *, const char *);
FILE *fetchXGetHTTP(struct url *, struct url_stat *, const char *);
FILE *fetchGetHTTP(struct url *, const char *);
FILE *fetchPutHTTP(struct url *, const char *);
int fetchStatHTTP(struct url *, struct url_stat *, const char *);
struct url_ent *fetchListHTTP(struct url *, const char *);
FILE *fetchReqHTTP(struct url *, const char *, const char *,
FILE *fetchXGetFTP(struct url *, struct url_stat *, const char *);
FILE *fetchGetFTP(struct url *, const char *);
FILE *fetchPutFTP(struct url *, const char *);
int fetchStatFTP(struct url *, struct url_stat *, const char *);
struct url_ent *fetchListFTP(struct url *, const char *);
FILE *fetchXGet(struct url *, struct url_stat *, const char *);
FILE *fetchGet(struct url *, const char *);
FILE *fetchPut(struct url *, const char *);
int fetchStat(struct url *, struct url_stat *, const char *);
struct url_ent *fetchList(struct url *, const char *);
struct url *fetchMakeURL(const char *, const char *, int,
struct url *fetchParseURL(const char *);
void fetchFreeURL(struct url *);
typedef int (*auth_t)(struct url *);
FILE *fetchXGetFile(struct url *, struct url_stat *, const char *);
FILE *fetchGetFile(struct url *, const char *);
FILE *fetchPutFile(struct url *, const char *);
int fetchStatFile(struct url *, struct url_stat *, const char *);
fetchStatFile(struct url *u, struct url_stat *us, const char *flags __unused)
fetchListFile(struct url *u, const char *flags __unused)
fetchXGetFile(struct url *u, struct url_stat *us, const char *flags)
fetchGetFile(struct url *u, const char *flags)
fetchPutFile(struct url *u, const char *flags)
ftp_isconnected(struct url *url)
&& (strcmp(url->host, cached_host.host) == 0)
&& (strcmp(url->user, cached_host.user) == 0)
&& (strcmp(url->pwd, cached_host.pwd) == 0)
&& (url->port == cached_host.port));
ftp_cached_connect(struct url *url, struct url *purl, const char *flags)
static struct url cached_host;
if (!url->port)
url->port = fetch_default_port(url->scheme);
if (ftp_isconnected(url)) {
if ((conn = ftp_connect(url, purl, flags)) == NULL)
memcpy(&cached_host, url, sizeof(*url));
static struct url *
ftp_get_proxy(struct url * url, const char *flags)
struct url *purl;
if (fetch_no_proxy_match(url->host))
ftp_request(struct url *url, const char *op, struct url_stat *us,
struct url *purl, const char *flags)
return (http_request(url, "HEAD", us, purl, flags));
return (http_request(url, "GET", us, purl, flags));
conn = ftp_cached_connect(url, purl, flags);
if (ftp_cwd(conn, url->doc) == -1)
if (us && ftp_stat(conn, url->doc, us) == -1
return (ftp_transfer(conn, op, url->doc, oflag, url->offset, flags));
fetchXGetFTP(struct url *url, struct url_stat *us, const char *flags)
return (ftp_request(url, "RETR", us, ftp_get_proxy(url, flags), flags));
fetchGetFTP(struct url *url, const char *flags)
return (fetchXGetFTP(url, NULL, flags));
fetchPutFTP(struct url *url, const char *flags)
return (ftp_request(url, CHECK_FLAG('a') ? "APPE" : "STOR", NULL,
ftp_get_proxy(url, flags), flags));
fetchStatFTP(struct url *url, struct url_stat *us, const char *flags)
f = ftp_request(url, "STAT", us, ftp_get_proxy(url, flags), flags);
fetchListFTP(struct url *url __unused, const char *flags __unused)
ftp_authenticate(conn_t *conn, struct url *url, struct url *purl)
if (url->user[0] == '\0')
fetch_netrc_auth(url);
user = url->user;
if (purl && url->port == fetch_default_port(url->scheme))
e = ftp_cmd(conn, "USER %s@%s", user, url->host);
e = ftp_cmd(conn, "USER %s@%s@%d", user, url->host, url->port);
pwd = url->pwd;
ftp_connect(struct url *url, struct url *purl, const char *flags)
conn = fetch_connect(url->host, url->port, af, verbose);
if ((e = ftp_authenticate(conn, url, purl)) != FTP_LOGGED_IN)
http_auth_params_t *parms, struct url *url)
"GET", url->doc, "", digest);
c->nonce, url->doc, digest,
c->nonce, url->doc, digest, options);
http_auth_params_t *parms, struct url *url)
return (http_digest_auth(conn, hdr, digest, parms, url));
http_connect(struct url *URL, struct url *purl, const char *flags)
struct url *curl;
static struct url *
http_get_proxy(struct url * url, const char *flags)
struct url *purl;
if (fetch_no_proxy_match(url->host))
http_request(struct url *URL, const char *op, struct url_stat *us,
struct url *purl, const char *flags)
http_request_body(struct url *URL, const char *op, struct url_stat *us,
struct url *purl, const char *flags, const char *content_type,
struct url *url, *new;
url = URL;
if (!url->port)
url->port = fetch_default_port(url->scheme);
if (purl == NULL && strcmp(url->scheme, SCHEME_FTP) == 0) {
return (ftp_request(url, "RETR", us, purl, flags));
return (ftp_request(url, "STAT", us, purl, flags));
if ((conn = http_connect(url, purl, flags)) == NULL)
host = url->host;
if (url->port != fetch_default_port(url->scheme)) {
snprintf(hbuf, sizeof(hbuf), "%s:%d", host, url->port);
url->scheme, host, url->doc);
if (purl && strcmp(url->scheme, SCHEME_HTTPS) != 0) {
op, url->scheme, host, url->doc);
op, url->doc);
if (ims && url->ims_time) {
timestruct = gmtime((time_t *)&url->ims_time);
&proxy_challenges, &aparams, url);
if (*url->user || *url->pwd) {
aparams.user = strdup(url->user);
aparams.password = strdup(url->pwd);
} else if (fetch_netrc_auth(url) == 0) {
aparams.user = strdup(url->user);
aparams.password = strdup(url->pwd);
fetchAuthMethod(url) == 0) {
aparams.user = strdup(url->user);
aparams.password = strdup(url->pwd);
&server_challenges, &aparams, url);
url->scheme, host, url->doc);
if (url->offset > 0)
http_cmd(conn, "Range: bytes=%lld-", (long long)url->offset);
new = fetchMakeURL(url->scheme, url->host,
url->port, p, url->user, url->pwd);
if (strcmp(new->host, url->host) == 0 &&
strcpy(new->user, url->user);
strcpy(new->pwd, url->pwd);
new->offset = url->offset;
new->length = url->length;
new->ims_time = url->ims_time;
if (url->offset > 0 && url->length == 0) {
offset = url->offset;
if (url != URL)
fetchFreeURL(url);
url = new;
if (url != URL)
fetchFreeURL(url);
if (url != URL)
fetchFreeURL(url);
fetchXGetHTTP(struct url *URL, struct url_stat *us, const char *flags)
fetchGetHTTP(struct url *URL, const char *flags)
fetchPutHTTP(struct url *URL __unused, const char *flags __unused)
fetchStatHTTP(struct url *URL, struct url_stat *us, const char *flags)
fetchListHTTP(struct url *url __unused, const char *flags __unused)
fetchReqHTTP(struct url *URL, const char *method, const char *flags,
ftpGetURL(const char *url, const char *user, const char *passwd, int *retcode)
return ftpGetURLAf(url, AF_UNSPEC, user, passwd, retcode);
return ftpGetURLAf(url, AF_INET, user, passwd, retcode);
ftpGetURLAf(const char *url, int af, const char *user, const char *passwd,
if (get_url_info(url, host, sizeof(host), &port, name,
ftpPutURL(const char *url, const char *user, const char *passwd, int *retcode)
return ftpPutURLAf(url, AF_UNSPEC, user, passwd, retcode);
return ftpPutURLAf(url, AF_INET, user, passwd, retcode);
ftpPutURLAf(const char *url, int af, const char *user, const char *passwd,
if (get_url_info(url, host, sizeof(host), &port,
char *name, *host, *cp, url[BUFSIZ];
strncpy(url, url_in, BUFSIZ);
host = url + 6;
extern FILE *ftpGetURL(const char *url, const char *user,
extern FILE *ftpPutURL(const char *url, const char *user,
extern FILE *ftpGetURLAf(const char *url, int af, const char *user,
extern FILE *ftpPutURLAf(const char *url, int af, const char *user,
cmd_remote_connect(const char *sel_path, const char *url)
if (strlen(url) >= sizeof(remote.copy1.path)) {
url);
cmd_remote_disconnect(const char *sel_path, const char *url)
if (strlen(url) >= sizeof(remote.copy1.path)) {
url);
int cmd_remote_connect(const char *sel_path, const char *url);
int cmd_remote_disconnect(const char *sel_path, const char *url);
add_url(const char *url)
base = url;
if (strncmp(url, "http://", 7) == 0)
static void add_url(const char *url);
query_auth(struct url *URL)
struct url *url;
url = NULL;
if ((url = fetchParseURL(URL)) == NULL) {
if (!*url->scheme) {
if (!*url->host)
strcpy(url->scheme, SCHEME_FILE);
else if (strncasecmp(url->host, "ftp.", 4) == 0)
strcpy(url->scheme, SCHEME_FTP);
else if (strncasecmp(url->host, "www.", 4) == 0)
strcpy(url->scheme, SCHEME_HTTP);
if (strcmp(url->scheme, SCHEME_FTP) == 0) {
if (strcmp(url->scheme, SCHEME_HTTP) == 0 ||
strcmp(url->scheme, SCHEME_HTTPS) == 0) {
url->ims_time = sb.st_mtime;
r = fetchStat(url, &us, flags);
url->offset = sb.st_size;
f = fetchXGet(url, &us, flags);
if (i_flag && (strcmp(url->scheme, SCHEME_HTTP) == 0 ||
strcmp(url->scheme, SCHEME_HTTPS) == 0) &&
if (l_flag && strcmp(url->scheme, "file") == 0 && !o_stdout) {
if (symlink(url->doc, path) == -1) {
} else if (url->offset > sb.st_size) {
if (of != NULL && fseeko(of, url->offset, SEEK_SET) != 0) {
if (url->offset > 0) {
url->offset = 0;
if ((f = fetchXGet(url, &us, flags)) == NULL) {
count = url->offset;
if (url)
fetchFreeURL(url);