From 3194168ffccea41a2d572f092b26b85e568d0985 Mon Sep 17 00:00:00 2001 From: ume Date: Mon, 15 May 2000 09:05:36 +0000 Subject: Make HTTP_PROXY work for FTP. Reported by: Ben Smithurst Reviewed by: des --- lib/libfetch/fetch.c | 40 ++++++++++++++++++++++++++++++++-------- lib/libfetch/http.c | 18 +++++++++++++----- 2 files changed, 45 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/libfetch/fetch.c b/lib/libfetch/fetch.c index c7e46a9..ecf15b1 100644 --- a/lib/libfetch/fetch.c +++ b/lib/libfetch/fetch.c @@ -69,13 +69,19 @@ static struct fetcherr _url_errlist[] = { FILE * fetchGet(struct url *URL, char *flags) { + int direct; + + direct = (flags && strchr(flags, 'd')); if (strcasecmp(URL->scheme, "file") == 0) return fetchGetFile(URL, flags); else if (strcasecmp(URL->scheme, "http") == 0) return fetchGetHTTP(URL, flags); - else if (strcasecmp(URL->scheme, "ftp") == 0) + else if (strcasecmp(URL->scheme, "ftp") == 0) { + if (!direct && + getenv("FTP_PROXY") == NULL && getenv("HTTP_PROXY") != NULL) + return fetchGetHTTP(URL, flags); return fetchGetFTP(URL, flags); - else { + } else { _url_seterr(URL_BAD_SCHEME); return NULL; } @@ -88,13 +94,19 @@ fetchGet(struct url *URL, char *flags) FILE * fetchPut(struct url *URL, char *flags) { + int direct; + + direct = (flags && strchr(flags, 'd')); if (strcasecmp(URL->scheme, "file") == 0) return fetchPutFile(URL, flags); else if (strcasecmp(URL->scheme, "http") == 0) return fetchPutHTTP(URL, flags); - else if (strcasecmp(URL->scheme, "ftp") == 0) + else if (strcasecmp(URL->scheme, "ftp") == 0) { + if (!direct && + getenv("FTP_PROXY") == NULL && getenv("HTTP_PROXY") != NULL) + return fetchPutHTTP(URL, flags); return fetchPutFTP(URL, flags); - else { + } else { _url_seterr(URL_BAD_SCHEME); return NULL; } @@ -107,13 +119,19 @@ fetchPut(struct url *URL, char *flags) int fetchStat(struct url *URL, struct url_stat *us, char *flags) { + int direct; + + direct = (flags && strchr(flags, 'd')); if (strcasecmp(URL->scheme, "file") == 0) return fetchStatFile(URL, us, flags); else if (strcasecmp(URL->scheme, "http") == 0) return fetchStatHTTP(URL, us, flags); - else if (strcasecmp(URL->scheme, "ftp") == 0) + else if (strcasecmp(URL->scheme, "ftp") == 0) { + if (!direct && + getenv("FTP_PROXY") == NULL && getenv("HTTP_PROXY") != NULL) + return fetchStatHTTP(URL, us, flags); return fetchStatFTP(URL, us, flags); - else { + } else { _url_seterr(URL_BAD_SCHEME); return -1; } @@ -126,13 +144,19 @@ fetchStat(struct url *URL, struct url_stat *us, char *flags) struct url_ent * fetchList(struct url *URL, char *flags) { + int direct; + + direct = (flags && strchr(flags, 'd')); if (strcasecmp(URL->scheme, "file") == 0) return fetchListFile(URL, flags); else if (strcasecmp(URL->scheme, "http") == 0) return fetchListHTTP(URL, flags); - else if (strcasecmp(URL->scheme, "ftp") == 0) + else if (strcasecmp(URL->scheme, "ftp") == 0) { + if (!direct && + getenv("FTP_PROXY") == NULL && getenv("HTTP_PROXY") != NULL) + return fetchListHTTP(URL, flags); return fetchListFTP(URL, flags); - else { + } else { _url_seterr(URL_BAD_SCHEME); return NULL; } diff --git a/lib/libfetch/http.c b/lib/libfetch/http.c index d5d35fc..a395881 100644 --- a/lib/libfetch/http.c +++ b/lib/libfetch/http.c @@ -311,10 +311,16 @@ _http_connect(struct url *URL, char *flags) if (!URL->port) { struct servent *se; - if ((se = getservbyname("http", "tcp")) != NULL) - URL->port = ntohs(se->s_port); + if (strcasecmp(URL->scheme, "ftp") == 0) + if ((se = getservbyname("ftp", "tcp")) != NULL) + URL->port = ntohs(se->s_port); + else + URL->port = 21; else - URL->port = 80; + if ((se = getservbyname("http", "tcp")) != NULL) + URL->port = ntohs(se->s_port); + else + URL->port = 80; } /* attempt to connect to proxy server */ @@ -363,6 +369,8 @@ _http_connect(struct url *URL, char *flags) /* if no proxy is configured or could be contacted, try direct */ if (sd == -1) { + if (strcasecmp(URL->scheme, "ftp") == 0) + goto ouch; if ((sd = _fetch_connect(URL->host, URL->port, verbose)) == -1) goto ouch; } @@ -394,8 +402,8 @@ _http_request(FILE *f, char *op, struct url *URL, char *flags) /* send request (proxies require absolute form, so use that) */ if (verbose) - _fetch_info("requesting http://%s:%d%s", - URL->host, URL->port, URL->doc); + _fetch_info("requesting %s://%s:%d%s", + URL->scheme, URL->host, URL->port, URL->doc); _http_cmd(f, "%s %s://%s:%d%s HTTP/1.1" ENDL, op, URL->scheme, URL->host, URL->port, URL->doc); -- cgit v1.1