Merge pull request #3008 from lateralusX/jlorenss/win-x64-shutdown-crash
[mono.git] / mcs / class / System / Test / System.Net / HttpWebRequestTest.cs
index c4296c39e2755329f64c12f3444e9b82699d3dd3..a289a6b5e76e2ac19ac91ec28b641c358d2fcf10 100644 (file)
@@ -6,6 +6,7 @@
 //   Martin Willemoes Hansen (mwh@sysrq.dk)
 //   Gonzalo Paniagua Javier (gonzalo@ximian.com)
 //   Andres G. Aragoneses (andres@7digital.com)
+//   Bogdanov Kirill (bogdanov@macroscop.com)
 //
 // (C) 2003 Martin Willemoes Hansen
 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com
@@ -24,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;
@@ -98,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;
@@ -117,8 +117,6 @@ namespace MonoTests.System.Net
                                response.Close ();
 
                                rs.Close ();
-
-                               responder.Stop ();
                        }
                }
 
@@ -248,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 ();
                        }
                }
 
@@ -277,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);
@@ -316,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;
@@ -372,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);
@@ -469,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 ();
@@ -496,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 ();
@@ -523,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);
@@ -551,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);
@@ -581,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;
@@ -607,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;
@@ -640,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;
@@ -664,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 ();
@@ -692,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;
 
@@ -761,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;
@@ -813,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;
@@ -851,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;
@@ -905,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;
@@ -971,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 ();
@@ -996,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;
@@ -1022,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;
@@ -1054,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;
@@ -1074,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;
@@ -1105,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;
@@ -1136,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;
@@ -1167,7 +1112,6 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("GET", resp.Method, "#A3");
                                        Assert.AreEqual ("LOOKS OK", body, "#A4");
                                }
-                               responder.Stop ();
                        }
                }
 
@@ -1175,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;
@@ -1204,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;
@@ -1231,8 +1169,6 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("GET", webResponse.Method, "#B6");
                                        webResponse.Close ();
                                }
-
-                               responder.Stop ();
                        }
                }
 
@@ -1240,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;
@@ -1286,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;
@@ -1315,8 +1245,6 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("GET", webResponse.Method, "#B6");
                                        webResponse.Close ();
                                }
-
-                               responder.Stop ();
                        }
                }
 
@@ -1326,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;
@@ -1349,8 +1275,6 @@ namespace MonoTests.System.Net
                                        Assert.AreEqual ("WhatEver", resp.Method, "#3");
                                        Assert.AreEqual ("WhatEver", body, "#4");
                                }
-
-                               responder.Stop ();
                        }
                }
 
@@ -1361,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;
@@ -1391,8 +1313,6 @@ namespace MonoTests.System.Net
 
                                TimeSpan elapsed = DateTime.Now - start;
                                Assert.IsTrue (elapsed.TotalMilliseconds < 2000, "#4");
-
-                               responder.Stop ();
                        }
                }
 
@@ -1466,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");
                        }
 
@@ -1493,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 ();
                        }
                }
 
@@ -1798,7 +1718,9 @@ namespace MonoTests.System.Net
                                Where = "first write";
                                StreamWriter writer = new StreamWriter (ns, Encoding.ASCII);
                                writer.Write (  "HTTP/1.1 401 Unauthorized\r\n" +
-                                               "WWW-Authenticate: NTLM\r\n" +
+                                       "WWW-Authenticate: ignore\r\n" +
+                                       "WWW-Authenticate: NTLM\r\n" +
+                                       "WWW-Authenticate: ignore,K\r\n" +
                                                "Content-Length: 5\r\n\r\nWRONG");
 
                                writer.Flush ();
@@ -2301,6 +2223,70 @@ namespace MonoTests.System.Net
 
                        return;
                }
+               
+               [Test]
+               public void TestLargeDataReading ()
+               {
+                       int near2GBStartPosition = rand.Next (int.MaxValue - 500, int.MaxValue);
+                       AutoResetEvent readyGetLastPortionEvent = new AutoResetEvent (false);
+                       Exception testException = null;
+
+                       DoRequest (
+                       (request, waitHandle) =>
+                       {
+                               try
+                               {
+                                       const int timeoutMs = 5000;
+
+                                       request.Timeout = timeoutMs;
+                                       request.ReadWriteTimeout = timeoutMs;
+
+                                       WebResponse webResponse = request.GetResponse ();
+                                       Stream webResponseStream = webResponse.GetResponseStream ();
+                                       Assert.IsNotNull (webResponseStream, null, "#1");
+                                       
+                                       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.IsTrue (webResponseStream.Read (readBuffer, 0, readBuffer.Length) > 0);
+                                       readyGetLastPortionEvent.Set ();
+                                       
+                                       webResponse.Close();
+                               }
+                               catch (Exception e)
+                               {
+                                       testException = e;
+                               }
+                               finally
+                               {
+                                       waitHandle.Set ();
+                               }
+                       },
+                       processor =>
+                       {
+                               processor.Request.InputStream.Close ();
+                               
+                               HttpListenerResponse response = processor.Response;
+                               response.SendChunked = true;
+                               
+                               Stream outputStream = response.OutputStream;
+                               var writeBuffer = new byte[int.MaxValue - near2GBStartPosition];
+                               outputStream.Write (writeBuffer, 0, writeBuffer.Length);
+                               readyGetLastPortionEvent.WaitOne ();
+                               outputStream.Write (writeBuffer, 0, writeBuffer.Length);
+                               readyGetLastPortionEvent.WaitOne ();
+                               
+                               response.Close();
+                       });
+
+                       if (testException != null)
+                               throw testException;
+               }
 
                void DoRequest (Action<HttpWebRequest, EventWaitHandle> request)
                {
@@ -2701,9 +2687,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);
@@ -2720,9 +2704,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;
@@ -2789,9 +2771,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";
 
@@ -2819,9 +2799,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";
 
@@ -2848,9 +2826,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";
 
@@ -2872,9 +2848,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";
 
@@ -2896,9 +2870,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";
 
@@ -2920,9 +2892,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";
 
@@ -2944,9 +2914,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";
 
@@ -2973,9 +2941,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";
 
@@ -3001,9 +2967,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";
 
@@ -3025,9 +2989,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";
 
@@ -3053,9 +3015,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";
 
@@ -3081,9 +3041,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";
 
@@ -3111,9 +3069,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";
 
@@ -3141,9 +3097,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";
 
@@ -3171,9 +3125,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";
 
@@ -3201,9 +3153,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";
 
@@ -3231,9 +3181,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";
 
@@ -3260,9 +3208,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";
 
@@ -3289,9 +3235,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";