[tests] Avoid "Address already in use"
[mono.git] / mcs / class / System / Test / System.Net / HttpWebResponseTest.cs
index 936de69c895d3d64c6afdc1e73c5ced77d1b102b..b76bd8b9a540c78d07220da3c91f55ec72c3bd2c 100644 (file)
@@ -14,6 +14,8 @@ using System.Net;
 using System.Net.Sockets;
 using System.Text;
 
+using MonoTests.Helpers;
+
 using NUnit.Framework;
 
 namespace MonoTests.System.Net
@@ -24,10 +26,10 @@ namespace MonoTests.System.Net
                [Test]
                public void CharacterSet_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -48,18 +50,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void Close_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -71,18 +71,16 @@ namespace MonoTests.System.Net
                                HttpWebResponse resp = (HttpWebResponse) req.GetResponse ();
                                ((IDisposable) resp).Dispose ();
                                resp.Close ();
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void ContentEncoding_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -103,18 +101,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void ContentLength_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -127,18 +123,16 @@ namespace MonoTests.System.Net
                                ((IDisposable) resp).Dispose ();
 
                                Assert.AreEqual (9, resp.ContentLength);
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void ContentType_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -159,18 +153,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void Cookies_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -201,18 +193,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#B4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#B5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void GetResponseHeader_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -233,18 +223,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void GetResponseStream_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -265,18 +253,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void Headers_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -288,7 +274,6 @@ namespace MonoTests.System.Net
                                HttpWebResponse resp = (HttpWebResponse) req.GetResponse ();
                                ((IDisposable) resp).Dispose ();
 
-#if NET_2_0
                                WebHeaderCollection headers = resp.Headers;
                                Assert.AreEqual (6, headers.Count, "#1");
                                Assert.AreEqual ("9", headers ["Content-Length"], "#2");
@@ -297,29 +282,16 @@ namespace MonoTests.System.Net
                                Assert.AreEqual ("Wed, 08 Jan 2003 23:11:55 GMT", headers ["Last-Modified"], "#5");
                                Assert.AreEqual ("UserID=Miguel,StoreProfile=true", headers ["Set-Cookie"], "#6");
                                Assert.AreEqual ("Mono/Test", headers ["Server"], "#7");
-#else
-                               try {
-                                       WebHeaderCollection headers = resp.Headers;
-                                       Assert.Fail ("#1:" + headers);
-                               } catch (ObjectDisposedException ex) {
-                                       Assert.AreEqual (typeof (ObjectDisposedException), ex.GetType (), "#2");
-                                       Assert.IsNull (ex.InnerException, "#3");
-                                       Assert.IsNotNull (ex.Message, "#4");
-                                       Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
-                               }
-#endif
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void LastModified_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -340,18 +312,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void Method_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -372,18 +342,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void ProtocolVersion_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -404,18 +372,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void ResponseUri_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -436,18 +402,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void Server_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -468,18 +432,16 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void StatusCode_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -492,18 +454,16 @@ namespace MonoTests.System.Net
                                ((IDisposable) resp).Dispose ();
 
                                Assert.AreEqual (HttpStatusCode.OK, resp.StatusCode);
-
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void StatusDescription_Disposed ()
                {
-                       IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 8000);
-                       string url = "http://" + IPAddress.Loopback.ToString () + ":8000/test/";
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (new IPEndPoint (IPAddress.Loopback, 8000), new SocketRequestHandler (FullResponseHandler))) {
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (FullResponseHandler))) {
                                responder.Start ();
 
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
@@ -524,12 +484,10 @@ namespace MonoTests.System.Net
                                        Assert.IsNotNull (ex.Message, "#4");
                                        Assert.AreEqual (typeof (HttpWebResponse).FullName, ex.ObjectName, "#5");
                                }
-
-                               responder.Stop ();
                        }
                }
 
-               static byte [] FullResponseHandler (Socket socket)
+               internal static byte [] FullResponseHandler (Socket socket)
                {
                        StringWriter sw = new StringWriter ();
                        sw.NewLine = "\r\n";
@@ -548,4 +506,666 @@ namespace MonoTests.System.Net
                        return Encoding.UTF8.GetBytes (sw.ToString ());
                }
        }
