[Mono-bugs] [Bug 78316][Nor] New - Incorrect behavior of
System.Net.HttpListenerResponse.Close
bugzilla-daemon at bugzilla.ximian.com
bugzilla-daemon at bugzilla.ximian.com
Sat May 6 16:37:21 EDT 2006
Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.
Changed by horst.reiterer at mind-breeze.com.
http://bugzilla.ximian.com/show_bug.cgi?id=78316
--- shadow/78316 2006-05-06 16:37:21.000000000 -0400
+++ shadow/78316.tmp.8152 2006-05-06 16:37:21.000000000 -0400
@@ -0,0 +1,145 @@
+Bug#: 78316
+Product: Mono: Class Libraries
+Version: 1.1
+OS: other
+OS Details: Red Hat Enterprise Linux 4
+Status: NEW
+Resolution:
+Severity:
+Priority: Normal
+Component: System
+AssignedTo: mono-bugs at ximian.com
+ReportedBy: horst.reiterer at mind-breeze.com
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: Incorrect behavior of System.Net.HttpListenerResponse.Close
+
+According to the Framework SDK documentation,
+System.Net.HttpListenerResponse.Close "sends the response to the client and
+releases the resources held by this HttpListenerResponse instance". The
+Mono implementation however requires the caller to write zero bytes to the
+output stream if a zero-length response is desired. As a result, the
+client-side fails.
+
+The enclosed testcase can be used to reproduce the problem.
+A proposed fix is attached.
+
+Steps to reproduce the problem:
+1. mono server.exe
+2. mono client.exe
+
+Actual Results:
+
+HttpListenerResponse.Close does not send the response to the client. The
+client fails with an exception:
+
+Unhandled Exception: System.Net.WebException: Error getting response stream
+(ReadDone2): ReceiveFailure ---> System.Exception:
+ at System.Net.WebConnection.HandleError ()
+ at System.Net.WebConnection.ReadDone ()
+ at System.MulticastDelegate.invoke_void_IAsyncResult ()
+ at System.Net.Sockets.Socket+SocketAsyncResult.Complete ()
+ at System.Net.Sockets.Socket+Worker.Receive ()
+ at System.MulticastDelegate.invoke_void ()
+in <0x000ad> System.Net.WebConnection:HandleError (WebExceptionStatus st,
+System.Exception e, System.String where)--- End of inner exception stack
+trace ---
+
+in <0x00158> System.Net.HttpWebRequest:EndGetResponse (IAsyncResult
+asyncResult)
+in <0x00047> System.Net.HttpWebRequest:GetResponse ()
+in <0x000c0> Client:Main ()
+
+Expected Results:
+
+If the response body is empty because the caller did not write to the
+output stream, HttpListenerResponse must send a valid HTTP response with an
+empty response body and a content length of zero or a chunked response
+containing an empty chunk.
+
+How often does this happen?
+
+100 out of 100 times
+
+Additional Information:
+
+The following testcase can be used to reproduce the problem. Compiling
+server.cs without additional defines triggers the issue. Compiling with
+/d:WORKAROUND enables a workaround.
+
+client.cs:
+
+using System;
+using System.IO;
+using System.Net;
+
+public class Client
+{
+ public static void Main()
+ {
+ Uri uri = new Uri("http://localhost:8080/");
+ byte[] buf = new byte[100];
+
+ while (true) {
+ WebRequest req = WebRequest.CreateDefault(uri);
+ req.Method = "POST";
+ req.ContentLength = buf.Length;
+
+ Stream stream = req.GetRequestStream();
+ stream.Write(buf, 0, buf.Length);
+ stream.Close();
+
+ WebResponse response = req.GetResponse();
+ response.Close();
+ }
+ }
+}
+
+server.cs:
+
+using System;
+using System.IO;
+using System.Net;
+
+public class Server
+{
+ public static void Main()
+ {
+ HttpListener listener = new HttpListener();
+ listener.Prefixes.Add("http://localhost:8080/");
+ listener.Start();
+
+ byte[] buf = new byte[100];
+ long start = DateTime.UtcNow.Ticks;
+ int count = 0;
+
+ while (true) {
+ HttpListenerContext ctx = listener.GetContext();
+ Stream stream = ctx.Request.InputStream;
+ stream.Read(buf, 0, 100);
+ stream.Close();
+
+ HttpListenerResponse response = ctx.Response;
+ response.StatusCode = 200;
+ response.ContentLength64 = 0;
+
+#if WORKAROUND
+ Stream outputStream = response.OutputStream;
+ outputStream.Write(buf, 0, 0);
+ outputStream.Close();
+#endif
+ response.Close();
+
+ long end = DateTime.UtcNow.Ticks;
+ count++;
+
+ if (end - start >= 10000000L) {
+ Console.WriteLine("Requests/s: " + count);
+ start = end;
+ count = 0;
+ }
+ }
+ }
+}
More information about the mono-bugs
mailing list