X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=uclient-http.c;h=c2bba6b5b8f2093e3b408d6d35a312673f821583;hb=e209a4ced1d80e8a4ac4290a6ade9d339eab1705;hp=8d6d32734ba93286c968212945a66a56fb781257;hpb=ae1c656ff041c6f1ccb37b070fa261e0d71f2b12;p=project%2Fuclient.git diff --git a/uclient-http.c b/uclient-http.c index 8d6d327..c2bba6b 100644 --- a/uclient-http.c +++ b/uclient-http.c @@ -199,7 +199,8 @@ static void uclient_notify_eof(struct uclient_http *uh) return; } - if (uh->content_length < 0 && uh->read_chunked >= 0) + if ((uh->content_length < 0 && uh->read_chunked >= 0) || + uh->content_length == 0) uh->uc.data_eof = true; uclient_backend_set_eof(&uh->uc); @@ -440,7 +441,7 @@ uclient_http_add_auth_digest(struct uclient_http *uh) struct uclient_url *url = uh->uc.url; const char *realm = NULL, *opaque = NULL; const char *user, *password; - char *buf, *next, *buf_orig; + char *buf, *next; int len, ofs; int err = 0; @@ -470,7 +471,7 @@ uclient_http_add_auth_digest(struct uclient_http *uh) strcpy(buf, uh->auth_str); /* skip auth type */ - buf_orig = strsep(&buf, " "); + strsep(&buf, " "); next = buf; while (*next) { @@ -506,7 +507,7 @@ uclient_http_add_auth_digest(struct uclient_http *uh) if (!realm || !data.qop || !data.nonce) { err = -EINVAL; - goto fail_buf; + goto fail; } sprintf(nc_str, "%08x", uh->nc++); @@ -523,13 +524,13 @@ uclient_http_add_auth_digest(struct uclient_http *uh) len = password - url->auth; if (len > 256) { err = -EINVAL; - goto fail_buf; + goto fail; } user_buf = alloca(len + 1); if (!user_buf) { err = -ENOMEM; - goto fail_buf; + goto fail; } strncpy(user_buf, url->auth, len); @@ -563,8 +564,6 @@ uclient_http_add_auth_digest(struct uclient_http *uh) return 0; -fail_buf: - free(buf_orig); fail: return err; } @@ -595,7 +594,8 @@ uclient_http_send_headers(struct uclient_http *uh) struct blob_attr *cur; enum request_type req_type = uh->req_type; bool literal_ipv6; - int err, rem; + int err; + size_t rem; if (uh->state >= HTTP_STATE_HEADERS_SENT) return 0; @@ -655,7 +655,8 @@ static void uclient_http_headers_complete(struct uclient_http *uh) if (uh->eof || seq != uh->uc.seq) return; - if (uh->req_type == REQ_HEAD || uh->uc.status_code == 204) { + if (uh->req_type == REQ_HEAD || uh->uc.status_code == 204 || + uh->content_length == 0) { uh->eof = true; uclient_notify_eof(uh); } @@ -981,7 +982,7 @@ int uclient_http_set_request_type(struct uclient *cl, const char *type) { struct uclient_http *uh = container_of(cl, struct uclient_http, uc); - int i; + unsigned int i; if (cl->backend != &uclient_backend_http) return -1; @@ -1108,16 +1109,17 @@ uclient_http_read(struct uclient *cl, char *buf, unsigned int len) } } - if (len > data_end - data) - len = data_end - data; + unsigned int diff = data_end - data; + if (len > diff) + len = diff; if (uh->read_chunked >= 0) { - if (len > uh->read_chunked) + if (len > (unsigned long) uh->read_chunked) len = uh->read_chunked; uh->read_chunked -= len; } else if (uh->content_length >= 0) { - if (len > uh->content_length) + if (len > (unsigned long) uh->content_length) len = uh->content_length; uh->content_length -= len; @@ -1174,8 +1176,15 @@ int uclient_http_redirect(struct uclient *cl) if (!url) return false; - free(cl->url); - cl->url = url; + if (cl->proxy_url) { + free(cl->proxy_url); + cl->proxy_url = url; + } + else { + free(cl->url); + cl->url = url; + } + if (uclient_http_connect(cl)) return -1;