Merge pull request #2799 from BrzVlad/fix-conc-card-clean
[mono.git] / mcs / class / System / Test / System.Net / HttpWebRequestTest.cs
index 21ba2faffdc80932b46ded288e45cf91d484c752..2776bb742b4d995fbab276275a1dd56428375e70 100644 (file)
@@ -25,6 +25,7 @@ using System.Security.Cryptography;
 using System.Security.Cryptography.X509Certificates;
 using System.Text;
 using System.Threading;
+using System.Reflection;
 using Mono.Security.Authenticode;
 #if !MOBILE
 using Mono.Security.Protocol.Tls;
@@ -99,9 +100,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Timeout = 2000;
@@ -118,8 +117,6 @@ namespace MonoTests.System.Net
                                response.Close ();
 
                                rs.Close ();
-
-                               responder.Stop ();
                        }
                }
 
@@ -249,26 +246,24 @@ namespace MonoTests.System.Net
                        string url = "http://" + ep.ToString () + "/test/";
 
                        foreach (DictionaryEntry de in methods) {
-                               SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler));
-                               responder.Start ();
-
-                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
-                               req.Method = (string) de.Key;
-                               req.Timeout = 2000;
-                               req.ReadWriteTimeout = 2000;
-                               req.KeepAlive = false;
-                               Stream rs = req.GetRequestStream ();
-                               rs.Close ();
-                               using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
-                                       StreamReader sr = new StreamReader (resp.GetResponseStream (),
-                                               Encoding.UTF8);
-                                       string line = sr.ReadLine ();
-                                       sr.Close ();
-                                       Assert.AreEqual (((string) de.Value) + " /test/ HTTP/1.1",
-                                               line, req.Method);
-                                       resp.Close ();
+                               using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
+                                       HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
+                                       req.Method = (string) de.Key;
+                                       req.Timeout = 2000;
+                                       req.ReadWriteTimeout = 2000;
+                                       req.KeepAlive = false;
+                                       Stream rs = req.GetRequestStream ();
+                                       rs.Close ();
+                                       using (HttpWebResponse resp = (HttpWebResponse) req.GetResponse ()) {
+                                               StreamReader sr = new StreamReader (resp.GetResponseStream (),
+                                                       Encoding.UTF8);
+                                               string line = sr.ReadLine ();
+                                               sr.Close ();
+                                               Assert.AreEqual (((string) de.Value) + " /test/ HTTP/1.1",
+                                                       line, req.Method);
+                                               resp.Close ();
+                                       }
                                }
-                               responder.Stop ();
                        }
                }
 
@@ -278,9 +273,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest request;
 
                                request = (HttpWebRequest) WebRequest.Create (url);
@@ -317,9 +310,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req;
                                Stream rs;
                                IAsyncResult ar;
@@ -373,9 +364,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req;
 
                                req = (HttpWebRequest) WebRequest.Create (url);
@@ -470,9 +459,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Abort ();
@@ -497,9 +484,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Abort ();
@@ -524,9 +509,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.BeginGetRequestStream (null, null);
@@ -552,9 +535,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                IAsyncResult ar = req.BeginGetRequestStream (null, null);
@@ -582,9 +563,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Timeout = 2000;
@@ -608,9 +587,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Timeout = 2000;
                                req.ReadWriteTimeout = 2000;
@@ -641,9 +618,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Timeout = 2000;
@@ -665,9 +640,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Abort ();
@@ -693,9 +666,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req;
                                Stream rs;
 
@@ -762,9 +733,7 @@ namespace MonoTests.System.Net
                        string url = "http://" + ep.ToString () + "/test/";
 
                        // buffered, non-chunked
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req;
                                Stream rs;
                                byte [] buffer;
@@ -814,9 +783,7 @@ namespace MonoTests.System.Net
                        }
 
                        // buffered, chunked
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req;
                                Stream rs;
                                byte [] buffer;
@@ -852,9 +819,7 @@ namespace MonoTests.System.Net
                        }
 
                        // non-buffered, non-chunked
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req;
                                Stream rs;
                                byte [] buffer;
@@ -906,9 +871,7 @@ namespace MonoTests.System.Net
                        }
 
                        // non-buffered, chunked
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req;
                                Stream rs;
                                byte [] buffer;
