Bug 23966 - HttpClient.GetStreamAsync behaves differently from .Net
Summary: HttpClient.GetStreamAsync behaves differently from .Net
Alias: None
Product: Class Libraries
Classification: Mono
Component: System (show other bugs)
Version: 3.8.0
Hardware: PC Mac OS
: --- normal
Target Milestone: Untriaged
Assignee: Marek Safar
Depends on:
Reported: 2014-10-21 14:31 UTC by Alexandre Pepin
Modified: 2015-01-13 07:25 UTC (History)
3 users (show)

See Also:
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

Note You need to log in before you can comment on or make changes to this bug.