From e9ff61a03b7f9561f5a6d28fe129ce1dd33c6328 Mon Sep 17 00:00:00 2001 From: Gert Driesen Date: Sun, 21 Jun 2009 19:09:27 +0000 Subject: * HttpWebRequestTest.cs: Improved and enabled test for bug #510642. * WebConnectionStream.cs: Keep count of all bytes written, and perform write overflow check in both buffered and non-buffered writing (if not using chunked transfer encoding). Fixes bug #510642. svn path=/trunk/mcs/; revision=136570 --- mcs/class/System/Test/System.Net/ChangeLog | 4 + .../System/Test/System.Net/HttpWebRequestTest.cs | 179 ++++++++++++++++++++- 2 files changed, 175 insertions(+), 8 deletions(-) (limited to 'mcs/class/System/Test') diff --git a/mcs/class/System/Test/System.Net/ChangeLog b/mcs/class/System/Test/System.Net/ChangeLog index a857c66ed51..1ca61e686d0 100644 --- a/mcs/class/System/Test/System.Net/ChangeLog +++ b/mcs/class/System/Test/System.Net/ChangeLog @@ -1,3 +1,7 @@ +2009-06-20 Gert Driesen + + * HttpWebRequestTest.cs: Improved and enabled test for bug #510642. + 2009-06-20 Gert Driesen * SocketResponder.cs: Made a little more robust. diff --git a/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs b/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs index dfab0a31e6f..704914741b0 100644 --- a/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs +++ b/mcs/class/System/Test/System.Net/HttpWebRequestTest.cs @@ -612,36 +612,199 @@ namespace MonoTests.System.Net } [Test] // bug #510642 - [Category ("NotWorking")] public void GetRequestStream_Write_Overflow () { IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8001); string url = "http://" + IPAddress.Loopback.ToString () + ":8001/test/"; + // buffered, non-chunked using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { responder.Start (); - HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url); + HttpWebRequest req; + Stream rs; + byte [] buffer; + + req = (HttpWebRequest) WebRequest.Create (url); req.ProtocolVersion = HttpVersion.Version11; req.Method = "POST"; - req.Timeout = 200; + req.Timeout = 1000; req.ReadWriteTimeout = 100; req.ContentLength = 2; - Stream rs = req.GetRequestStream (); + rs = req.GetRequestStream (); + rs.WriteByte (0x2c); - byte [] buffer = new byte [] { 0x2a, 0x2c, 0x1d }; + buffer = new byte [] { 0x2a, 0x1d }; try { - rs.Write (buffer, 0, 3); - Assert.Fail ("#1"); + rs.Write (buffer, 0, buffer.Length); + Assert.Fail ("#A1"); + } catch (ProtocolViolationException ex) { + // Bytes to be written to the stream exceed + // Content-Length bytes size specified + Assert.IsNull (ex.InnerException, "#A2"); + Assert.IsNotNull (ex.Message, "#A3"); + } finally { + req.Abort (); + } + + req = (HttpWebRequest) WebRequest.Create (url); + req.ProtocolVersion = HttpVersion.Version11; + req.Method = "POST"; + req.Timeout = 1000; + req.ReadWriteTimeout = 100; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + + buffer = new byte [] { 0x2a, 0x2c, 0x1d }; + try { + rs.Write (buffer, 0, buffer.Length); + Assert.Fail ("#B1"); + } catch (ProtocolViolationException ex) { + // Bytes to be written to the stream exceed + // Content-Length bytes size specified + Assert.IsNull (ex.InnerException, "#B2"); + Assert.IsNotNull (ex.Message, "#B3"); + } finally { + req.Abort (); + } + } + + // buffered, chunked + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req; + Stream rs; + byte [] buffer; + + /* + req = (HttpWebRequest) WebRequest.Create (url); + req.ProtocolVersion = HttpVersion.Version11; + req.Method = "POST"; + req.SendChunked = true; + req.Timeout = 1000; + req.ReadWriteTimeout = 100; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + rs.WriteByte (0x2c); + + buffer = new byte [] { 0x2a, 0x1d }; + rs.Write (buffer, 0, buffer.Length); + req.Abort (); + */ + + req = (HttpWebRequest) WebRequest.Create (url); + req.ProtocolVersion = HttpVersion.Version11; + req.Method = "POST"; + req.SendChunked = true; + req.Timeout = 1000; + req.ReadWriteTimeout = 100; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + + buffer = new byte [] { 0x2a, 0x2c, 0x1d }; + rs.Write (buffer, 0, buffer.Length); + req.Abort (); + } + + // non-buffered, non-chunked + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req; + Stream rs; + byte [] buffer; + + req = (HttpWebRequest) WebRequest.Create (url); + req.AllowWriteStreamBuffering = false; + req.ProtocolVersion = HttpVersion.Version11; + req.Method = "POST"; + req.Timeout = 1000; + req.ReadWriteTimeout = 100; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + rs.WriteByte (0x2c); + + buffer = new byte [] { 0x2a, 0x1d }; + try { + rs.Write (buffer, 0, buffer.Length); + Assert.Fail ("#C1"); } catch (ProtocolViolationException ex) { // Bytes to be written to the stream exceed // Content-Length bytes size specified - Assert.IsNull (ex.InnerException, "#2"); + Assert.IsNull (ex.InnerException, "#C2"); Assert.IsNotNull (ex.Message, "#3"); } finally { req.Abort (); } + + req = (HttpWebRequest) WebRequest.Create (url); + req.AllowWriteStreamBuffering = false; + req.ProtocolVersion = HttpVersion.Version11; + req.Method = "POST"; + req.Timeout = 1000; + req.ReadWriteTimeout = 100; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + + buffer = new byte [] { 0x2a, 0x2c, 0x1d }; + try { + rs.Write (buffer, 0, buffer.Length); + Assert.Fail ("#D1"); + } catch (ProtocolViolationException ex) { + // Bytes to be written to the stream exceed + // Content-Length bytes size specified + Assert.IsNull (ex.InnerException, "#D2"); + Assert.IsNotNull (ex.Message, "#D3"); + } finally { + req.Abort (); + } + } + + // non-buffered, chunked + using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) { + responder.Start (); + + HttpWebRequest req; + Stream rs; + byte [] buffer; + + req = (HttpWebRequest) WebRequest.Create (url); + req.AllowWriteStreamBuffering = false; + req.ProtocolVersion = HttpVersion.Version11; + req.Method = "POST"; + req.SendChunked = true; + req.Timeout = 1000; + req.ReadWriteTimeout = 100; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + rs.WriteByte (0x2c); + + buffer = new byte [] { 0x2a, 0x1d }; + rs.Write (buffer, 0, buffer.Length); + req.Abort (); + + req = (HttpWebRequest) WebRequest.Create (url); + req.AllowWriteStreamBuffering = false; + req.ProtocolVersion = HttpVersion.Version11; + req.Method = "POST"; + req.SendChunked = true; + req.Timeout = 1000; + req.ReadWriteTimeout = 100; + req.ContentLength = 2; + + rs = req.GetRequestStream (); + + buffer = new byte [] { 0x2a, 0x2c, 0x1d }; + rs.Write (buffer, 0, buffer.Length); + req.Abort (); } } -- cgit v1.2.3