2003-12-04 Gonzalo Paniagua Javier <gonzalo@ximian.com>
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Thu, 4 Dec 2003 21:49:43 +0000 (21:49 -0000)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Thu, 4 Dec 2003 21:49:43 +0000 (21:49 -0000)
* HttpApplication.cs: ThreadAbortException is ok on Redirect.
* HttpContext.cs: added TimeoutPossible property.
* HttpResponse.cs: throw ThreadAbortException if End () is called within
a step in which is possible to timeout.

Fixes bug #51703.

svn path=/trunk/mcs/; revision=20791

mcs/class/System.Web/System.Web/ChangeLog
mcs/class/System.Web/System.Web/HttpApplication.cs
mcs/class/System.Web/System.Web/HttpContext.cs
mcs/class/System.Web/System.Web/HttpResponse.cs

index d8f08b934ad0204b91da0c6703770502c230352d..a117139daad0b15098a0f760071fa376cd426072 100644 (file)
@@ -1,3 +1,12 @@
+2003-12-04  Gonzalo Paniagua Javier <gonzalo@ximian.com>
+
+       * HttpApplication.cs: ThreadAbortException is ok on Redirect.
+       * HttpContext.cs: added TimeoutPossible property.
+       * HttpResponse.cs: throw ThreadAbortException if End () is called within
+       a step in which is possible to timeout.
+
+       Fixes bug #51703.
+
 2003-12-04  Jackson Harper <jackson@ximian.com>
 
        * HttpRequest.cs: Cleanup method.
index dfefde01ba02b55c358fb59c1430298fac51ae39..5151e59c92fbac03190d547b31d63cf086a03c26 100644 (file)
@@ -679,11 +679,15 @@ namespace System.Web
 
                                        readysync = state.CompletedSynchronously;
                                } catch (ThreadAbortException obj) {
-                                       StepTimeout timeout = obj.ExceptionState as StepTimeout;
-                                       if (timeout != null) {
+                                       object o = obj.ExceptionState;
+                                       Type type = (o != null) ? o.GetType () : null;
+                                       if (type == typeof (StepTimeout)) {
                                                Thread.ResetAbort ();
                                                lasterror = new HttpException ("The request timed out.");
                                                _app.CompleteRequest ();
+                                       } else if (type == typeof (StepCompleteRequest)) {
+                                               Thread.ResetAbort ();
+                                               _app.CompleteRequest ();
                                        }
                                } catch (Exception obj) {
                                        lasterror = obj;
@@ -1058,5 +1062,10 @@ namespace System.Web
                }
 #endregion Properties
        }
+
+       // Used in HttpResponse.End ()
+       class StepCompleteRequest
+       {
+       }
 }
 
index 9fe39200b63e4de29feb9f9f8b4c9f5377f8bb0b..2be19efac22360bce142ad861d3efe5566979f87 100644 (file)
@@ -249,6 +249,10 @@ namespace System.Web
                        }
                }
 
+               internal bool TimeoutPossible {
+                       get { return (Interlocked.CompareExchange (ref timeoutPossible, 1, 1) == 1); }
+               }
+               
                internal void BeginTimeoutPossible ()
                {
                        timeoutPossible = 1;
index 3e79c9f29610b5679fd72d0cede5a592c6ec5f2d..57bd316d48f223c318f29b4e3db38033bd0d4e36 100644 (file)
@@ -710,6 +710,9 @@ namespace System.Web
                        if (_bEnded)
                                return;
 
+                       if (_Context.TimeoutPossible)
+                               Thread.CurrentThread.Abort (new StepCompleteRequest ());
+
                        Flush ();
                        _bEnded = true;
                        _Context.ApplicationInstance.CompleteRequest ();