threads / patch / 40682

patchhttp.c: use CURLOPT_RANGE for range requests

Subject: [PATCH] http.c: use CURLOPT_RANGE for range requests

## tl;dr

2 messages between Oct 30, 2015 and Oct 30, 2015. Diffs are folded; open one to read it.

replies: 1people: 1as markdown or json

David Turner· Oct 30, 2015, 22:41 UTC · lore

A HTTP server is permitted to return a non-range response to a HTTP range request (and Apache httpd in fact does this in some cases). While libcurl knows how to correctly handle this (by skipping bytes before and after the requested range), it only turns on this handling if it is aware that a range request is being made. By manually setting the range header instead of using CURLOPT_RANGE, we were hiding the fact that this was a range request from libcurl. This could cause corruption.

Signed-off-by: David Turner <dturner@twopensource.com>
---
 http.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
Show changes to http.c +3 −2
diff --git a/http.c b/http.c
index 0f924a8..303b388 100644
--- a/http.c
+++ b/http.c
@@ -1202,8 +1202,9 @@ static int http_request(const char *url,
 			curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION,
 					 fwrite);
 			if (posn > 0) {
-				strbuf_addf(&buf, "Range: bytes=%ld-", posn);
-				headers = curl_slist_append(headers, buf.buf);
+				strbuf_addf(&buf, "%ld-", posn);
+				curl_easy_setopt(slot->curl, CURLOPT_RANGE,
+						 &buf.buf);
 				strbuf_reset(&buf);
 			}
 		} else
-- 
2.4.2.691.g714732c-twtrsrc
David Turner· Oct 30, 2015, 22:43 UTC · re: David Turner · lore

Re: [PATCH] http.c: use CURLOPT_RANGE for range requests

Please disregard this; I noticed I missed a few instances. Will reroll shortly.

On Fri, 2015-10-30 at 18:41 -0400, David Turner wrote:
Show 30 quoted lines
> A HTTP server is permitted to return a non-range response to a HTTP
> range request (and Apache httpd in fact does this in some cases).
> While libcurl knows how to correctly handle this (by skipping bytes
> before and after the requested range), it only turns on this handling
> if it is aware that a range request is being made.  By manually
> setting the range header instead of using CURLOPT_RANGE, we were
> hiding the fact that this was a range request from libcurl.  This
> could cause corruption.
> 
> Signed-off-by: David Turner <dturner@twopensource.com>
> ---
>  http.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/http.c b/http.c
> index 0f924a8..303b388 100644
> --- a/http.c
> +++ b/http.c
> @@ -1202,8 +1202,9 @@ static int http_request(const char *url,
>  			curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION,
>  					 fwrite);
>  			if (posn > 0) {
> -				strbuf_addf(&buf, "Range: bytes=%ld-", posn);
> -				headers = curl_slist_append(headers, buf.buf);
> +				strbuf_addf(&buf, "%ld-", posn);
> +				curl_easy_setopt(slot->curl, CURLOPT_RANGE,
> +						 &buf.buf);
>  				strbuf_reset(&buf);
>  			}
>  		} else

← back to recent threads