X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.Runtime.Remoting%2FSystem.Runtime.Remoting.Channels.Http%2FHttpChannel.cs;h=facd522f99ad55cd855f78a55ef6ef6454a82588;hb=d497b64f3d712eeaa5956436fef1a3ca16ef59e9;hp=4ae2d710199b5999e317967e7a1bf3bee1f8d4d7;hpb=a1befbed0525ee992c0a58043803f3e961f60ab0;p=mono.git diff --git a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Http/HttpChannel.cs b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Http/HttpChannel.cs index 4ae2d710199..facd522f99a 100644 --- a/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Http/HttpChannel.cs +++ b/mcs/class/System.Runtime.Remoting/System.Runtime.Remoting.Channels.Http/HttpChannel.cs @@ -1,144 +1,238 @@ -// -// System.Runtime.Remoting.Channels.Http.HttpChannel -// -// Summary: Implements a wrapper class for HTTP client and server channels. -// -// Classes: public HttpChannel -// -// Authors: -// Martin Willemoes Hansen (mwh@sysrq.dk) -// Ahmad Tantawy (popsito82@hotmail.com) -// Ahmad Kadry (kadrianoz@hotmail.com) -// Hussein Mehanna (hussein_mehanna@hotmail.com) -// -// (C) 2003 Martin Willemoes Hansen +// +// HttpChannel.cs +// +// Author: +// Michael Hutchinson +// +// 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.Collections; using System.Runtime.Remoting.Messaging; -namespace System.Runtime.Remoting.Channels.Http +namespace System.Runtime.Remoting.Channels.Http { - public class HttpChannel: BaseChannelWithProperties, IChannelReceiver, - IChannelSender, IChannel, IChannelReceiverHook + + public class HttpChannel : BaseChannelWithProperties, + IChannel, IChannelReceiver, IChannelReceiverHook, IChannelSender +#if NET_2_0 + , ISecurableChannel +#endif { - private HttpServerChannel serverChannel; - private HttpClientChannel clientChannel; - private string channelName = "http"; - private int channelPriority = 1; - private AggregateDictionary properties; + HttpClientChannel client; + HttpServerChannel server; + string name = "http"; - public HttpChannel() + #region Constructors + + public HttpChannel () { - SetupChannel (new Hashtable(), null, null); + client = new HttpClientChannel (); + server = new HttpServerChannel (); } public HttpChannel (int port) { - Hashtable prop = new Hashtable(); - prop["port"] = port; - SetupChannel(prop,null,null); + client = new HttpClientChannel (); + server = new HttpServerChannel (port); } - public HttpChannel (IDictionary properties,IClientChannelSinkProvider clientSinkProvider,IServerChannelSinkProvider serverSinkProvider) + public HttpChannel (IDictionary properties, + IClientChannelSinkProvider clientSinkProvider, + IServerChannelSinkProvider serverSinkProvider) { - SetupChannel (properties,clientSinkProvider,serverSinkProvider); + if (properties != null && properties.Contains ("name")) { + this.name = (string)properties["name"]; + } + + client = new HttpClientChannel (properties, clientSinkProvider); + server = new HttpServerChannel (properties, serverSinkProvider); } - private void SetupChannel (IDictionary properties, IClientChannelSinkProvider clientSinkProvider, IServerChannelSinkProvider serverSinkProvider) + #endregion + + #region BaseChannelWithProperties overrides + + public override object this[object key] { - clientChannel = new HttpClientChannel (properties, clientSinkProvider); - serverChannel = new HttpServerChannel (properties, serverSinkProvider); - - object val = properties ["name"]; - if (val != null) channelName = val as string; - - val = properties ["priority"]; - if (val != null) channelPriority = Convert.ToInt32 (val); - - this.properties = new AggregateDictionary (new IDictionary[] {clientChannel, serverChannel}); + get { return Properties[key]; } + set { Properties[key] = value; } } + public override ICollection Keys + { + get { return Properties.Keys; } + } - //IChannel Members - public String ChannelName + public override IDictionary Properties { - get { return channelName; } + get + { + return new AggregateDictionary (new IDictionary[] { + client.Properties, + server.Properties + }); + } + } + + #endregion + + #region IChannel + + public string ChannelName + { + get { return name; } } public int ChannelPriority { - get { return channelPriority; } + get { return server.ChannelPriority; } } - public String Parse(String url, out String objectURI) + public string Parse (string url, out string objectURI) { - return HttpHelper.Parse(url, out objectURI); + return ParseInternal (url, out objectURI); } - //IChannelSender Members - public IMessageSink CreateMessageSink(String url, Object remoteChannelData, out String objectURI) + internal static string ParseInternal (string url, out string objectURI) { - return clientChannel.CreateMessageSink(url, remoteChannelData, out objectURI); + if (url == null) + throw new ArgumentNullException ("url"); + + // format: "http://host:port/path/to/object" + objectURI = null; + + // url needs to be at least "http:" or "https:" + if (url.Length < 5 || + (url[0] != 'H' && url[0] != 'h') || + (url[1] != 'T' && url[1] != 't') || + (url[2] != 'T' && url[2] != 't') || + (url[3] != 'P' && url[3] != 'p')) + return null; + + int protolen; + if (url[4] == 'S' || url[4] == 's') { + if (url.Length < 6) + return null; + + protolen = 5; + } else { + protolen = 4; + } + + if (url[protolen] != ':') + return null; + + // "http:" and "https:" are acceptable inputs + if (url.Length == protolen + 1) + return url; + + // protocol must be followed by "//" + if (url.Length < protolen + 3 || url[protolen + 1] != '/' || url[protolen + 2] != '/') + return null; + + // "http://" and "https://" are acceptable inputs + if (url.Length == protolen + 3) + return url; + + int slash = url.IndexOf ('/', protolen + 3); + if (slash == -1) + return url; + + objectURI = url.Substring (slash); + + return url.Substring (0, slash); } - //IChannelReciever Members - public String[] GetUrlsForUri(String objectURI) + #endregion + + #region IChannelReceiver (: IChannel) + + public object ChannelData { - return serverChannel.GetUrlsForUri(objectURI); - } + get { return server.ChannelData; } + } - public void StartListening(Object data) + public string[] GetUrlsForUri (string objectURI) { - serverChannel.StartListening(data); + return server.GetUrlsForUri (objectURI); } - public void StopListening(Object data) + public void StartListening (object data) { - serverChannel.StopListening(data); - } - - public Object ChannelData + server.StartListening (data); + } + + public void StopListening (object data) { - get { return serverChannel.ChannelData; } + server.StopListening (data); } - - public String ChannelScheme + + #endregion + + #region IChannelReceiverHook + + public void AddHookChannelUri (string channelUri) { - get { return "http"; } + server.AddHookChannelUri (channelUri); } - public bool WantsToListen - { - get { return serverChannel.WantsToListen; } - set { serverChannel.WantsToListen = value; } - } - - public IServerChannelSink ChannelSinkChain + public string ChannelScheme { - get { return serverChannel.ChannelSinkChain; } + get { return server.ChannelScheme; } } - public void AddHookChannelUri (String channelUri) + public IServerChannelSink ChannelSinkChain { - serverChannel.AddHookChannelUri (channelUri); - } - - public override object this [object key] + get { return server.ChannelSinkChain; } + } + + public bool WantsToListen { - get { return properties[key]; } - set { properties[key] = value; } + get { return server.WantsToListen; } + set { server.WantsToListen = value; } } - - public override ICollection Keys + + #endregion + + #region IChannelSender (: IChannel) + + public IMessageSink CreateMessageSink (string url, object remoteChannelData, out string objectURI) { - get { return properties.Keys; } + return client.CreateMessageSink (url, remoteChannelData, out objectURI); } - - public override IDictionary Properties + + #endregion + +#if NET_2_0 + #region ISecurableChannel + + public bool IsSecured { - get { return properties; } + get { return client.IsSecured; } + set { client.IsSecured = value; } } + + #endregion +#endif } }