Merge pull request #1593 from kumpera/new_suspend
[mono.git] / mcs / class / System.Net.Http / System.Net.Http / HttpClientHandler.cs
index 026171a4f7ad6139b6264cab2ddbae3633235e4e..513a21eb5db772564a9c6c7b3245f2bb0a38c4a9 100644 (file)
@@ -232,6 +232,7 @@ namespace System.Net.Http
                {
                        var wr = new HttpWebRequest (request.RequestUri);
                        wr.ThrowOnError = false;
+                       wr.AllowWriteStreamBuffering = false;
 
                        wr.ConnectionGroupName = connectionGroupName;
                        wr.Method = request.Method.Method;
@@ -318,14 +319,27 @@ namespace System.Net.Http
 
                        try {
                                using (cancellationToken.Register (l => ((HttpWebRequest)l).Abort (), wrequest)) {
-                                       if (request.Content != null) {
+                                       var content = request.Content;
+                                       if (content != null) {
                                                var headers = wrequest.Headers;
-                                               foreach (var header in request.Content.Headers) {
+
+                                               foreach (var header in content.Headers) {
                                                        foreach (var value in header.Value) {
                                                                headers.AddValue (header.Key, value);
                                                        }
                                                }
 
+                                               //
+                                               // Content length has to be set because HttpWebRequest is running without buffering
+                                               //
+                                               var contentLength = content.Headers.ContentLength;
+                                               if (contentLength != null) {
+                                                       wrequest.ContentLength = contentLength.Value;
+                                               } else {
+                                                       await content.LoadIntoBufferAsync (MaxRequestContentBufferSize).ConfigureAwait (false);
+                                                       wrequest.ContentLength = content.Headers.ContentLength.Value;
+                                               }
+
                                                var stream = await wrequest.GetRequestStreamAsync ().ConfigureAwait (false);
                                                await request.Content.CopyToAsync (stream).ConfigureAwait (false);
                                        } else if (HttpMethod.Post.Equals (request.Method) || HttpMethod.Put.Equals (request.Method) || HttpMethod.Delete.Equals (request.Method)) {