* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System / System.Net / WebConnectionStream.cs
index 956087b6485647ea679a400f3f6f4c560da933d0..37c9eb4b8406ba486b592b2fe23d8b14f0e35562 100644 (file)
@@ -61,6 +61,7 @@ namespace System.Net
                bool initRead;
                bool read_eof;
                bool complete_request_written;
+               long max_buffer_size;
 
                public WebConnectionStream (WebConnection cnc)
                {
@@ -90,8 +91,12 @@ namespace System.Net
                        this.request = request;
                        allowBuffering = request.InternalAllowBuffering;
                        sendChunked = request.SendChunked;
-                       if (allowBuffering)
+                       if (allowBuffering) {
                                writeBuffer = new MemoryStream ();
+                               max_buffer_size = request.ContentLength;
+                       } else {
+                               max_buffer_size = -1;
+                       }
 
                        if (sendChunked)
                                pending = new ManualResetEvent (true);
@@ -380,6 +385,15 @@ namespace System.Net
 
                        WebAsyncResult result = new WebAsyncResult (cb, state);
                        if (allowBuffering) {
+                               if (max_buffer_size >= 0) {
+                                       long avail = max_buffer_size - writeBuffer.Length;
+                                       if (size > avail) {
+                                               if (requestWritten)
+                                                       throw new ProtocolViolationException (
+                                                       "The number of bytes to be written is greater than " +
+                                                       "the specified ContentLength.");
+                                       }
+                               }
                                writeBuffer.Write (buffer, offset, size);
                                if (!sendChunked) {
                                        result.SetCompleted (true, 0);
@@ -525,13 +539,19 @@ namespace System.Net
                        if (cnc.Data.StatusCode != 0 && cnc.Data.StatusCode != 100)
                                return;
 
-                       IAsyncResult result = cnc.BeginWrite (bytes, 0, length, null, null);
+                       IAsyncResult result = null;
+                       if (length > 0)
+                               result = cnc.BeginWrite (bytes, 0, length, null, null);
+
                        if (!initRead) {
                                initRead = true;
                                WebConnection.InitRead (cnc);
                        }
 
-                       complete_request_written = cnc.EndWrite (result);
+                       if (length > 0) 
+                               complete_request_written = cnc.EndWrite (result);
+                       else
+                               complete_request_written = true;
                }
 
                internal void InternalClose ()