2 // HttpListener2Test.cs
3 // - Unit tests for System.Net.HttpListener - connection testing
6 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Collections.Generic;
32 using System.Globalization;
35 using System.Net.Sockets;
37 using System.Threading;
38 using NUnit.Framework;
40 // ***************************************************************************************
41 // NOTE: when adding prefixes, make then unique per test, as MS might take 'some time' to
42 // unregister it even after explicitly closing the listener.
43 // ***************************************************************************************
44 namespace MonoTests.System.Net {
47 [Ignore ("The class HttpListener is not supported")]
49 public class HttpListener2Test {
50 public class MyNetworkStream : NetworkStream {
51 public MyNetworkStream (Socket sock) : base (sock, true)
55 public Socket GetSocket ()
61 public static HttpListener CreateAndStartListener (string prefix)
63 HttpListener listener = new HttpListener ();
64 listener.Prefixes.Add (prefix);
69 public static HttpListener CreateAndStartListener (string prefix, AuthenticationSchemes authSchemes)
71 HttpListener listener = new HttpListener ();
72 listener.AuthenticationSchemes = authSchemes;
73 listener.Prefixes.Add (prefix);
78 public static MyNetworkStream CreateNS (int port)
80 return CreateNS (port, 5000);
83 public static MyNetworkStream CreateNS (int port, int timeout_ms)
85 Socket sock = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
86 sock.Connect (new IPEndPoint (IPAddress.Loopback, port));
87 sock.SendTimeout = timeout_ms;
88 sock.ReceiveTimeout = timeout_ms;
89 return new MyNetworkStream (sock);
92 public static void Send (Stream stream, string str)
94 byte [] bytes = Encoding.ASCII.GetBytes (str);
95 stream.Write (bytes, 0, bytes.Length);
98 public static string Receive (Stream stream, int size)
100 byte [] bytes = new byte [size];
101 int nread = stream.Read (bytes, 0, size);
102 return Encoding.ASCII.GetString (bytes, 0, nread);
105 public static string ReceiveWithTimeout (Stream stream, int size, int timeout, out bool timed_out)
107 byte [] bytes = new byte [size];
108 IAsyncResult ares = stream.BeginRead (bytes, 0, size, null, null);
109 timed_out = !ares.AsyncWaitHandle.WaitOne (timeout, false);
112 int nread = stream.EndRead (ares);
113 return Encoding.ASCII.GetString (bytes, 0, nread);
116 public static HttpListenerContext GetContextWithTimeout (HttpListener listener, int timeout, out bool timed_out)
118 IAsyncResult ares = listener.BeginGetContext (null, null);
119 timed_out = !ares.AsyncWaitHandle.WaitOne (timeout, false);
122 return listener.EndGetContext (ares);
128 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test1/")) {
129 NetworkStream ns = CreateNS (9000);
130 Send (ns, "GET / HTTP/1.1\r\n\r\n"); // No host
131 string response = Receive (ns, 512);
133 Assert.IsTrue (response.StartsWith ("HTTP/1.1 400"));
140 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test2/")) {
141 NetworkStream ns = CreateNS (9000);
142 Send (ns, "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n"); // no prefix
143 string response = Receive (ns, 512);
145 Assert.IsTrue (response.StartsWith ("HTTP/1.1 400"));
152 StringBuilder bad = new StringBuilder ();
153 for (int i = 0; i < 33; i++){
155 bad.Append ((char) i);
175 foreach (char b in bad.ToString ()){
176 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test3/")) {
177 NetworkStream ns = CreateNS (9000);
178 Send (ns, String.Format ("MA{0} / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n", b)); // bad method
180 string response = Receive (ns, 512);
182 Assert.AreEqual (true, response.StartsWith ("HTTP/1.1 400"), String.Format ("Failed on {0}", (int) b));
190 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test4/")) {
191 NetworkStream ns = CreateNS (9000);
192 Send (ns, "POST /test4/ HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n"); // length required
193 string response = Receive (ns, 512);
195 Assert.IsTrue (response.StartsWith ("HTTP/1.1 411"));
202 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test5/")) {
203 NetworkStream ns = CreateNS (9000);
204 Send (ns, "POST / HTTP/1.1\r\nHost: 127.0.0.1\r\nTransfer-Encoding: pepe\r\n\r\n"); // not implemented
205 string response = Receive (ns, 512);
207 Assert.IsTrue (response.StartsWith ("HTTP/1.1 501"));
214 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test6/")) {
215 NetworkStream ns = CreateNS (9000);
216 // not implemented! This is against the RFC. Should be a bad request/length required
217 Send (ns, "POST /test6/ HTTP/1.1\r\nHost: 127.0.0.1\r\nTransfer-Encoding: identity\r\n\r\n");
218 string response = Receive (ns, 512);
220 Assert.IsTrue (response.StartsWith ("HTTP/1.1 501"));
227 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test7/")) {
228 NetworkStream ns = CreateNS (9000);
229 Send (ns, "POST /test7/ HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
230 HttpListenerContext ctx = listener.GetContext ();
231 Send (ctx.Response.OutputStream, "%%%OK%%%");
232 ctx.Response.Close ();
233 string response = Receive (ns, 1024);
235 Assert.IsTrue (response.StartsWith ("HTTP/1.1 200"));
236 Assert.IsTrue (-1 != response.IndexOf ("Transfer-Encoding: chunked"));
243 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test8/")) {
244 NetworkStream ns = CreateNS (9000);
245 // Just like Test7, but 1.0
246 Send (ns, "POST /test8/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
247 HttpListenerContext ctx = listener.GetContext ();
248 Send (ctx.Response.OutputStream, "%%%OK%%%");
249 ctx.Response.Close ();
250 string response = Receive (ns, 512);
252 Assert.IsTrue (response.StartsWith ("HTTP/1.1 200"));
253 Assert.IsTrue (-1 == response.IndexOf ("Transfer-Encoding: chunked"));
260 // 1.0 + "Transfer-Encoding: chunked"
261 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test9/")) {
262 NetworkStream ns = CreateNS (9000);
263 Send (ns, "POST /test9/ HTTP/1.0\r\nHost: 127.0.0.1\r\nTransfer-Encoding: chunked\r\n\r\n3\r\n123\r\n0\r\n\r\n");
265 string response = ReceiveWithTimeout (ns, 512, 1000, out timeout);
267 Assert.IsFalse (timeout);
268 Assert.IsTrue (response.StartsWith ("HTTP/1.1 411"));
273 public void Test10 ()
275 // Same as Test9, but now we shutdown the socket for sending.
276 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test10/")) {
277 MyNetworkStream ns = CreateNS (9000);
278 Send (ns, "POST /test10/ HTTP/1.0\r\nHost: 127.0.0.1\r\nTransfer-Encoding: chunked\r\n\r\n3\r\n123\r\n0\r\n\r\n");
279 ns.GetSocket ().Shutdown (SocketShutdown.Send);
281 string response = ReceiveWithTimeout (ns, 512, 1000, out timeout);
283 Assert.IsFalse (timeout);
284 Assert.IsTrue (response.StartsWith ("HTTP/1.1 411"));
289 public void Test11 ()
292 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test11/")) {
293 MyNetworkStream ns = CreateNS (9000);
294 Send (ns, "POST /test11/ HTTP/0.9\r\nHost: 127.0.0.1\r\n\r\n123");
295 ns.GetSocket ().Shutdown (SocketShutdown.Send);
296 string input = Receive (ns, 512);
298 Assert.IsTrue (input.StartsWith ("HTTP/1.1 400"));
303 public void Test12 ()
306 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test12/")) {
307 MyNetworkStream ns = CreateNS (9000);
308 Send (ns, "POST /test12/ HTTP/0.9\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
309 ns.GetSocket ().Shutdown (SocketShutdown.Send);
310 string input = Receive (ns, 512);
312 Assert.IsTrue (input.StartsWith ("HTTP/1.1 400"));
317 public void Test13 ()
320 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test13/")) {
321 MyNetworkStream ns = CreateNS (9000);
322 Send (ns, "GEt /test13/ HTTP/0.9\r\nHost: 127.0.0.1\r\n\r\n");
323 ns.GetSocket ().Shutdown (SocketShutdown.Send);
324 string input = Receive (ns, 512);
326 Assert.IsTrue (input.StartsWith ("HTTP/1.1 400"));
330 HttpListenerRequest test14_request;
331 ManualResetEvent test_evt;
334 public void Test14 ()
336 using (HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test14/")) {
337 MyNetworkStream ns = CreateNS (9000);
338 Send (ns, "POST /test14/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
339 HttpListenerContext c = listener.GetContext ();
340 test14_request = c.Request;
341 test_evt = new ManualResetEvent (false);
342 Thread thread = new Thread (ReadToEnd);
344 if (test_evt.WaitOne (3000, false) == false) {
347 Assert.IsTrue (false, "Timed out");
352 Assert.AreEqual ("123", read_to_end, "Did not get the expected input.");
359 using (StreamReader r = new StreamReader (test14_request.InputStream)) {
360 read_to_end = r.ReadToEnd ();
366 public void Test15 ()
368 // 2 separate writes -> 2 packets. Body size > 8kB
369 HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test15/");
370 MyNetworkStream ns = CreateNS (9000);
371 Send (ns, "POST /test15/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 8888\r\n\r\n");
373 string data = new string ('a', 8888);
375 HttpListenerContext c = listener.GetContext ();
376 HttpListenerRequest req = c.Request;
377 using (StreamReader r = new StreamReader (req.InputStream)) {
378 read_to_end = r.ReadToEnd ();
380 Assert.AreEqual (read_to_end.Length, data.Length, "Wrong length");
381 Assert.IsTrue (data == read_to_end, "Wrong data");
387 public void Test16 ()
389 // 1 single write with headers + body (size > 8kB)
390 HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test16/");
391 MyNetworkStream ns = CreateNS (9000);
392 StringBuilder sb = new StringBuilder ();
393 sb.Append ("POST /test16/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 8888\r\n\r\n");
394 string eights = new string ('b', 8888);
396 string data = sb.ToString ();
398 HttpListenerContext c = listener.GetContext ();
399 HttpListenerRequest req = c.Request;
400 using (StreamReader r = new StreamReader (req.InputStream)) {
401 read_to_end = r.ReadToEnd ();
403 Assert.AreEqual (read_to_end.Length, read_to_end.Length, "Wrong length");
404 Assert.IsTrue (eights == read_to_end, "Wrong data");
410 public void Test17 ()
412 HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/test17/");
413 NetworkStream ns = CreateNS (9000);
414 Send (ns, "RANDOM /test17/ HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
415 HttpListenerContext ctx = listener.GetContext ();
416 Send (ctx.Response.OutputStream, "%%%OK%%%");
417 ctx.Response.Close ();
418 string response = Receive (ns, 1024);
421 Assert.IsTrue (response.StartsWith ("HTTP/1.1 200"));
422 Assert.IsTrue (-1 != response.IndexOf ("Transfer-Encoding: chunked"));
426 public void Test_MultipleClosesOnOuputStreamAllowed ()
428 HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/MultipleCloses/");
429 NetworkStream ns = CreateNS (9000);
430 Send (ns, "GET /MultipleCloses/ HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n");
432 HttpListenerContext ctx = listener.GetContext ();
433 ctx.Response.OutputStream.Close ();
434 ctx.Response.OutputStream.Close ();
435 ctx.Response.OutputStream.Close ();
436 ctx.Response.Close ();
442 NetworkStream ns = CreateNS (9000);
443 Send (ns, "GET /SendCookie/ HTTP/1.1\r\nHost: 127.0.0.1\r\n"+
444 "Cookie:$Version=\"1\"; "+
445 "Cookie1=Value1; $Path=\"/\"; "+
446 "CookieM=ValueM; $Path=\"/p2\"; $Domain=\"test\"; $Port=\"99\";"+
447 "Cookie2=Value2; $Path=\"/foo\";"+
456 public void ReceiveCookiesFromClient ()
458 HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/SendCookie/");
459 Thread clientThread = new Thread (new ThreadStart (SendCookie));
460 clientThread.Start ();
462 HttpListenerContext context = listener.GetContext();
463 HttpListenerRequest request = context.Request;
465 Assert.AreEqual (3, request.Cookies.Count, "#1");
466 foreach (Cookie c in request.Cookies) {
467 if (c.Name == "Cookie1") {
468 Assert.AreEqual ("Value1", c.Value, "#2");
469 Assert.AreEqual ("\"/\"", c.Path, "#3");
470 Assert.AreEqual (0, c.Port.Length, "#4");
471 Assert.AreEqual (0, c.Domain.Length, "#5");
472 } else if (c.Name == "CookieM") {
473 Assert.AreEqual ("ValueM", c.Value, "#6");
474 Assert.AreEqual ("\"/p2\"", c.Path, "#7");
475 Assert.AreEqual ("\"99\"", c.Port, "#8");
476 Assert.AreEqual ("\"test\"", c.Domain, "#9");
477 } else if (c.Name == "Cookie2") {
478 Assert.AreEqual ("Value2", c.Value, "#10");
479 Assert.AreEqual ("\"/foo\"", c.Path, "#11");
480 Assert.AreEqual (0, c.Port.Length, "#12");
481 Assert.AreEqual (0, c.Domain.Length, "#13");
483 Assert.Fail ("Invalid cookie name " + c.Name);
489 private object _lock = new Object();
490 private string cookieResponse;
492 void ReceiveCookie () {
494 NetworkStream ns = CreateNS (9000);
495 Send (ns, "GET /ReceiveCookie/ HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n");
496 cookieResponse = Receive (ns, 512);
501 public void SendCookiestoClient ()
503 HttpListener listener = CreateAndStartListener ("http://127.0.0.1:9000/ReceiveCookie/");
504 Thread clientThread = new Thread (new ThreadStart (ReceiveCookie));
505 clientThread.Start ();
507 HttpListenerContext context = listener.GetContext();
508 HttpListenerRequest request = context.Request;
509 HttpListenerResponse response = context.Response;
511 Cookie cookie = new Cookie ();
512 cookie.Name = "Name0";
513 cookie.Value = "Value0";
514 cookie.Domain = "blue";
515 cookie.Path = "/path/";
516 cookie.Port = "\"80\"";
518 response.Cookies.Add (cookie);
520 string responseString = "<HTML><BODY>----</BODY></HTML>";
521 byte[] buffer = Encoding.UTF8.GetBytes(responseString);
522 response.ContentLength64 = buffer.Length;
523 Stream output = response.OutputStream;
524 output.Write(buffer, 0, buffer.Length);
529 bool foundCookie = false;
530 foreach (String str in cookieResponse.Split ('\n')) {
531 if (!str.StartsWith ("Set-Cookie"))
533 Dictionary<string, String> dic = new Dictionary<string, String>();
534 foreach (String p in str.Substring (str.IndexOf (":") + 1).Split (';')) {
535 String[] parts = p.Split('=');
536 dic.Add (parts [0].Trim (), parts [1].Trim ());
538 Assert.AreEqual ("Value0", dic ["Name0"], "#1");
539 Assert.AreEqual ("blue", dic ["Domain"], "#2");
540 Assert.AreEqual ("\"/path/\"", dic ["Path"], "#3");
541 Assert.AreEqual ("\"80\"", dic ["Port"], "#4");
542 Assert.AreEqual ("1", dic ["Version"], "#5");
546 Assert.IsTrue (foundCookie, "#6");
553 public void MultiResponses ()
555 Thread srv = new Thread (new ThreadStart (EchoServer));
559 for (int i = 0; i < 10; i++) {
560 string payload = string.Format (CultureInfo.InvariantCulture,
563 HttpWebRequest req = (HttpWebRequest) WebRequest.Create (
564 "http://localhost:8888/foobar/");
565 req.ServicePoint.Expect100Continue = false;
566 req.ServicePoint.UseNagleAlgorithm = false;
568 StreamWriter w = new StreamWriter (req.GetRequestStream ());
569 w.WriteLine (payload);
572 HttpWebResponse resp = (HttpWebResponse) req.GetResponse ();
573 StreamReader r = new StreamReader (resp.GetResponseStream ());
574 Assert.AreEqual ("Hello, " + payload + "!", r.ReadToEnd ().Trim ());
584 HttpListener listener = new HttpListener ();
585 listener.Prefixes.Add ("http://*:8888/foobar/");
588 manualReset = new ManualResetEvent (false);
590 IAsyncResult result = listener.BeginGetContext (
591 new AsyncCallback (EchoCallback), listener);
592 manualReset.WaitOne ();
595 void EchoCallback (IAsyncResult result)
597 HttpListener listener = (HttpListener) result.AsyncState;
598 HttpListenerContext context = listener.EndGetContext (result);
599 HttpListenerRequest req = context.Request;
600 StreamReader r = new StreamReader (req.InputStream);
601 string reqBody = r.ReadToEnd ().Trim ();
603 HttpListenerResponse resp = context.Response;
604 StreamWriter o = new StreamWriter (resp.OutputStream);
605 o.WriteLine ("Hello, " + reqBody + "!");
608 listener.BeginGetContext (new AsyncCallback (EchoCallback), listener);
611 private ManualResetEvent manualReset;
616 public class HttpListenerBugs {
618 public void TestNonChunkedAsync ()
620 HttpListener listener = HttpListener2Test.CreateAndStartListener ("http://127.0.0.1:9123/");
622 listener.BeginGetContext (callback, listener);
624 HttpListener2Test.MyNetworkStream ns = HttpListener2Test.CreateNS (9123);
625 string message = "<script>\n"+
626 " <!-- register the blueprint for our show-headers service -->\n"+
627 " <action verb=\"POST\" path=\"/host/register\">\n" +
629 " <assembly>dream.tutorial.show-headers</assembly>\n" +
630 " <class>MindTouch.Dream.Tutorial.ShowHeadersService</class>\n" +
634 " <!-- instantiate it -->\n" +
635 " <action verb=\"POST\" path=\"/host/start\">\n" +
637 " <path>show-headers</path>\n" +
638 " <class>MindTouch.Dream.Tutorial.ShowHeadersService</class>\n" +
642 string s = String.Format ("POST / HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Length: {0}\r\n\r\n{1}",
643 message.Length, message);
644 HttpListener2Test.Send (ns, s);
646 string response = HttpListener2Test.ReceiveWithTimeout (ns, 1024, 3000, out timedout);
649 Assert.IsFalse (timedout);
652 void callback (IAsyncResult ar)
654 HttpListener l = (HttpListener) ar.AsyncState;
656 HttpListenerContext c = l.EndGetContext (ar);
657 HttpListenerRequest request = c.Request;
659 StreamReader r = new StreamReader (request.InputStream);
660 string sr =r.ReadToEnd ();
661 HttpListener2Test.Send (c.Response.OutputStream, "Miguel is love");
666 // As it turns out, when we closed the OutputStream,
667 // we were not shutting down the connection, which was
668 // a documented pattern to close the connection
671 public void Test_MultipleConnections ()
673 HttpListener listener = HttpListener2Test.CreateAndStartListener ("http://127.0.0.1:9000/multiple/");
676 NetworkStream ns = HttpListener2Test.CreateNS (9000);
677 HttpListener2Test.Send (ns, "POST /multiple/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
678 HttpListenerContext ctx = listener.GetContext ();
679 HttpListener2Test.Send (ctx.Response.OutputStream, "%%%OK%%%");
680 ctx.Response.OutputStream.Close ();
681 string response = HttpListener2Test.Receive (ns, 1024);
685 ns = HttpListener2Test.CreateNS (9000);
686 HttpListener2Test.Send (ns, "POST /multiple/ HTTP/1.0\r\nHost: 127.0.0.1\r\nContent-Length: 3\r\n\r\n123");
687 ctx = listener.GetContext ();
688 HttpListener2Test.Send (ctx.Response.OutputStream, "%%%OK%%%");
689 ctx.Response.OutputStream.Close ();
690 response = HttpListener2Test.Receive (ns, 1024);
697 // Test case for bug 341443, an pretty old bug, filed on November of 2007.
700 public void Test_HostInUri ()
702 var wait = new ManualResetEvent (false);
703 var wait2 = new ManualResetEvent (false);
705 Thread t = new Thread (delegate (object a) {
708 NetworkStream ns = HttpListener2Test.CreateNS (9145);
709 HttpListener2Test.Send (ns, "GET http://www.google.com/ HTTP/1.1\r\nHost: www.google.com\r\nContent-Length: 3\r\n\r\n123456");
716 HttpListener listener = HttpListener2Test.CreateAndStartListener ("http://*:9145/");
718 HttpListenerContext ctx = listener.GetContext ();
720 Assert.AreEqual ("http://www.google.com:9145/", ctx.Request.Url.ToString ());
721 Assert.AreEqual ("http://www.google.com/", ctx.Request.RawUrl);
727 [Test] // bug #513849
728 public void ClosePort ()
730 var h = new HttpListener ();
731 h.Prefixes.Add ("http://127.0.0.1:8080/");
733 h.BeginGetContext (null, null);
735 TcpListener t = new TcpListener (IPAddress.Parse ("127.0.0.1"), 8080);