summaryrefslogtreecommitdiffstats
path: root/lib/libfetch/http.c
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2000-05-26 15:34:42 +0000
committerdes <des@FreeBSD.org>2000-05-26 15:34:42 +0000
commit96fd818f66ed6e6056d8d81fd44ffb2bced1924f (patch)
tree8b1f0f408a2711e4e932413e33f5fc0de93c046b /lib/libfetch/http.c
parentc356d44517cddb13eaa427eb4e80bddd411bb1d9 (diff)
downloadFreeBSD-src-96fd818f66ed6e6056d8d81fd44ffb2bced1924f.zip
FreeBSD-src-96fd818f66ed6e6056d8d81fd44ffb2bced1924f.tar.gz
Hackish support for 302 redirect.
Diffstat (limited to 'lib/libfetch/http.c')
-rw-r--r--lib/libfetch/http.c83
1 files changed, 59 insertions, 24 deletions
diff --git a/lib/libfetch/http.c b/lib/libfetch/http.c
index 7b53233..888b7f7 100644
--- a/lib/libfetch/http.c
+++ b/lib/libfetch/http.c
@@ -84,6 +84,7 @@ extern char *__progname;
#define HTTP_OK 200
#define HTTP_PARTIAL 206
+#define HTTP_MOVED 302
struct cookie
{
@@ -412,6 +413,21 @@ ouch:
}
/*
+ * Check a header line
+ */
+char *
+_http_match(char *str, char *hdr)
+{
+ while (*str && *hdr && tolower(*str++) == tolower(*hdr++))
+ /* nothing */;
+ if (*str || *hdr != ':')
+ return NULL;
+ while (*hdr && isspace(*++hdr))
+ /* nothing */;
+ return hdr;
+}
+
+/*
* Send a HEAD or GET request
*/
int
@@ -477,33 +493,20 @@ _http_request(FILE *f, char *op, struct url *URL, char *flags)
}
/*
- * Check a header line
- */
-char *
-_http_match(char *str, char *hdr)
-{
- while (*str && *hdr && tolower(*str++) == tolower(*hdr++))
- /* nothing */;
- if (*str || *hdr != ':')
- return NULL;
- while (*hdr && isspace(*++hdr))
- /* nothing */;
- return hdr;
-}
-
-/*
* Retrieve a file by HTTP
*/
FILE *
fetchGetHTTP(struct url *URL, char *flags)
{
- int e, enc = ENC_NONE, i;
+ int e, enc = ENC_NONE, i, noredirect;
struct cookie *c;
char *ln, *p, *q;
FILE *f, *cf;
size_t len;
off_t pos = 0;
+ noredirect = (flags && strchr(flags, 'A'));
+
/* allocate cookie */
if ((c = calloc(1, sizeof *c)) == NULL)
return NULL;
@@ -516,9 +519,8 @@ fetchGetHTTP(struct url *URL, char *flags)
c->real_f = f;
e = _http_request(f, "GET", URL, flags);
-
- /* add code to handle redirects later */
- if (e != (URL->offset ? HTTP_PARTIAL : HTTP_OK)) {
+ if (e != (URL->offset ? HTTP_PARTIAL : HTTP_OK)
+ && (e != HTTP_MOVED || noredirect)) {
_http_seterr(e);
goto fouch;
}
@@ -533,7 +535,22 @@ fetchGetHTTP(struct url *URL, char *flags)
--len;
ln[len] = '\0'; /* XXX */
DEBUG(fprintf(stderr, "header: [\033[1m%s\033[m]\n", ln));
- if ((p = _http_match("Transfer-Encoding", ln)) != NULL) {
+ if ((p = _http_match("Location", ln)) != NULL) {
+ struct url *url;
+
+ for (q = p; *q && !isspace(*q); q++)
+ /* VOID */ ;
+ *q = 0;
+ if ((url = fetchParseURL(p)) == NULL)
+ goto fouch;
+ url->offset = URL->offset;
+ url->length = URL->length;
+ DEBUG(fprintf(stderr, "location: [\033[1m%s\033[m]\n", p));
+ cf = fetchGetHTTP(url, flags);
+ fetchFreeURL(url);
+ fclose(f);
+ return cf;
+ } else if ((p = _http_match("Transfer-Encoding", ln)) != NULL) {
for (q = p; *q && !isspace(*q); q++)
/* VOID */ ;
*q = 0;
@@ -599,10 +616,12 @@ fetchPutHTTP(struct url *URL, char *flags)
int
fetchStatHTTP(struct url *URL, struct url_stat *us, char *flags)
{
- int e;
+ int e, noredirect;
size_t len;
- char *ln, *p;
+ char *ln, *p, *q;
FILE *f;
+
+ noredirect = (flags && strchr(flags, 'A'));
us->size = -1;
us->atime = us->mtime = 0;
@@ -611,7 +630,8 @@ fetchStatHTTP(struct url *URL, struct url_stat *us, char *flags)
if ((f = _http_connect(URL, flags)) == NULL)
return -1;
- if ((e = _http_request(f, "HEAD", URL, flags)) != HTTP_OK) {
+ e = _http_request(f, "HEAD", URL, flags);
+ if (e != HTTP_OK && (e != HTTP_MOVED || noredirect)) {
_http_seterr(e);
goto ouch;
}
@@ -625,7 +645,22 @@ fetchStatHTTP(struct url *URL, struct url_stat *us, char *flags)
--len;
ln[len] = '\0'; /* XXX */
DEBUG(fprintf(stderr, "header: [\033[1m%s\033[m]\n", ln));
- if ((p = _http_match("Last-Modified", ln)) != NULL) {
+ if ((p = _http_match("Location", ln)) != NULL) {
+ struct url *url;
+
+ for (q = p; *q && !isspace(*q); q++)
+ /* VOID */ ;
+ *q = 0;
+ if ((url = fetchParseURL(p)) == NULL)
+ goto ouch;
+ url->offset = URL->offset;
+ url->length = URL->length;
+ DEBUG(fprintf(stderr, "location: [\033[1m%s\033[m]\n", p));
+ e = fetchStatHTTP(url, us, flags);
+ fetchFreeURL(url);
+ fclose(f);
+ return e;
+ } else if ((p = _http_match("Last-Modified", ln)) != NULL) {
struct tm tm;
char locale[64];
OpenPOWER on IntegriCloud