/* * Copyright (c) Contributors, http://www.openmetaverse.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the OpenSim Project nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ namespace Nwc.XmlRpc { using System; using System.Collections; using System.IO; using System.Xml; using System.Net; using System.Text; using System.Reflection; using System.Net.Security; using System.Security.Cryptography.X509Certificates; internal class AcceptAllCertificatePolicy : ICertificatePolicy { public AcceptAllCertificatePolicy() { } public bool CheckValidationResult(ServicePoint sPoint, System.Security.Cryptography.X509Certificates.X509Certificate cert, WebRequest wRequest, int certProb) { // Always accept return true; } } /// Class supporting the request side of an XML-RPC transaction. public class XmlRpcRequest { private String _methodName = null; private Encoding _encoding = new UTF8Encoding(); private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer(); private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer(); /// ArrayList containing the parameters. protected IList _params = null; /// Instantiate an XmlRpcRequest public XmlRpcRequest() { _params = new ArrayList(); } /// Instantiate an XmlRpcRequest for a specified method and parameters. /// String designating the object.method on the server the request /// should be directed to. /// ArrayList of XML-RPC type parameters to invoke the request with. public XmlRpcRequest(String methodName, IList parameters) { MethodName = methodName; _params = parameters; } /// ArrayList conntaining the parameters for the request. public virtual IList Params { get { return _params; } } /// String conntaining the method name, both object and method, that the request will be sent to. public virtual String MethodName { get { return _methodName; } set { _methodName = value; } } /// String object name portion of the method name. public String MethodNameObject { get { int index = MethodName.IndexOf("."); if (index == -1) return MethodName; return MethodName.Substring(0, index); } } /// String method name portion of the object.method name. public String MethodNameMethod { get { int index = MethodName.IndexOf("."); if (index == -1) return MethodName; return MethodName.Substring(index + 1, MethodName.Length - index - 1); } } /// Invoke this request on the server. /// String The url of the XML-RPC server. /// Object The value returned from the method invocation on the server. /// If an exception generated on the server side. public Object Invoke(String url) { XmlRpcResponse res = Send(url, 10000); if (res.IsFault) throw new XmlRpcException(res.FaultCode, res.FaultString); return res.Value; } /// Send the request to the server. /// String The url of the XML-RPC server. /// Milliseconds before the connection times out. /// XmlRpcResponse The response generated. public XmlRpcResponse Send(String url, int timeout) { // Override SSL authentication mechanisms ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); if (request == null) throw new XmlRpcException(XmlRpcErrorCodes.TRANSPORT_ERROR, XmlRpcErrorCodes.TRANSPORT_ERROR_MSG + ": Could not create request with " + url); request.Method = "POST"; request.ContentType = "text/xml"; request.AllowWriteStreamBuffering = true; request.Timeout = timeout; Stream stream = request.GetRequestStream(); XmlTextWriter xml = new XmlTextWriter(stream, _encoding); _serializer.Serialize(xml, this); xml.Flush(); xml.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader input = new StreamReader(response.GetResponseStream()); XmlRpcResponse resp = (XmlRpcResponse)_deserializer.Deserialize(input); input.Close(); response.Close(); return resp; } /// Produce String representation of the object. /// String representation of the object. override public String ToString() { return _serializer.Serialize(this); } } }