diff options
author | Jb Evain <jbevain@gmail.com> | 2008-08-21 01:25:05 +0400 |
---|---|---|
committer | Jb Evain <jbevain@gmail.com> | 2008-08-21 01:25:05 +0400 |
commit | 982e3b35a4b715fa86ef2037501bfa1c89dd5038 (patch) | |
tree | 1ba1f442ea12faa4ffbb8fca8c6e429a53f6cfc9 /mcs/class/System.ServiceModel.Web/System.ServiceModel.Dispatcher/WebHttpDispatchOperationSelector.cs | |
parent | bdd0809c70020fc9c381c4310c346368e195fe76 (diff) |
move to from olive to mcs
svn path=/trunk/mcs/; revision=111188
Diffstat (limited to 'mcs/class/System.ServiceModel.Web/System.ServiceModel.Dispatcher/WebHttpDispatchOperationSelector.cs')
-rw-r--r-- | mcs/class/System.ServiceModel.Web/System.ServiceModel.Dispatcher/WebHttpDispatchOperationSelector.cs | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/mcs/class/System.ServiceModel.Web/System.ServiceModel.Dispatcher/WebHttpDispatchOperationSelector.cs b/mcs/class/System.ServiceModel.Web/System.ServiceModel.Dispatcher/WebHttpDispatchOperationSelector.cs new file mode 100644 index 00000000000..beec9cdd5ad --- /dev/null +++ b/mcs/class/System.ServiceModel.Web/System.ServiceModel.Dispatcher/WebHttpDispatchOperationSelector.cs @@ -0,0 +1,106 @@ +// +// WebHttpDispatchOperationSelector.cs +// +// Author: +// Atsushi Enomoto <atsushi@ximian.com> +// +// Copyright (C) 2008 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +using System; +using System.ServiceModel; +using System.ServiceModel.Channels; +using System.ServiceModel.Description; +using System.ServiceModel.Web; + +using TemplateTablePair = System.Collections.Generic.KeyValuePair<System.UriTemplate, object>; + +namespace System.ServiceModel.Dispatcher +{ + public class WebHttpDispatchOperationSelector : IDispatchOperationSelector + { + public const string HttpOperationSelectorUriMatchedPropertyName = "UriMatched"; + + UriTemplateTable table; + + protected WebHttpDispatchOperationSelector () + { + } + + public WebHttpDispatchOperationSelector (ServiceEndpoint endpoint) + { + if (endpoint == null) + throw new ArgumentNullException ("endpoint"); + if (endpoint.Address == null) + throw new InvalidOperationException ("EndpointAddress must be set in the argument ServiceEndpoint"); + + table = new UriTemplateTable (endpoint.Address.Uri); + + foreach (OperationDescription od in endpoint.Contract.Operations) { + WebAttributeInfo info = GetWebAttributeInfo (od); + if (info != null) + table.KeyValuePairs.Add (new TemplateTablePair (info.BuildUriTemplate (od, null), od)); + } + } + + public string SelectOperation (ref Message message) + { + bool dummy; + return SelectOperation (ref message, out dummy); + } + + protected virtual string SelectOperation (ref Message message, out bool uriMatched) + { + if (message == null) + throw new ArgumentNullException ("message"); + if (message.Properties.ContainsKey (WebBodyFormatMessageProperty.Name)) + throw new ArgumentException ("There is already message property for Web body format"); + uriMatched = false; + Uri to = message.Headers.To; + if (to == null) + return String.Empty; + + UriTemplateMatch match = table.MatchSingle (to); + OperationDescription od = null; + if (match != null) { + uriMatched = true; + foreach (TemplateTablePair p in table.KeyValuePairs) + if (p.Key == match.Template) + od = p.Value as OperationDescription; + } + return od != null ? od.Name : String.Empty; + } + + WebAttributeInfo GetWebAttributeInfo (OperationDescription od) + { + foreach (IOperationBehavior ob in od.Behaviors) { + WebAttributeInfo info = null; + var wg = ob as WebGetAttribute; + if (wg != null) + return wg.Info; + var wi = ob as WebInvokeAttribute; + if (wi != null) + return wi.Info; + } + return null; + } + } +} |