+
+       [TestFixture]
+       public class HttpResponseStreamTest
+       {
+               [Test]
+               public void BeginRead_Buffer_Null ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = null;
+                                       try {
+                                               try {
+                                                       rs.BeginRead (buffer, 0, 0, null, null);
+                                                       Assert.Fail ("#A1");
+                                               } catch (ArgumentNullException ex) {
+                                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
+                                                       Assert.IsNull (ex.InnerException, "#A3");
+                                                       Assert.IsNotNull (ex.Message, "#A4");
+                                                       Assert.AreEqual ("buffer", ex.ParamName, "#A5");
+                                               }
+
+                                               // read full response
+                                               buffer = new byte [24];
+                                               Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length));
+
+                                               buffer = null;
+                                               try {
+                                                       rs.BeginRead (buffer, 0, 0, null, null);
+                                                       Assert.Fail ("#B1");
+                                               } catch (ArgumentNullException ex) {
+                                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
+                                                       Assert.IsNull (ex.InnerException, "#B3");
+                                                       Assert.IsNotNull (ex.Message, "#B4");
+                                                       Assert.AreEqual ("buffer", ex.ParamName, "#B5");
+                                               }
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void BeginWrite ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = new byte [5];
+                                       try {
+                                               rs.BeginWrite (buffer, 0, buffer.Length, null, null);
+                                               Assert.Fail ("#1");
+                                       } catch (NotSupportedException ex) {
+                                               // The stream does not support writing
+                                               Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
+                                               Assert.IsNull (ex.InnerException, "#3");
+                                               Assert.IsNotNull (ex.Message, "#4");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               [Category ("NotWorking")]
+               public void CanRead ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       try {
+                                               Assert.IsTrue (rs.CanRead, "#1");
+                                               rs.Close ();
+                                               Assert.IsFalse (rs.CanRead, "#2");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void CanSeek ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       try {
+                                               Assert.IsFalse (rs.CanSeek, "#1");
+                                               rs.Close ();
+                                               Assert.IsFalse (rs.CanSeek, "#2");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test] // bug #324182
+               public void CanTimeout ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       try {
+                                               Assert.IsTrue (rs.CanTimeout, "#1");
+                                               rs.Close ();
+                                               Assert.IsTrue (rs.CanTimeout, "#2");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void CanWrite ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       try {
+                                               Assert.IsFalse (rs.CanWrite, "#1");
+                                               rs.Close ();
+                                               Assert.IsFalse (rs.CanWrite, "#2");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void Read ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = new byte [5];
+                                       try {
+                                               Assert.AreEqual (1, rs.Read (buffer, 4, 1), "#A1");
+                                               Assert.AreEqual (new byte [] { 0x00, 0x00, 0x00, 0x00, 0x3c }, buffer, "#A2");
+                                               Assert.AreEqual (2, rs.Read (buffer, 0, 2), "#B1");
+                                               Assert.AreEqual (new byte [] { 0x64, 0x75, 0x00, 0x00, 0x3c }, buffer, "#B2");
+                                               Assert.AreEqual (4, rs.Read (buffer, 1, 4), "#C1");
+                                               Assert.AreEqual (new byte [] { 0x64, 0x6d, 0x6d, 0x79, 0x20 }, buffer, "#C2");
+                                               Assert.AreEqual (2, rs.Read (buffer, 0, 3), "#D1");
+                                               Assert.AreEqual (new byte [] { 0x2f, 0x3e, 0x6d, 0x79, 0x20 }, buffer, "#D2");
+                                               Assert.AreEqual (0, rs.Read (buffer, 1, 3), "#E1");
+                                               Assert.AreEqual (new byte [] { 0x2f, 0x3e, 0x6d, 0x79, 0x20 }, buffer, "#E2");
+                                               Assert.AreEqual (0, rs.Read (buffer, buffer.Length, 0), "#G1");
+                                               Assert.AreEqual (new byte [] { 0x2f, 0x3e, 0x6d, 0x79, 0x20 }, buffer, "#G2");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void Read_Buffer_Null ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = null;
+                                       try {
+                                               try {
+                                                       rs.Read (buffer, 0, 0);
+                                                       Assert.Fail ("#A1");
+                                               } catch (ArgumentNullException ex) {
+                                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#A2");
+                                                       Assert.IsNull (ex.InnerException, "#A3");
+                                                       Assert.IsNotNull (ex.Message, "#A4");
+                                                       Assert.AreEqual ("buffer", ex.ParamName, "#A5");
+                                               }
+
+                                               // read full response
+                                               buffer = new byte [24];
+                                               Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length));
+
+                                               buffer = null;
+                                               try {
+                                                       rs.Read (buffer, 0, 0);
+                                                       Assert.Fail ("#B1");
+                                               } catch (ArgumentNullException ex) {
+                                                       Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#B2");
+                                                       Assert.IsNull (ex.InnerException, "#B3");
+                                                       Assert.IsNotNull (ex.Message, "#B4");
+                                                       Assert.AreEqual ("buffer", ex.ParamName, "#B5");
+                                               }
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void Read_Count_Negative ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = new byte [5];
+                                       try {
+                                               try {
+                                                       rs.Read (buffer, 1, -1);
+                                                       Assert.Fail ("#A1");
+                                               } catch (ArgumentOutOfRangeException ex) {
+                                                       // Specified argument was out of the range of valid values
+                                                       Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                                                       Assert.IsNull (ex.InnerException, "#A3");
+                                                       Assert.IsNotNull (ex.Message, "#A4");
+                                                       Assert.AreEqual ("size", ex.ParamName, "#A5");
+                                               }
+
+                                               // read full response
+                                               buffer = new byte [24];
+                                               Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length));
+
+                                               try {
+                                                       rs.Read (buffer, 1, -1);
+                                                       Assert.Fail ("#B1");
+                                               } catch (ArgumentOutOfRangeException ex) {
+                                                       // Specified argument was out of the range of valid values
+                                                       Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
+                                                       Assert.IsNull (ex.InnerException, "#B3");
+                                                       Assert.IsNotNull (ex.Message, "#B4");
+                                                       Assert.AreEqual ("size", ex.ParamName, "#B5");
+                                               }
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void Read_Count_Overflow ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = new byte [5];
+                                       try {
+                                               try {
+                                                       rs.Read (buffer, buffer.Length - 2, 3);
+                                                       Assert.Fail ("#A1");
+                                               } catch (ArgumentOutOfRangeException ex) {
+                                                       // Specified argument was out of the range of valid values
+                                                       Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                                                       Assert.IsNull (ex.InnerException, "#A3");
+                                                       Assert.IsNotNull (ex.Message, "#A4");
+                                                       Assert.AreEqual ("size", ex.ParamName, "#A5");
+                                               }
+
+                                               // read full response
+                                               buffer = new byte [24];
+                                               Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length));
+
+                                               try {
+                                                       rs.Read (buffer, buffer.Length - 2, 3);
+                                                       Assert.Fail ("#B1");
+                                               } catch (ArgumentOutOfRangeException ex) {
+                                                       // Specified argument was out of the range of valid values
+                                                       Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
+                                                       Assert.IsNull (ex.InnerException, "#B3");
+                                                       Assert.IsNotNull (ex.Message, "#B4");
+                                                       Assert.AreEqual ("size", ex.ParamName, "#B5");
+                                               }
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void Read_Offset_Negative ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = new byte [5];
+                                       try {
+                                               try {
+                                                       rs.Read (buffer, -1, 0);
+                                                       Assert.Fail ("#A1");
+                                               } catch (ArgumentOutOfRangeException ex) {
+                                                       // Specified argument was out of the range of valid values
+                                                       Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                                                       Assert.IsNull (ex.InnerException, "#A3");
+                                                       Assert.IsNotNull (ex.Message, "#A4");
+                                                       Assert.AreEqual ("offset", ex.ParamName, "#A5");
+                                               }
+
+                                               // read full response
+                                               buffer = new byte [24];
+                                               Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length));
+
+                                               try {
+                                                       rs.Read (buffer, -1, 0);
+                                                       Assert.Fail ("#B1");
+                                               } catch (ArgumentOutOfRangeException ex) {
+                                                       // Specified argument was out of the range of valid values
+                                                       Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
+                                                       Assert.IsNull (ex.InnerException, "#B3");
+                                                       Assert.IsNotNull (ex.Message, "#B4");
+                                                       Assert.AreEqual ("offset", ex.ParamName, "#B5");
+                                               }
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void Read_Offset_Overflow ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = new byte [5];
+                                       try {
+                                               try {
+                                                       rs.Read (buffer, buffer.Length + 1, 0);
+                                                       Assert.Fail ("#A1");
+                                               } catch (ArgumentOutOfRangeException ex) {
+                                                       // Specified argument was out of the range of valid values
+                                                       Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
+                                                       Assert.IsNull (ex.InnerException, "#A3");
+                                                       Assert.IsNotNull (ex.Message, "#A4");
+                                                       Assert.AreEqual ("offset", ex.ParamName, "#A5");
+                                               }
+
+                                               // read full response
+                                               buffer = new byte [24];
+                                               Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length));
+
+                                               try {
+                                                       rs.Read (buffer, buffer.Length + 1, 0);
+                                                       Assert.Fail ("#B1");
+                                               } catch (ArgumentOutOfRangeException ex) {
+                                                       // Specified argument was out of the range of valid values
+                                                       Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
+                                                       Assert.IsNull (ex.InnerException, "#B3");
+                                                       Assert.IsNotNull (ex.Message, "#B4");
+                                                       Assert.AreEqual ("offset", ex.ParamName, "#B5");
+                                               }
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               [Category ("NotWorking")]
+               public void Read_Stream_Closed ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req;
+                               
+                               req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       rs.Close ();
+                                       try {
+                                               rs.Read (new byte [0], 0, 0);
+                                               Assert.Fail ("#A1");
+                                       } catch (WebException ex) {
+                                               // The request was aborted: The connection was closed unexpectedly
+                                               Assert.AreEqual (typeof (WebException), ex.GetType (), "#A2");
+                                               Assert.IsNull (ex.InnerException, "#A3");
+                                               Assert.IsNotNull (ex.Message, "#A4");
+                                               Assert.IsNull (ex.Response, "#A5");
+                                               Assert.AreEqual (WebExceptionStatus.ConnectionClosed, ex.Status, "#A6");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+
+                               req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = new byte [24];
+                                       Assert.AreEqual (9, rs.Read (buffer, 0, buffer.Length));
+                                       rs.Close ();
+                                       try {
+                                               rs.Read (new byte [0], 0, 0);
+                                               Assert.Fail ("#B1");
+                                       } catch (WebException ex) {
+                                               // The request was aborted: The connection was closed unexpectedly
+                                               Assert.AreEqual (typeof (WebException), ex.GetType (), "#B2");
+                                               Assert.IsNull (ex.InnerException, "#B3");
+                                               Assert.IsNotNull (ex.Message, "#B4");
+                                               Assert.IsNull (ex.Response, "#B5");
+                                               Assert.AreEqual (WebExceptionStatus.ConnectionClosed, ex.Status, "#B6");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void ReadTimeout ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       try {
+                                               Assert.AreEqual (2000, rs.ReadTimeout, "#1");
+                                               rs.Close ();
+                                               Assert.AreEqual (2000, rs.ReadTimeout, "#2");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void Write ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       byte [] buffer = new byte [5];
+                                       try {
+                                               rs.Write (buffer, 0, buffer.Length);
+                                               Assert.Fail ("#1");
+                                       } catch (NotSupportedException ex) {
+                                               // The stream does not support writing
+                                               Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
+                                               Assert.IsNull (ex.InnerException, "#3");
+                                               Assert.IsNotNull (ex.Message, "#4");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+
+               [Test]
+               public void WriteTimeout ()
+               {
+                       IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint();
+                       string url = "http://" + ep.ToString () + "/test/";
+
+                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebResponseTest.FullResponseHandler))) {
+                               responder.Start ();
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                               req.Method = "GET";
+                               req.Timeout = 2000;
+                               req.ReadWriteTimeout = 2000;
+                               req.KeepAlive = false;
+
+                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                       Stream rs = resp.GetResponseStream ();
+                                       try {
+                                               Assert.AreEqual (2000, rs.WriteTimeout, "#1");
+                                               rs.Close ();
+                                               Assert.AreEqual (2000, rs.WriteTimeout, "#2");
+                                       } finally {
+                                               rs.Close ();
+                                               req.Abort ();
+                                       }
+                               }
+                       }
+               }
+       }
 }