@@ -972,9 +935,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Abort ();
@@ -997,12 +958,10 @@ namespace MonoTests.System.Net
                [Ignore ("This does not timeout any more. That's how MS works when reading small responses")]
                public void ReadTimeout ()
                {
-                       IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8764);
+                       IPEndPoint localEP = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + localEP.ToString () + "/original/";
 
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => RedirectRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.AllowAutoRedirect = false;
@@ -1023,20 +982,17 @@ namespace MonoTests.System.Net
                                                Assert.AreEqual (WebExceptionStatus.Timeout, ex.Status, "#5");
                                        }
                                }
-                               responder.Stop ();
                        }
                }
 
                [Test] // bug #324300
                public void AllowAutoRedirect ()
                {
-                       IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8765);
+                       IPEndPoint localEP = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + localEP.ToString () + "/original/";
 
                        // allow autoredirect
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => RedirectRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Timeout = 2000;
@@ -1055,13 +1011,10 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("GET", resp.Method, "#A3");
                                        Assert.AreEqual ("LOOKS OK", body, "#A4");
                                }
-                               responder.Stop ();
                        }
 
                        // do not allow autoredirect
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => RedirectRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.AllowAutoRedirect = false;
@@ -1075,19 +1028,16 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual (url, resp.ResponseUri.ToString (), "#B2");
                                        Assert.AreEqual ("POST", resp.Method, "#B3");
                                }
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void PostAndRedirect_NoCL ()
                {
-                       IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8769);
+                       IPEndPoint localEP = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + localEP.ToString () + "/original/";
 
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => RedirectRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Timeout = 2000;
@@ -1106,19 +1056,16 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("GET", resp.Method, "#A3");
                                        Assert.AreEqual ("LOOKS OK", body, "#A4");
                                }
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void PostAndRedirect_CL ()
                {
-                       IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8770);
+                       IPEndPoint localEP = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + localEP.ToString () + "/original/";
 
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => RedirectRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Timeout = 2000;
@@ -1137,19 +1084,16 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("GET", resp.Method, "#A3");
                                        Assert.AreEqual ("LOOKS OK", body, "#A4");
                                }
-                               responder.Stop ();
                        }
                }
 
                [Test]
                public void PostAnd401 ()
                {
-                       IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8771);
+                       IPEndPoint localEP = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + localEP.ToString () + "/original/";
 
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (RedirectRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => RedirectRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Timeout = 2000;
@@ -1168,7 +1112,6 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("GET", resp.Method, "#A3");
                                        Assert.AreEqual ("LOOKS OK", body, "#A4");
                                }
-                               responder.Stop ();
                        }
                }
 
@@ -1176,13 +1119,11 @@ namespace MonoTests.System.Net
                [Category ("NotWorking")]
                public void InternalServerError ()
                {
-                       IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8766);
+                       IPEndPoint localEP = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + localEP.ToString () + "/original/";
 
                        // POST
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (InternalErrorHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => InternalErrorHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Timeout = 2000;
@@ -1205,14 +1146,10 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("POST", webResponse.Method, "#A7");
                                        webResponse.Close ();
                                }
-
-                               responder.Stop ();
                        }
 
                        // GET
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (InternalErrorHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => InternalErrorHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "GET";
                                req.Timeout = 2000;
@@ -1232,8 +1169,6 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("GET", webResponse.Method, "#B6");
                                        webResponse.Close ();
                                }
-
-                               responder.Stop ();
                        }
                }
 
@@ -1241,13 +1176,11 @@ namespace MonoTests.System.Net
                [Category ("NotWorking")] // #B3 fails; we get a SocketException: An existing connection was forcibly closed by the remote host
                public void NoContentLength ()
                {
-                       IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8767);
+                       IPEndPoint localEP = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + localEP.ToString () + "/original/";
 
                        // POST
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (NoContentLengthHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => NoContentLengthHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
                                req.Timeout = 2000;
@@ -1287,14 +1220,10 @@ namespace MonoTests.System.Net
                                        HttpWebResponse webResponse = ex.Response as HttpWebResponse;
                                        Assert.IsNull (webResponse, "#A11");
                                }
-
-                               responder.Stop ();
                        }
 
                        // GET
