//\r
\r
using NUnit.Framework;\r
+using MonoTests.Helpers;
using System;\r
using System.Net;\r
+using System.Threading;
using System.Collections;\r
using System.Runtime.Serialization;\r
using Socks = System.Net.Sockets;\r
{\r
internal TestWebRequest3 () { }\r
}\r
+
+ [Test] // Covers #41477
+ public void TestReceiveCancelation ()
+ {
+ var uri = "http://localhost:" + NetworkHelpers.FindFreePort () + "/";
+
+ HttpListener listener = new HttpListener ();
+ listener.Prefixes.Add (uri);
+ listener.Start ();
+
+ try {
+ for (var i = 0; i < 10; i++) {
+ var request = WebRequest.CreateHttp (uri);
+ request.Method = "GET";
+
+ var tokenSource = new CancellationTokenSource ();
+ tokenSource.Token.Register(() => request.Abort ());
+
+ var responseTask = request.GetResponseAsync ();
+
+ var context = listener.GetContext ();
+ byte[] outBuffer = new byte[8 * 1024];
+ context.Response.OutputStream.WriteAsync (outBuffer, 0, outBuffer.Length);
+
+ Assert.IsTrue (responseTask.Wait (1000), "Timeout #1");
+
+ WebResponse response = responseTask.Result;
+ var stream = response.GetResponseStream ();
+
+ byte[] buffer = new byte[8 * 1024];
+ var taskRead = stream.ReadAsync (buffer, 0, buffer.Length, tokenSource.Token);
+
+ tokenSource.Cancel ();
+
+ Assert.IsTrue (taskRead.Wait (1000), "Timeout #2");
+
+ var byteRead = taskRead.Result;
+ }
+ } catch (AggregateException ex) {
+ var webEx = ex.InnerException as WebException;
+ Assert.IsNotNull(webEx, "Inner exception is not a WebException");
+ Assert.AreEqual (webEx.Status, WebExceptionStatus.RequestCanceled);
+ }
+
+ listener.Close ();
+ }
}\r
\r
}\r