http: call ustream_poll if not enough read data is available
[project/uclient.git] / uclient-http.c
index 7eb469221d7fdc5ae4cb80578aa1dabf0d8fee67..33f651301d4e373751808c2c517ebbfee4df53cd 100644 (file)
@@ -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);
        }
@@ -779,9 +780,7 @@ static void __uclient_notify_read(struct uclient_http *uh)
        if (uh->state == HTTP_STATE_RECV_DATA) {
                /* Now it's uclient user turn to read some data */
                uloop_timeout_cancel(&uc->connection_timeout);
-
-               if (uc->cb->data_read)
-                       uc->cb->data_read(uc);
+               uclient_backend_read_notify(uc);
        }
 }
 
@@ -1078,8 +1077,12 @@ uclient_http_read(struct uclient *cl, char *buf, unsigned int len)
                return 0;
 
        data = ustream_get_read_buf(uh->us, &read_len);
-       if (!data || !read_len)
-               return 0;
+       if (!data || !read_len) {
+               ustream_poll(uh->us);
+               data = ustream_get_read_buf(uh->us, &read_len);
+               if (!data || !read_len)
+                       return 0;
+       }
 
        data_end = data + read_len;
        read_len = 0;
@@ -1108,16 +1111,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;
@@ -1157,14 +1161,8 @@ int uclient_http_redirect(struct uclient *cl)
        if (cl->backend != &uclient_backend_http)
                return false;
 
-       switch (cl->status_code) {
-       case 301:
-       case 302:
-       case 307:
-               break;
-       default:
+       if (!uclient_http_status_redirect(cl))
                return false;
-       }
 
        blobmsg_parse(&location, 1, &tb, blob_data(uh->meta.head), blob_len(uh->meta.head));
        if (!tb)