-                       using (SocketResponder responder = new SocketResponder (localEP, new SocketRequestHandler (NoContentLengthHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (localEP, s => NoContentLengthHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "GET";
                                req.Timeout = 2000;
@@ -1316,8 +1245,6 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("GET", webResponse.Method, "#B6");
                                        webResponse.Close ();
                                }
-
-                               responder.Stop ();
                        }
                }
 
@@ -1327,9 +1254,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/moved/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (VerbEchoHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => VerbEchoHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "WhatEver";
                                req.KeepAlive = false;
@@ -1350,8 +1275,6 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("WhatEver", resp.Method, "#3");
                                        Assert.AreEqual ("WhatEver", body, "#4");
                                }
-
-                               responder.Stop ();
                        }
                }
 
@@ -1362,9 +1285,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (NotModifiedSinceHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => NotModifiedSinceHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "GET";
                                req.KeepAlive = false;
@@ -1392,8 +1313,6 @@ namespace MonoTests.System.Net
 
                                TimeSpan elapsed = DateTime.Now - start;
                                Assert.IsTrue (elapsed.TotalMilliseconds < 2000, "#4");
-
-                               responder.Stop ();
                        }
                }
 
@@ -1467,7 +1386,11 @@ namespace MonoTests.System.Net
                        Thread.Sleep (three_seconds_in_milliseconds * 3);
 
                        if (timeoutWorker.End == null) {
+#if MONO_FEATURE_THREAD_ABORT
                                thread.Abort ();
+#else
+                               thread.Interrupt ();
+#endif
                                Assert.Fail ("Thread finished after triple the timeout specified has passed");
                        }
 
@@ -1494,16 +1417,12 @@ namespace MonoTests.System.Net
                [Test] // 1st possible case of https://bugzilla.novell.com/show_bug.cgi?id=MONO74177
                public void TestTimeoutPropertyWithServerThatExistsAndRespondsButTooLate ()
                {
-                       var ep = new IPEndPoint (IPAddress.Loopback, 8123);
+                       var ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep + "/foobar/";
 
                        using (var responder = new SocketResponder (ep, TimeOutHandler))
                        {
-                               responder.Start ();
-
                                TestTimeOut (url, WebExceptionStatus.Timeout);
-
-                               responder.Stop ();
                        }
                }
 
@@ -2306,9 +2225,9 @@ namespace MonoTests.System.Net
                [Test]
                public void TestLargeDataReading ()
                {
-                       const int internalBufferSize = 16 * 1024 * 1024;
+                       int near2GBStartPosition = rand.Next (int.MaxValue - 500, int.MaxValue);
                        AutoResetEvent readyGetLastPortionEvent = new AutoResetEvent (false);
-                       AssertionException testException = null;
+                       Exception testException = null;
 
                        DoRequest (
                        (request, waitHandle) =>
@@ -2320,30 +2239,24 @@ namespace MonoTests.System.Net
                                        request.Timeout = timeoutMs;
                                        request.ReadWriteTimeout = timeoutMs;
 
-                                       if (Type.GetType ("Mono.Runtime") == null)
-                                               //significantly increases speed of test on MS .NET, because default value       
-                                               //of receive buffer is about 8192 bytes. doesn't implemented now on Mono.
-                                               request.ServicePoint.ReceiveBufferSize = internalBufferSize;
-
                                        WebResponse webResponse = request.GetResponse ();
                                        Stream webResponseStream = webResponse.GetResponseStream ();
                                        Assert.IsNotNull (webResponseStream, null, "#1");
-
-                                       int totalRead = 0;
-                                       byte[] readBuffer = new byte[internalBufferSize];
-
-                                       while (totalRead < int.MaxValue) {
-                                               int read = webResponseStream.Read (readBuffer, 0, readBuffer.Length);
-                                               Assert.Greater (read, 0, "#2");
-                                               totalRead += read;
-                                               Assert.Greater (totalRead, 0, "#3");
-                                       }
-
-                                       Assert.AreEqual (totalRead, int.MaxValue, "#4");
+                                       
+                                       Type webConnectionStreamType = webResponseStream.GetType ();
+                                       FieldInfo totalReadField = webConnectionStreamType.GetField ("totalRead", BindingFlags.NonPublic | BindingFlags.Instance);
+                                       Assert.IsNotNull (totalReadField, "#2");
+                                       totalReadField.SetValue (webResponseStream, near2GBStartPosition);
+                                       
+                                       byte[] readBuffer = new byte[int.MaxValue - near2GBStartPosition];
+                                       Assert.AreEqual (webResponseStream.Read (readBuffer, 0, readBuffer.Length), readBuffer.Length, "#3");
                                        readyGetLastPortionEvent.Set ();
-                                       Assert.Greater (webResponseStream.Read (readBuffer, 0, readBuffer.Length), 0, "#5");
+                                       Assert.IsTrue (webResponseStream.Read (readBuffer, 0, readBuffer.Length) > 0);
+                                       readyGetLastPortionEvent.Set ();
+                                       
+                                       webResponse.Close();
                                }
-                               catch (AssertionException e)
+                               catch (Exception e)
                                {
                                        testException = e;
                                }
@@ -2355,31 +2268,19 @@ namespace MonoTests.System.Net
                        processor =>
                        {
                                processor.Request.InputStream.Close ();
-
+                               
                                HttpListenerResponse response = processor.Response;
                                response.SendChunked = true;
-
+                               
                                Stream outputStream = response.OutputStream;
-
-                               long totalWritten = 0;
-                               byte[] writeBuffer = new byte[internalBufferSize];
-
-                               while (totalWritten < int.MaxValue) {
-                                       int size;
-
-                                       if (totalWritten + writeBuffer.Length < int.MaxValue)
-                                               size = writeBuffer.Length;
-                                       else
-                                               size = (int) (int.MaxValue - totalWritten);
-
-                                       outputStream.Write (writeBuffer, 0, size);
-                                       totalWritten += size;
-                               }
-
+                               var writeBuffer = new byte[int.MaxValue - near2GBStartPosition];
+                               outputStream.Write (writeBuffer, 0, writeBuffer.Length);
                                readyGetLastPortionEvent.WaitOne ();
                                outputStream.Write (writeBuffer, 0, writeBuffer.Length);
-                               response.Close ();
-                       }, 60 * 1000);
+                               readyGetLastPortionEvent.WaitOne ();
+                               
+                               response.Close();
+                       });
 
                        if (testException != null)
                                throw testException;
