Closed
Description
When WinHttpHandler is used with a custom HttpContent that doesn't have a computed length then the request uses HTTP/1.1.
Tested with WinHttpHandler 5.0.0.
class Program
{
static async Task Main(string[] args)
{
WinHttpHandler h = new WinHttpHandler();
HttpClient c = new HttpClient(h);
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://localhost:5001/post");
requestMessage.Version = new Version(2, 0);
// StringContent will use HTTP/2
//requestMessage.Content = new StringContent("Test content!");
// CustomContent will use HTTP/1.1
requestMessage.Content = new CustomContent();
var response = await c.SendAsync(requestMessage);
Console.WriteLine(response.StatusCode);
Console.WriteLine(response.Version);
Console.WriteLine(await response.Content.ReadAsStringAsync());
Console.ReadKey();
}
private class CustomContent : HttpContent
{
protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
var s = Encoding.UTF8.GetBytes("Test content!");
await stream.WriteAsync(s, 0, s.Length);
}
protected override bool TryComputeLength(out long length)
{
// If a length is returned then HTTP/2 is used
length = default;
return false;
}
}
}