diff --git a/subsys/net/lib/http/http_client.c b/subsys/net/lib/http/http_client.c index 01cf8fb134e..235e1ef51c2 100644 --- a/subsys/net/lib/http/http_client.c +++ b/subsys/net/lib/http/http_client.c @@ -520,8 +520,8 @@ static int http_wait_data(int sock, struct http_request *req, const k_timepoint_ } else if (fds[0].revents & ZSOCK_POLLIN) { received = zsock_recv(sock, req->internal.response.recv_buf + offset, req->internal.response.recv_buf_len - offset, 0); - if (received == 0) { - /* Connection closed */ + if (received == 0 && total_received == 0) { + /* Connection closed, no data received */ goto closed; } else if (received < 0) { ret = -errno; @@ -534,9 +534,12 @@ static int http_wait_data(int sock, struct http_request *req, const k_timepoint_ /* Initialize the data length with the received data length. */ req->internal.response.data_len = offset; + /* In case of EOF on a socket, indicate this by passing + * 0 length to the parser. + */ processed = http_parser_execute( &req->internal.parser, &req->internal.parser_settings, - req->internal.response.recv_buf, offset); + req->internal.response.recv_buf, received > 0 ? offset : 0); if (processed > offset) { LOG_ERR("HTTP parser error, too much data consumed");