Bug 25519 - BeginGetRequestStream does not set CompletedSynchronously appropriately
Summary: BeginGetRequestStream does not set CompletedSynchronously appropriately
Status: NEW
Alias: None
Product: Class Libraries
Classification: Mono
Component: System.Web (show other bugs)
Version: master
Hardware: PC Linux
: --- normal
Target Milestone: Untriaged
Assignee: Bugzilla
URL:
Depends on:
Blocks:
 
Reported: 2014-12-18 19:07 UTC by obadz
Modified: 2014-12-18 19:07 UTC (History)
1 user (show)

See Also:
Tags:
Is this bug a regression?: ---
Last known good build:


Attachments

Description obadz 2014-12-18 19:07:02 UTC
This bit of F# code (which translates essentially word for word into C#) exposes the issue:

let req = System.Net.HttpWebRequest.Create("http://httpbin.org/post")
req.Method <- "POST"

do
  async {
    let cb = new System.AsyncCallback(fun iar -> printfn "Sync #1?: %A" iar.CompletedSynchronously)
    let iar = req.BeginGetRequestStream(cb, null)
    printfn "Sync #2?: %A" iar.CompletedSynchronously
    use s = req.EndGetRequestStream(iar)
    let x = System.Text.Encoding.ASCII.GetBytes("test=foo")
    do! s.AsyncWrite(x, 0, x.Length)
    s.Flush()
  } |> Async.RunSynchronously
 
prints:

Sync #2?: false
Sync #1?: true

I believe these two should agree. (In CLR they are both false).

This causes a deadlock in FSharp.Data when doing HTTP POST requests on Mono (but not CLR) as shown on https://github.com/fsharp/FSharp.Data/issues/762#issuecomment-67425153

Though I haven't exactly pinned it down, I believe the issue is in one of:

 - mono/mcs/class/System/System.Net/HttpWebRequest.cs
 - mono/mcs/class/System/System.Net/WebAsyncResult.cs
 - mono/mcs/class/System/System.Net/SimpleAsyncResult.cs

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