http: add proper error handling to uclient_http_redirect()
authorFelix Fietkau <nbd@openwrt.org>
Sat, 23 Jan 2016 00:23:00 +0000 (01:23 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Sat, 23 Jan 2016 00:23:00 +0000 (01:23 +0100)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
uclient-fetch.c
uclient-http.c
uclient.h

index 223d3641683b5519f7db5305597db05148543494..d2ffde3f89423d975d38a730023d59db645c9217 100644 (file)
@@ -165,12 +165,22 @@ static void header_done_cb(struct uclient *cl)
        uint64_t resume_offset = 0, resume_end, resume_size;
        static int retries;
 
-       if (retries < 10 && uclient_http_redirect(cl)) {
-               if (!quiet)
-                       fprintf(stderr, "Redirected to %s on %s\n", cl->url->location, cl->url->host);
+       if (retries < 10) {
+               int ret = uclient_http_redirect(cl);
+               if (ret < 0) {
+                       if (!quiet)
+                               fprintf(stderr, "Failed to redirect to %s on %s\n", cl->url->location, cl->url->host);
+                       error_ret = 8;
+                       request_done(cl);
+                       return;
+               }
+               if (ret > 0) {
+                       if (!quiet)
+                               fprintf(stderr, "Redirected to %s on %s\n", cl->url->location, cl->url->host);
 
-               retries++;
-               return;
+                       retries++;
+                       return;
+               }
        }
 
        if (cl->status_code == 204 && cur_resume) {
index 195fa1cfcdcbbc2ea008b1d1e17efc4553b79989..6fc30da1ea28b153bb8231ba518bde473b038992 100644 (file)
@@ -1063,7 +1063,7 @@ uclient_http_read(struct uclient *cl, char *buf, unsigned int len)
        return len;
 }
 
-bool uclient_http_redirect(struct uclient *cl)
+int uclient_http_redirect(struct uclient *cl)
 {
        struct uclient_http *uh = container_of(cl, struct uclient_http, uc);
        struct blobmsg_policy location = {
@@ -1095,7 +1095,9 @@ bool uclient_http_redirect(struct uclient *cl)
 
        free(cl->url);
        cl->url = url;
-       uclient_http_connect(cl);
+       if (uclient_http_connect(cl))
+               return -1;
+
        uclient_http_request_done(cl);
 
        return true;
index 282b9f387bd2b4c1c46799dd2a9c9b50479fb6ff..504fc3535c50b82ab381680f326889425278f8ce 100644 (file)
--- a/uclient.h
+++ b/uclient.h
@@ -121,7 +121,7 @@ extern const struct uclient_backend uclient_backend_http;
 int uclient_http_reset_headers(struct uclient *cl);
 int uclient_http_set_header(struct uclient *cl, const char *name, const char *value);
 int uclient_http_set_request_type(struct uclient *cl, const char *type);
-bool uclient_http_redirect(struct uclient *cl);
+int uclient_http_redirect(struct uclient *cl);
 
 int uclient_http_set_ssl_ctx(struct uclient *cl, const struct ustream_ssl_ops *ops,
                             struct ustream_ssl_ctx *ctx, bool require_validation);