I am trying to do a request that accepts a compressed response
var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
I wonder if when I add the second line I will have to handle the decompression manually.
I found the answer.
You can change the code to:
var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
And you will have automatic decompression. No need to change the rest of the code.
For .NET Core things are a little more involved. A GZipStream
is needed as there isn't a property (as of writing) for AutomaticCompression
Consider the following GET
example:
var req = WebRequest.CreateHttp(uri);
/*
* Headers
*/
req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
/*
* Execute
*/
try
{
using (var resp = await req.GetResponseAsync())
{
using (var str = resp.GetResponseStream())
using (var gsr = new GZipStream(str, CompressionMode.Decompress))
using (var sr = new StreamReader(gsr))
{
string s = await sr.ReadToEndAsync();
}
}
}
catch (WebException ex)
{
using (HttpWebResponse response = (HttpWebResponse)ex.Response)
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
string respStr = sr.ReadToEnd();
int statusCode = (int)response.StatusCode;
string errorMsh = $"Request ({url}) failed ({statusCode}) on, with error: {respStr}";
}
}
}
GZIP and Deflate responses are not automatically handled. See this article for the details: HttpWebRequest and GZip Http Responses
I think you have to decompress the stream yourself. Here's an article on how to do it:
http://www.west-wind.com/WebLog/posts/102969.aspx