@@ -2399,7 +2300,7 @@ namespace MonoTests.System.Net
                                Assert.Fail ("Test hung");
                }
 
-               void DoRequest (Action<HttpWebRequest, EventWaitHandle> request, Action<HttpListenerContext> processor, int timeoutMs = 10000)
+               void DoRequest (Action<HttpWebRequest, EventWaitHandle> request, Action<HttpListenerContext> processor)
                {
                        int port = NetworkHelpers.FindFreePort ();
 
@@ -2414,7 +2315,7 @@ namespace MonoTests.System.Net
 
                                ThreadPool.QueueUserWorkItem ((o) => request (client, completed [1]));
 
-                               if (!WaitHandle.WaitAll (completed, timeoutMs))
+                               if (!WaitHandle.WaitAll (completed, 10000))
                                        Assert.Fail ("Test hung.");
                        }
                }
@@ -2784,9 +2685,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString ();
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (CookieRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => CookieRequestHandler (s))) {
                                CookieContainer container = new CookieContainer ();
                                container.Add(new Uri (url), new Cookie ("foo", "bar"));
                                HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url);
@@ -2803,9 +2702,7 @@ namespace MonoTests.System.Net
                                Assert.AreEqual ("foo=bar", response.Headers.Get("Set-Cookie"), "#02");
                        }
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (CookieRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => CookieRequestHandler (s))) {
                                CookieContainer container = new CookieContainer ();
                                HttpWebRequest request = (HttpWebRequest) WebRequest.Create (url);
                                request.CookieContainer = container;
@@ -2872,9 +2769,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -2902,9 +2797,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -2931,9 +2824,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -2955,9 +2846,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -2979,9 +2868,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3003,9 +2890,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3027,9 +2912,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3056,9 +2939,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3084,9 +2965,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3108,9 +2987,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3136,9 +3013,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3164,9 +3039,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3194,9 +3067,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3224,9 +3095,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3254,9 +3123,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3284,9 +3151,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3314,9 +3179,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3343,9 +3206,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";
 
@@ -3372,9 +3233,7 @@ namespace MonoTests.System.Net
                        IPEndPoint ep = NetworkHelpers.LocalEphemeralEndPoint ();
                        string url = "http://" + ep.ToString () + "/test/";
 
-                       using (SocketResponder responder = new SocketResponder (ep, new SocketRequestHandler (HttpWebRequestTest.EchoRequestHandler))) {
-                               responder.Start ();
-
+                       using (SocketResponder responder = new SocketResponder (ep, s => HttpWebRequestTest.EchoRequestHandler (s))) {
                                HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
                                req.Method = "POST";