Exemplo n.º 1
0
        /// <summary>
        /// Call an XmlRpc method
        /// </summary>
        /// <param name="methodName">method name</param>
        /// <param name="parameters">variabile length list of parameters</param>
        /// <returns>response from the remote host</returns>
        /// <exception cref="Exception">allows all exceptions to propogate out of the method</exception>
        public async Task <XmlRpcMethodResponse> CallMethod(string methodName, params XmlRpcValue[] parameters)
        {
            //select the encoding
            Encoding encodingToUse = new UTF8Encoding(false, false);

            try
            {
                encodingToUse = Encoding.GetEncoding(_transportEncoding);
            }
            catch (Exception)
            {
            }

            // build the XmlRpc packet
            var requestBytes = GetRequestString(encodingToUse, methodName, parameters, false);

            if (ApplicationDiagnostics.VerboseLogging)
            {
                LogXmlRpcRequest(encodingToUse, methodName, parameters);
            }

            // send the request
            HttpResponseMessage response;

            try
            {
                response = await HttpRequestHelper.SendRequest(_hostname, async delegate(HttpRequestMessage request)
                {
                    request.Method = new HttpMethod("POST");
                    //request.AllowAutoRedirect = false;

                    if (_requestFilter != null)
                    {
                        await _requestFilter(request);
                    }

                    request.Content = new HttpStringContent(requestBytes, UnicodeEncoding.Utf8, encodingToUse.WebName);

                    ////request = String.Format(CultureInfo.InvariantCulture, "{0};charset={1}", MimeHelper.TEXT_XML, encodingToUse.WebName);

                    //using (Stream requestStream = await request.GetRequestStreamAsync())
                    //{
                    //    await StreamHelper.TransferAsync(new MemoryStream(requestBytes), requestStream);
                    //    await requestStream.FlushAsync();
                    //}
                });
            }
            catch
            {
                if (!ApplicationDiagnostics.VerboseLogging)  // if test mode, request has already been logged
                {
                    LogXmlRpcRequest(encodingToUse, methodName, parameters);
                }

                throw;
            }

            //// WinLive 616: The response encoding may not necessarily be the same as our request encoding. Attempt to
            //// use the encoding specified in the HTTP header.
            //string characterSet;
            //if (TryGetCharacterSet(response, out characterSet))
            //{
            //    encodingToUse = StringHelper.GetEncoding(characterSet, encodingToUse);
            //}

            ////// return the response
            //var stream = response.GetResponseStream();
            //if (response.Headers[HttpRequestHeader.ContentEncoding] != null)
            //{
            //    if (response.Headers[HttpRequestHeader.ContentEncoding].ToLowerInvariant().Contains("gzip"))
            //    {
            //        stream = new GZipStream(stream, CompressionMode.Decompress);
            //    }
            //}

            //response.Content.ReadAsStringAsync();

            //using (StreamReader reader = new StreamReader(stream, encodingToUse))
            //{
            string xmlRpcString = await response.Content.ReadAsStringAsync();

            if (ApplicationDiagnostics.VerboseLogging)
            {
                LogXmlRpcResponse(xmlRpcString);
            }

            try
            {
                XmlRpcMethodResponse xmlRpcResponse = new XmlRpcMethodResponse(xmlRpcString);
                if (xmlRpcResponse.FaultOccurred)
                {
                    if (!ApplicationDiagnostics.VerboseLogging)      // if test mode, response has already been logged
                    {
                        LogXmlRpcRequest(encodingToUse, methodName, parameters);
                        LogXmlRpcResponse(xmlRpcString);
                    }
                }
                return(xmlRpcResponse);
            }
            catch (Exception ex)
            {
                //Debug.WriteLine("Exception parsing XML-RPC response:\r\n\r\n" + ex.ToString() + "\r\n\r\n" + xmlRpcString);
                throw;
            }
            // }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Call an XmlRpc method
        /// </summary>
        /// <param name="methodName">method name</param>
        /// <param name="parameters">variabile length list of parameters</param>
        /// <returns>response from the remote host</returns>
        /// <exception cref="Exception">allows all exceptions to propogate out of the method</exception>
        public XmlRpcMethodResponse CallMethod(string methodName, params XmlRpcValue[] parameters)
        {
            //select the encoding
            Encoding encodingToUse = StringHelper.GetEncoding(_transportEncoding, new UTF8Encoding(false, false));

            // build the XmlRpc packet
            byte[] requestBytes = GetRequestBytes(encodingToUse, methodName, parameters, false);

            if (ApplicationDiagnostics.VerboseLogging)
            {
                LogXmlRpcRequest(encodingToUse, methodName, parameters);
            }

            // send the request
            HttpWebResponse response;

            try
            {
                response = HttpRequestHelper.SendRequest(_hostname, delegate(HttpWebRequest request)
                {
                    request.Method            = "POST";
                    request.AllowAutoRedirect = false;
                    request.ContentType       = String.Format(CultureInfo.InvariantCulture, "{0};charset={1}", MimeHelper.TEXT_XML, encodingToUse.WebName);
                    if (_requestFilter != null)
                    {
                        _requestFilter(request);
                    }
                    using (Stream requestStream = request.GetRequestStream())
                        StreamHelper.Transfer(new MemoryStream(requestBytes), requestStream);
                });
            }
            catch
            {
                if (!ApplicationDiagnostics.VerboseLogging)  // if test mode, request has already been logged
                {
                    LogXmlRpcRequest(encodingToUse, methodName, parameters);
                }

                throw;
            }

            // WinLive 616: The response encoding may not necessarily be the same as our request encoding. Attempt to
            // use the encoding specified in the HTTP header.
            string characterSet;

            if (TryGetCharacterSet(response, out characterSet))
            {
                encodingToUse = StringHelper.GetEncoding(characterSet, encodingToUse);
            }

            // return the response
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), encodingToUse))
            {
                string xmlRpcString = reader.ReadToEnd();

                if (ApplicationDiagnostics.VerboseLogging)
                {
                    LogXmlRpcResponse(xmlRpcString);
                }

                try
                {
                    XmlRpcMethodResponse xmlRpcResponse = new XmlRpcMethodResponse(xmlRpcString);
                    if (xmlRpcResponse.FaultOccurred)
                    {
                        if (!ApplicationDiagnostics.VerboseLogging)  // if test mode, response has already been logged
                        {
                            LogXmlRpcRequest(encodingToUse, methodName, parameters);
                            LogXmlRpcResponse(xmlRpcString);
                        }
                    }
                    return(xmlRpcResponse);
                }
                catch (Exception ex)
                {
                    Trace.WriteLine("Exception parsing XML-RPC response:\r\n\r\n" + ex.ToString() + "\r\n\r\n" + xmlRpcString);
                    throw;
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Call an XmlRpc method
        /// </summary>
        /// <param name="methodName">method name</param>
        /// <param name="parameters">variabile length list of parameters</param>
        /// <returns>response from the remote host</returns>
        /// <exception cref="Exception">allows all exceptions to propogate out of the method</exception>
        public XmlRpcMethodResponse CallMethod(string methodName, params XmlRpcValue[] parameters)
        {
            //select the encoding
            Encoding encodingToUse = StringHelper.GetEncoding(_transportEncoding, new UTF8Encoding(false, false));

            // build the XmlRpc packet
            byte[] requestBytes = GetRequestBytes(encodingToUse, methodName, parameters, false);

            if (ApplicationDiagnostics.VerboseLogging)
            {
                LogXmlRpcRequest(encodingToUse, methodName, parameters);
            }

            // send the request
            HttpWebResponse response;
            try
            {
                response = HttpRequestHelper.SendRequest(_hostname, delegate (HttpWebRequest request)
                {
                    request.Method = "POST";
                    request.AllowAutoRedirect = false;
                    request.ContentType = String.Format(CultureInfo.InvariantCulture, "{0};charset={1}", MimeHelper.TEXT_XML, encodingToUse.WebName);
                    if (_requestFilter != null)
                        _requestFilter(request);
                    using (Stream requestStream = request.GetRequestStream())
                        StreamHelper.Transfer(new MemoryStream(requestBytes), requestStream);
                });
            }
            catch
            {
                if (!ApplicationDiagnostics.VerboseLogging)  // if test mode, request has already been logged
                {
                    LogXmlRpcRequest(encodingToUse, methodName, parameters);
                }

                throw;
            }

            // WinLive 616: The response encoding may not necessarily be the same as our request encoding. Attempt to
            // use the encoding specified in the HTTP header.
            string characterSet;
            if (TryGetCharacterSet(response, out characterSet))
            {
                encodingToUse = StringHelper.GetEncoding(characterSet, encodingToUse);
            }

            // return the response
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), encodingToUse))
            {
                string xmlRpcString = reader.ReadToEnd();

                if (ApplicationDiagnostics.VerboseLogging)
                {
                    LogXmlRpcResponse(xmlRpcString);
                }

                try
                {
                    XmlRpcMethodResponse xmlRpcResponse = new XmlRpcMethodResponse(xmlRpcString);
                    if (xmlRpcResponse.FaultOccurred)
                    {
                        if (!ApplicationDiagnostics.VerboseLogging)  // if test mode, response has already been logged
                        {
                            LogXmlRpcRequest(encodingToUse, methodName, parameters);
                            LogXmlRpcResponse(xmlRpcString);
                        }
                    }
                    return xmlRpcResponse;
                }
                catch (Exception ex)
                {
                    Trace.WriteLine("Exception parsing XML-RPC response:\r\n\r\n" + ex.ToString() + "\r\n\r\n" + xmlRpcString);
                    throw;
                }
            }

        }