if I want to partially download a file and define a single range in the request Header, I get the byte-stream of the requested file in the response body.
But if i specify multiple ranges as below, I always get for each defined range an additional response header (wich describes the requested range) within the response body that corrupts the downloaded file.
static void Main(string[] args)
{
Console.Write("Please enter target File: ");
string Target = Console.ReadLine();
string Source = @"http://mozilla-mirror.3347.voxcdn.com/pub/mozilla.org/firefox/releases/3.6/win32/de/Firefox%20Setup%203.6.exe";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Source);
request.Credentials = CredentialCache.DefaultCredentials;
// define multiple Ranges
request.AddRange( 0, 1000000);
request.AddRange(1000000, 2000000);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (Stream source = response.GetResponseStream())
{
using (FileStream target = File.Open(Target, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
{
byte[] buffer = new byte[4096];
int BytesRead = 0;
int TotalBytesRead = 0;
while((BytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
{
target.Write(buffer, 0, BytesRead);
TotalBytesRead += BytesRead;
Console.WriteLine("{0}", TotalBytesRead);
}
}
}
Console.WriteLine("Downloading Finished!");
Console.ReadLine();
}
Request as shown in Wireshark:
http://img197.imageshack.us/img197/8199/requesty.png
Response Body should only contain the Byte-Stream of the file, but additionally contains the unwanted Response-Header at the beginning of each defined Range:
Is it possible to avoid the additional response header in the body without requesting each Range separately?
or
Is there a build-in way to filter the additional response header, whose size could vary depending on the HTTP-Server?
No, that's how multiple ranges in HTTP/1.1 work. See RFC 2616, Section 19.2.
thanks for your help, as described in the link above it is the supposed way http responds to a request with multiple ranges.
so....
Is it possible to avoid the additional response header in the body without requesting each Range separately?
=> No.
Is there a build-in way to filter the additional response header, whose size could vary depending on the HTTP-Server?
=> I don't know but ...
maybe some of you could have a critical look at the following chunk of code wich filters the headers from the file data:
and could give me some hints if there is a another/better way to do that.
best regards cap_Chap