* HttpListener2Test.cs: Added test for multiple responses.
[mono.git] / mcs / class / System / Test / System.Net / HttpListener2Test.cs
index 09681d6345cc215f2b8a90b23eef09ec3aab5078..952546c8aa7d085530e9b3e6b76d0397c90770bb 100644 (file)
@@ -29,6 +29,7 @@
 #if NET_2_0
 using System;
 using System.Collections.Generic;
+using System.Globalization;
 using System.IO;
 using System.Net;
 using System.Net.Sockets;
@@ -65,6 +66,15 @@ namespace MonoTests.System.Net {
                        return listener;
                }
 
+               public static HttpListener CreateAndStartListener (string prefix, AuthenticationSchemes authSchemes)
+               {
+                       HttpListener listener = new HttpListener ();
+                       listener.AuthenticationSchemes = authSchemes;
+                       listener.Prefixes.Add (prefix);
+                       listener.Start ();
+                       return listener;
+               }
+
                public static MyNetworkStream CreateNS (int port)
                {
                        Socket sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
@@ -401,6 +411,21 @@ namespace MonoTests.System.Net {
                        Assert.IsTrue (-1 != response.IndexOf ("Transfer-Encoding: chunked"));
                }
 
+               [Test]
+               public void Test_MultipleClosesOnOuputStreamAllowed ()
+               {
+                       HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/MultipleCloses/");
+                       NetworkStream ns = CreateNS (9000);
+                       Send (ns, "GET /MultipleCloses/ HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n");
+
+                       HttpListenerContext ctx = listener.GetContext ();
+                       ctx.Response.OutputStream.Close ();
+                       ctx.Response.OutputStream.Close ();
+                       ctx.Response.OutputStream.Close ();
+                       ctx.Response.Close ();
+                       listener.Close ();
+               }
+       
                void SendCookie ()
                {
                        NetworkStream ns = CreateNS (9000);
@@ -512,6 +537,68 @@ namespace MonoTests.System.Net {
 
                        listener.Close ();
                }
+
+               [Test]
+               public void MultiResponses ()
+               {
+                       Thread srv = new Thread (new ThreadStart (EchoServer));
+                       srv.Start ();
+                       Thread.Sleep (200);
+
+                       for (int i = 0; i < 10; i++) {
+                               string payload = string.Format (CultureInfo.InvariantCulture,
+                                       "Client{0}", i);
+
+                               HttpWebRequest req = (HttpWebRequest) WebRequest.Create (
+                                       "http://localhost:8888/foobar/");
+                               req.ServicePoint.Expect100Continue = false;
+                               req.ServicePoint.UseNagleAlgorithm = false;
+                               req.Method = "POST";
+                               StreamWriter w = new StreamWriter (req.GetRequestStream ());
+                               w.WriteLine (payload);
+                               w.Close ();
+
+                               HttpWebResponse resp = (HttpWebResponse) req.GetResponse ();
+                               StreamReader r = new StreamReader (resp.GetResponseStream ());
+                               Assert.AreEqual ("Hello, " + payload + "!", r.ReadToEnd ().Trim ());
+                               r.Close ();
+                       }
+
+                       manualReset.Set ();
+                       srv.Join ();
+               }
+
+               void EchoServer ()
+               {
+                       HttpListener listener = new HttpListener ();
+                       listener.Prefixes.Add ("http://*:8888/foobar/");
+                       listener.Start ();
+
+                       manualReset = new ManualResetEvent (false);
+
+                       IAsyncResult result = listener.BeginGetContext (
+                               new AsyncCallback (EchoCallback), listener);
+                       manualReset.WaitOne ();
+               }
+
+               void EchoCallback (IAsyncResult result)
+               {
+                       HttpListener listener = (HttpListener) result.AsyncState;
+                       HttpListenerContext context = listener.EndGetContext (result);
+                       HttpListenerRequest req = context.Request;
+                       StreamReader r = new StreamReader (req.InputStream);
+                       string reqBody = r.ReadToEnd ().Trim ();
+
+                       HttpListenerResponse resp = context.Response;
+                       StreamWriter o = new StreamWriter (resp.OutputStream);
+                       o.WriteLine ("Hello, " + reqBody + "!");
+                       o.Close ();
+
+                       listener.BeginGetContext (new AsyncCallback (EchoCallback), listener);
+               }
+
+               private ManualResetEvent manualReset;
+
        }
 
        [TestFixture]