Skip to content

ExpectContinue causes breaking behaviour in responseStream.Read #26341

@peppy

Description

@peppy

Since 2.1.300, setting ExpectContinue to true will cause Read operations on the response stream to block for a long period rather than immediately returning 0 at the end of stream content.

Reproduction:

using System;
using System.IO;
using System.Net;
using System.Net.Http;

namespace http_response_read_test
{
    class Program
    {
        private const int buffer_size = 2048;

        static void Main(string[] args)
        {
            var client = new HttpClient();

            client.DefaultRequestHeaders.ExpectContinue = true;

            var response = client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://httpbin.org/get")).Result;
            var buffer = new byte[buffer_size];

            using (var responseStream = response.Content.ReadAsStreamAsync().Result)
            {
                int read;
                while ((read = responseStream.Read(buffer, 0, buffer_size)) > 0)
                {
                    // consume buffer
                }
            }
            
            System.Console.WriteLine("finished");
        }
    }
}

Running this code under netcoreapp2.0 and net471 will exit immediately after the response is read, while running under netcoreapp2.1 will block for a very long time before eventually exiting (takes around a minute).

Commenting out the ExpectContinue line will cause all three runtimes to match in behaviour.

Metadata

Metadata

Assignees

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions