Skip to content

WinHttpHandler + HTTP/2 + unknown length request = downgrade to HTTP/1.1 #46413

Closed
@JamesNK

Description

@JamesNK

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;
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-System.Net.HttpenhancementProduct code improvement that does NOT require public API changes/additions

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions