Constrain http request/response timeouts to int.MaxValue milliseconds
authorDavid Straw <strawd@hp>
Wed, 11 Jul 2012 17:51:59 +0000 (11:51 -0600)
committerDavid Straw <strawd@hp>
Wed, 11 Jul 2012 17:51:59 +0000 (11:51 -0600)
mcs/class/System.ServiceModel/System.ServiceModel.Channels.Http/HttpChannelListener.cs
mcs/class/System.ServiceModel/System.ServiceModel.Channels.Http/HttpListenerManager.cs

index 6a65919dd56f6317dbc9c758ee9f844e778e357f..17d5d814cab8d04b8af4dd97739d97f1252ff216 100644 (file)
@@ -88,8 +88,11 @@ namespace System.ServiceModel.Channels.Http
                        // HTTP channel could be accepted while there is no incoming request yet. The reply channel waits for the actual request.
                        // HTTP channel listeners do not accept more than one channel at a time.
                        DateTime start = DateTime.Now;
-                       accept_channel_handle.WaitOne (timeout - (DateTime.Now - start));
-                       accept_channel_handle.Reset ();
+                       TimeSpan waitTimeout = timeout - (DateTime.Now - start);
+                       if (waitTimeout.TotalMilliseconds > int.MaxValue)
+                               waitTimeout = TimeSpan.FromMilliseconds (int.MaxValue);
+                       accept_channel_handle.WaitOne (waitTimeout);
+                       accept_channel_handle.Reset (); 
                        TChannel ch = CreateChannel (timeout - (DateTime.Now - start));
                        ch.Closed += delegate {
                                accept_channel_handle.Set ();
index f65519b00f733abc300bb77e20b0957013321372..7d7759f08d1a3f3360034ea31a0343838fb0dd25 100644 (file)
@@ -96,7 +96,10 @@ namespace System.ServiceModel.Channels.Http
                        lock (ce.RetrieverLock) {
                                var q = ce.ContextQueue;
                                if (q.Count == 0) {
-                                       bool ret = ce.WaitHandle.WaitOne (timeout);
+                                       TimeSpan waitTimeout = timeout;
+                                       if (waitTimeout.TotalMilliseconds > int.MaxValue)
+                                               waitTimeout = TimeSpan.FromMilliseconds (int.MaxValue);
+                                       bool ret = ce.WaitHandle.WaitOne (waitTimeout);
                                        return ret && TryDequeueRequest (channel, timeout - (DateTime.Now - start), out context); // recurse, am lazy :/
                                }
                                context = q.Dequeue ();