X-Git-Url: http://git.openwrt.org/?p=project%2Fuclient.git;a=blobdiff_plain;f=uclient-http.c;h=279669620ebe659b5904d6e3275b991e40f1e700;hp=74cc9a9ab1152a6e14d561d20d1d6f45e8ceab8c;hb=e6b5b8a98ce21d4b8374370b5d7592ead4b351e5;hpb=66fb58dff445514a53febab5a81a8a16d5ba9d56 diff --git a/uclient-http.c b/uclient-http.c index 74cc9a9..2796696 100644 --- a/uclient-http.c +++ b/uclient-http.c @@ -149,7 +149,8 @@ static void uclient_http_disconnect(struct uclient_http *uh) if (uh->ssl) ustream_free(&uh->ussl.stream); ustream_free(&uh->ufd.stream); - close(uh->ufd.fd.fd); + if(uh->ufd.fd.fd) + close(uh->ufd.fd.fd); uh->us = NULL; } @@ -198,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); @@ -436,12 +438,12 @@ static void add_field(char **buf, int *ofs, int *len, const char *name, const ch static int uclient_http_add_auth_digest(struct uclient_http *uh) { - int err = 0; struct uclient_url *url = uh->uc.url; const char *realm = NULL, *opaque = NULL; const char *user, *password; char *buf, *next, *buf_orig; int len, ofs; + int err = 0; char cnonce_str[9]; char nc_str[9]; @@ -568,36 +570,37 @@ fail: return err; } -static void +static int uclient_http_add_auth_header(struct uclient_http *uh) { if (!uh->uc.url->auth) - return; + return 0; switch (uh->auth_type) { case AUTH_TYPE_UNKNOWN: case AUTH_TYPE_NONE: break; case AUTH_TYPE_BASIC: - uclient_http_add_auth_basic(uh); - break; + return uclient_http_add_auth_basic(uh); case AUTH_TYPE_DIGEST: - uclient_http_add_auth_digest(uh); - break; + return uclient_http_add_auth_digest(uh); } + + return 0; } -static void +static int uclient_http_send_headers(struct uclient_http *uh) { struct uclient_url *url = uh->uc.url; struct blob_attr *cur; enum request_type req_type = uh->req_type; bool literal_ipv6; - int rem; + int err; + size_t rem; if (uh->state >= HTTP_STATE_HEADERS_SENT) - return; + return 0; if (uh->uc.proxy_url) url = uh->uc.proxy_url; @@ -620,11 +623,15 @@ uclient_http_send_headers(struct uclient_http *uh) if (uclient_request_supports_body(uh->req_type)) ustream_printf(uh->us, "Transfer-Encoding: chunked\r\n"); - uclient_http_add_auth_header(uh); + err = uclient_http_add_auth_header(uh); + if (err) + return err; ustream_printf(uh->us, "\r\n"); uh->state = HTTP_STATE_HEADERS_SENT; + + return 0; } static void uclient_http_headers_complete(struct uclient_http *uh) @@ -976,7 +983,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; @@ -1024,11 +1031,14 @@ static int uclient_http_send_data(struct uclient *cl, const char *buf, unsigned int len) { struct uclient_http *uh = container_of(cl, struct uclient_http, uc); + int err; if (uh->state >= HTTP_STATE_REQUEST_DONE) return -1; - uclient_http_send_headers(uh); + err = uclient_http_send_headers(uh); + if (err) + return err; if (len > 0) { ustream_printf(uh->us, "%X\r\n", len); @@ -1043,11 +1053,15 @@ static int uclient_http_request_done(struct uclient *cl) { struct uclient_http *uh = container_of(cl, struct uclient_http, uc); + int err; if (uh->state >= HTTP_STATE_REQUEST_DONE) return -1; - uclient_http_send_headers(uh); + err = uclient_http_send_headers(uh); + if (err) + return err; + if (uclient_request_supports_body(uh->req_type)) ustream_printf(uh->us, "0\r\n\r\n"); uh->state = HTTP_STATE_REQUEST_DONE; @@ -1162,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;