Merge pull request #1349 from martinjt/MachineKeyProtect
[mono.git] / mcs / class / System.ServiceModel / System.ServiceModel.Dispatcher / BaseRequestProcessor.cs
index a2ba2652dbe6cf99385f60f652777c746ea69758..fe05194d15b9e2054b90e581a3e7bdb55ea01ab3 100644 (file)
@@ -1,84 +1,89 @@
-using System;\r
-using System.Collections.Generic;\r
-using System.ServiceModel;\r
-using System.ServiceModel.Channels;\r
-using System.ServiceModel.Security;\r
-using System.ServiceModel.Security.Tokens;\r
-using System.Text;\r
-\r
-namespace System.ServiceModel.Dispatcher\r
-{\r
-       internal class BaseRequestProcessor\r
-       {\r
-               HandlersChain initialize_handlers_chain = new HandlersChain();\r
-               HandlersChain process_handlers_chain = new HandlersChain ();\r
-               HandlersChain error_handlers_chain = new HandlersChain ();\r
-               HandlersChain finalize_handlers_chain = new HandlersChain ();\r
-\r
-               protected BaseRequestProcessor () { }\r
-\r
-               protected virtual void ProcessRequest (MessageProcessingContext mrc)\r
-               {\r
-                       initialize_handlers_chain.ProcessRequestChain (mrc);\r
-\r
-                       using (new OperationContextScope (mrc.OperationContext)) {\r
-                               try {\r
-                                       process_handlers_chain.ProcessRequestChain (mrc);\r
-                               }\r
-                               catch (Exception e) {\r
-                                       Console.WriteLine ("Exception " + e.Message + " " + e.StackTrace);\r
-                                       mrc.ProcessingException = e;\r
-                                       error_handlers_chain.ProcessRequestChain (mrc);\r
-                               }\r
-                               finally {\r
-                                       finalize_handlers_chain.ProcessRequestChain (mrc);\r
-                               }\r
-                       }\r
-               }\r
-\r
-               public HandlersChain InitializeChain\r
-               {\r
-                       get { return initialize_handlers_chain; }\r
-               }\r
-\r
-               public HandlersChain ProcessingChain\r
-               {\r
-                       get { return process_handlers_chain; }\r
-               }\r
-\r
-               public HandlersChain ErrorChain\r
-               {\r
-                       get { return error_handlers_chain; }\r
-               }\r
-\r
-               public HandlersChain FinalizationChain\r
-               {\r
-                       get { return finalize_handlers_chain; }\r
-               }               \r
-       }\r
-\r
-       internal class HandlersChain\r
-       {\r
-               BaseRequestProcessorHandler chain;\r
-\r
-               public void ProcessRequestChain (MessageProcessingContext mrc)\r
-               {\r
-                       if (chain != null)\r
-                               chain.ProcessRequestChain (mrc);\r
-               }\r
-\r
-               public HandlersChain AddHandler (BaseRequestProcessorHandler handler)\r
-               {\r
-                       if (chain == null) {\r
-                               chain = handler;\r
-                       }\r
-                       else {\r
-                               BaseRequestProcessorHandler current = chain;\r
-                               while (current.Next != null)\r
-                                       current = current.Next;\r
-                               current.Next = handler;\r
-                       }\r
-                       return this;\r
-               }\r
-       }\r
-}\r
+using System;
+using System.Collections.Generic;
+using System.ServiceModel;
+using System.ServiceModel.Channels;
+using System.ServiceModel.Security;
+using System.ServiceModel.Security.Tokens;
+using System.Text;
+
+namespace System.ServiceModel.Dispatcher
+{
+       internal class BaseRequestProcessor
+       {
+               HandlersChain initialize_handlers_chain = new HandlersChain();
+               HandlersChain process_handlers_chain = new HandlersChain ();
+               HandlersChain error_handlers_chain = new HandlersChain ();
+               HandlersChain finalize_handlers_chain = new HandlersChain ();
+
+               protected BaseRequestProcessor () { }
+
+               protected virtual void ProcessRequest (MessageProcessingContext mrc)
+               {
+                       initialize_handlers_chain.ProcessRequestChain (mrc);
+
+                       using (new OperationContextScope (mrc.OperationContext)) {
+                               try {
+                                       process_handlers_chain.ProcessRequestChain (mrc);
+                               }
+                               catch (Exception e) {
+                                       // FIXME: this is not really expected use of ChannelDispatcher.ErrorHandlers.
+                                       // They are now correctly used in process_handler_chain (namely OperationInvokerHandler).
+                                       // For this kind of "outsider" exceptions are actually left thrown
+                                       // (and could even cause server loop crash in .NET).
+
+                                       Console.WriteLine ("Exception " + e.Message + " " + e.StackTrace);
+                                       mrc.ProcessingException = e;
+                                       error_handlers_chain.ProcessRequestChain (mrc);
+                               }
+                               finally {
+                                       finalize_handlers_chain.ProcessRequestChain (mrc);
+                               }
+                       }
+               }
+
+               public HandlersChain InitializeChain
+               {
+                       get { return initialize_handlers_chain; }
+               }
+
+               public HandlersChain ProcessingChain
+               {
+                       get { return process_handlers_chain; }
+               }
+
+               public HandlersChain ErrorChain
+               {
+                       get { return error_handlers_chain; }
+               }
+
+               public HandlersChain FinalizationChain
+               {
+                       get { return finalize_handlers_chain; }
+               }               
+       }
+
+       internal class HandlersChain
+       {
+               BaseRequestProcessorHandler chain;
+
+               public void ProcessRequestChain (MessageProcessingContext mrc)
+               {
+                       if (chain != null)
+                               chain.ProcessRequestChain (mrc);
+               }
+
+               public HandlersChain AddHandler (BaseRequestProcessorHandler handler)
+               {
+                       if (chain == null) {
+                               chain = handler;
+                       }
+                       else {
+                               BaseRequestProcessorHandler current = chain;
+                               while (current.Next != null)
+                                       current = current.Next;
+                               current.Next = handler;
+                       }
+                       return this;
+               }
+       }
+}