http: rework authentication handling - only retry internally for GET requests
[project/uclient.git] / uclient-http.c
index 16ffe9660cd55a0cd50af94565e0aa5dd55aa92b..1ab336f8f35f40d349fa91e9ac43d2840700f285 100644 (file)
@@ -40,6 +40,7 @@ enum request_type {
        REQ_GET,
        REQ_HEAD,
        REQ_POST,
+       REQ_PUT,
        __REQ_MAX
 };
 
@@ -56,6 +57,7 @@ static const char * const request_types[__REQ_MAX] = {
        [REQ_GET] = "GET",
        [REQ_HEAD] = "HEAD",
        [REQ_POST] = "POST",
+       [REQ_PUT] = "PUT",
 };
 
 struct uclient_http {
@@ -495,9 +497,6 @@ uclient_http_send_headers(struct uclient_http *uh)
        if (uh->state >= HTTP_STATE_HEADERS_SENT)
                return;
 
-       if (uh->auth_type == AUTH_TYPE_UNKNOWN)
-               req_type = REQ_HEAD;
-
        ustream_printf(uh->us,
                "%s %s HTTP/1.1\r\n"
                "Host: %s\r\n",
@@ -507,7 +506,7 @@ uclient_http_send_headers(struct uclient_http *uh)
        blobmsg_for_each_attr(cur, uh->headers.head, rem)
                ustream_printf(uh->us, "%s: %s\n", blobmsg_name(cur), (char *) blobmsg_data(cur));
 
-       if (uh->req_type == REQ_POST)
+       if (uh->req_type == REQ_POST || uh->req_type == REQ_PUT)
                ustream_printf(uh->us, "Transfer-Encoding: chunked\r\n");
 
        uclient_http_add_auth_header(uh);
@@ -525,7 +524,8 @@ static void uclient_http_headers_complete(struct uclient_http *uh)
        uh->uc.meta = uh->meta.head;
        uclient_http_process_headers(uh);
 
-       if (auth_type == AUTH_TYPE_UNKNOWN) {
+       if (auth_type == AUTH_TYPE_UNKNOWN && uh->uc.status_code == 401 &&
+           (uh->req_type == REQ_HEAD || uh->req_type == REQ_GET)) {
                uclient_http_init_request(uh);
                uclient_http_send_headers(uh);
                uh->state = HTTP_STATE_REQUEST_DONE;
@@ -884,7 +884,7 @@ uclient_http_request_done(struct uclient *cl)
                return -1;
 
        uclient_http_send_headers(uh);
-       if (uh->req_type == REQ_POST)
+       if (uh->req_type == REQ_POST || uh->req_type == REQ_PUT)
                ustream_printf(uh->us, "0\r\n\r\n");
        uh->state = HTTP_STATE_REQUEST_DONE;
 
@@ -926,8 +926,10 @@ uclient_http_read(struct uclient *cl, char *buf, unsigned int len)
                read_len += sep + 2 - data;
                data = sep + 2;
 
-               if (!uh->read_chunked)
+               if (!uh->read_chunked) {
                        uh->eof = true;
+                       uh->uc.data_eof = true;
+               }
        }
 
        if (len > data_end - data)
@@ -943,8 +945,10 @@ uclient_http_read(struct uclient *cl, char *buf, unsigned int len)
                        len = uh->content_length;
 
                uh->content_length -= len;
-               if (!uh->content_length)
+               if (!uh->content_length) {
                        uh->eof = true;
+                       uh->uc.data_eof = true;
+               }
        }
 
        if (len > 0) {