Bug 23966

Summary: HttpClient.GetStreamAsync behaves differently from .Net
Product: [Mono] Class Libraries Reporter: Alexandre Pepin <alexandre.pepin>
Component: SystemAssignee: Marek Safar <masafa>
Status: RESOLVED FIXED    
Severity: normal CC: egoulet06, masafa, mono-bugs+mono
Priority: ---    
Version: 3.8.0   
Target Milestone: Untriaged   
Hardware: PC   
OS: Mac OS   
Tags: Is this bug a regression?: ---
Last known good build:

Description Alexandre Pepin 2014-10-21 14:31:48 UTC
I want to be able to read a http stream before that all the response is received.
This code works perfectly with the .Net framework :

System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
var stream = client.GetStreamAsync("http://www.google.com").Result;

using (var reader = new StreamReader(stream))
{
    while (!reader.EndOfStream)
    {
        string lineRead = reader.ReadLine();
    }
}

The code blocks at "!reader.EndOfStream" and as soon as there is new data in the stream, I can read it.

In mono, the code blocks at "var stream = client.GetStreamAsync("http://www.google.com").Result;" and only unblocks when all the data is received. I think it is because in mono, in the GetStreamAsync method, you set the HttpCompletionOption to ResponseContentRead while it should be set to ResponseHeadersRead

Workaround :
Instead of using GetStreamAsync to get the stream, I can use "GetAsync(uri, HttpCompletionOption.ResponseHeadersRead).Result.Content.ReadAsStreamAsync().Result"
Comment 1 Marek Safar 2015-01-13 07:25:16 UTC
Fixed in master