Merge pull request #4618 from BrzVlad/feature-par-nrs
[mono.git] / mcs / class / System / System.Net / ResponseStream.cs
index 31a0e66faa8e45cb0f98ed5f9685419d3e2eebfe..81e1d6f67d4be3308554d97eb4f01a2ecc97bafa 100644 (file)
@@ -26,7 +26,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0 && SECURITY_DEP
+#if SECURITY_DEP
 
 using System.IO;
 using System.Net.Sockets;
@@ -81,19 +81,25 @@ namespace System.Net {
                                byte [] bytes = null;
                                MemoryStream ms = GetHeaders (true);
                                bool chunked = response.SendChunked;
-                               if (ms != null) {
-                                       long start = ms.Position;
-                                       if (chunked && !trailer_sent) {
-                                               bytes = GetChunkSizeBytes (0, true);
-                                               ms.Position = ms.Length;
-                                               ms.Write (bytes, 0, bytes.Length);
+                               if (stream.CanWrite) {
+                                       try {
+                                               if (ms != null) {
+                                                       long start = ms.Position;
+                                                       if (chunked && !trailer_sent) {
+                                                               bytes = GetChunkSizeBytes (0, true);
+                                                               ms.Position = ms.Length;
+                                                               ms.Write (bytes, 0, bytes.Length);
+                                                       }
+                                                       InternalWrite (ms.GetBuffer (), (int) start, (int) (ms.Length - start));
+                                                       trailer_sent = true;
+                                               } else if (chunked && !trailer_sent) {
+                                                       bytes = GetChunkSizeBytes (0, true);
+                                                       InternalWrite (bytes, 0, bytes.Length);
+                                                       trailer_sent = true;
+                                               }
+                                       } catch (IOException) {
+                                               // Ignore error due to connection reset by peer
                                        }
-                                       InternalWrite (ms.GetBuffer (), (int) start, (int) (ms.Length - start));
-                                       trailer_sent = true;
-                               } else if (chunked && !trailer_sent) {
-                                       bytes = GetChunkSizeBytes (0, true);
-                                       InternalWrite (bytes, 0, bytes.Length);
-                                       trailer_sent = true;
                                }
                                response.Close ();
                        }
@@ -101,11 +107,14 @@ namespace System.Net {
 
                MemoryStream GetHeaders (bool closing)
                {
-                       if (response.HeadersSent)
-                               return null;
-                       MemoryStream ms = new MemoryStream ();
-                       response.SendHeaders (closing, ms);
-                       return ms;
+                       // SendHeaders works on shared headers
+                       lock (response.headers_lock) {
+                               if (response.HeadersSent)
+                                       return null;
+                               MemoryStream ms = new MemoryStream ();
+                               response.SendHeaders (closing, ms);
+                               return ms;
+                       }
                }
 
                public override void Flush ()
@@ -134,6 +143,8 @@ namespace System.Net {
                {
                        if (disposed)
                                throw new ObjectDisposedException (GetType ().ToString ());
+                       if (count == 0)
+                               return;
 
                        byte [] bytes = null;
                        MemoryStream ms = GetHeaders (false);