summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2016-01-23 01:23:00 +0100
committerFelix Fietkau <nbd@openwrt.org>2016-01-23 01:23:00 +0100
commit4924411cff2e74d835b819151513367d08c9e524 (patch)
tree54f6f71817b9a7bf81900b96a5a3b7d78997402d
parentb9808a8c3a8922ed8df4e6fe45848ac2e52f13be (diff)
downloaduclient-4924411cff2e74d835b819151513367d08c9e524.tar.gz
http: add proper error handling to uclient_http_redirect()
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
-rw-r--r--uclient-fetch.c20
-rw-r--r--uclient-http.c6
-rw-r--r--uclient.h2
3 files changed, 20 insertions, 8 deletions
diff --git a/uclient-fetch.c b/uclient-fetch.c
index 223d364..d2ffde3 100644
--- a/uclient-fetch.c
+++ b/uclient-fetch.c
@@ -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) {
diff --git a/uclient-http.c b/uclient-http.c
index 195fa1c..6fc30da 100644
--- a/uclient-http.c
+++ b/uclient-http.c
@@ -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;
diff --git a/uclient.h b/uclient.h
index 282b9f3..504fc35 100644
--- 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);