Reputation: 4923
I am trying to use HttpClient to download only part of a file (in this example, from the SEC Website).
If I set the RangeHeaderValue to something >= 4200, I get a part of the file (although response.Content.Headers.ContentLength
says the size is 32628 bytes, which could be due to compression). If I watch the request go out in Fiddler, I see Range: bytes=0-4200
as a header under Miscellaneous
. So I am fairly confident I am setting the headers correctly. What I cannot figure out is 2 fold, why does setting the max length on RangeHeaderValue
to less than ~4200 result in a ContentLength
of 0 (confirmed in Fiddler) and why does the ContentLength
not match up to the requested range?
I have confirmed (by looking at the headers) that the SEC server supports ranges (Accept-Ranges: bytes
). Sample code is below.
var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip });
var request = new HttpRequestMessage { RequestUri = new Uri("http://www.sec.gov/Archives/edgar/full-index/2013/QTR1/company.idx") };
request.Headers.Range = new RangeHeaderValue(0, 1000);
Console.WriteLine(request.Headers.Range.Ranges);
var response = await client.SendAsync(request);
Console.WriteLine(response.Headers);
Console.WriteLine(response.Content.Headers.ContentLength);
Console.WriteLine(response.RequestMessage);
Upvotes: 10
Views: 8618
Reputation: 3701
Confirmed the server still hasn't implemented partial downloads (byte ranges).
I've set Range: bytes=0-4201
& Range: bytes=0-1000
and all the time I get the full file: 45,846,783 bytes.
One way to get partial file is to pause/stop download when you've got enough bytes. This would however, work for byte range beginning with zero (first few bytes of file), not for middle portion of file.
Upvotes: 2
Reputation: 4923
There is no question here, the server claims it obeys the range standard but appears to ignore it. Further research using several CDNs, the code works properly.
Upvotes: 3