public Stream Invoke(Stream requestStream)
 {
     try
       {
     XmlRpcSerializer serializer = new XmlRpcSerializer();
     Type type = this.GetType();
     XmlRpcServiceAttribute serviceAttr = (XmlRpcServiceAttribute)
       Attribute.GetCustomAttribute(this.GetType(),
       typeof(XmlRpcServiceAttribute));
     if (serviceAttr != null)
     {
       if (serviceAttr.XmlEncoding != null)
     serializer.XmlEncoding = Encoding.GetEncoding(serviceAttr.XmlEncoding);
       serializer.UseIntTag = serviceAttr.UseIntTag;
       serializer.UseStringTag = serviceAttr.UseStringTag;
       serializer.UseIndentation = serviceAttr.UseIndentation;
       serializer.Indentation = serviceAttr.Indentation;
       serializer.AppendTimezoneOffset = serviceAttr.AppendTimezoneOffset; // JB Change
     }
     XmlRpcRequest xmlRpcReq
       = serializer.DeserializeRequest(requestStream, this.GetType());
     XmlRpcResponse xmlRpcResp = Invoke(xmlRpcReq);
     Stream responseStream = new MemoryStream();
     serializer.SerializeResponse(responseStream, xmlRpcResp);
     responseStream.Seek(0, SeekOrigin.Begin);
     return responseStream;
       }
       catch (Exception ex)
       {
     XmlRpcFaultException fex;
     if (ex is XmlRpcException)
       fex = new XmlRpcFaultException(0, ((XmlRpcException)ex).Message);
     else if (ex is XmlRpcFaultException)
       fex = (XmlRpcFaultException)ex;
     else
       fex = new XmlRpcFaultException(0, ex.Message);
     XmlRpcSerializer serializer = new XmlRpcSerializer();
     Stream responseStream = new MemoryStream();
     serializer.SerializeFaultResponse(responseStream, fex);
     responseStream.Seek(0, SeekOrigin.Begin);
     return responseStream;
       }
 }
 XmlRpcResponse ReadResponse(
     XmlRpcRequest req,
     WebResponse webResp,
     Stream respStm,
     Type returnType)
 {
     HttpWebResponse httpResp = (HttpWebResponse)webResp;
       if (httpResp.StatusCode != HttpStatusCode.OK)
       {
     // status 400 is used for errors caused by the client
     // status 500 is used for server errors (not server application
     // errors which are returned as fault responses)
     if (httpResp.StatusCode == HttpStatusCode.BadRequest)
       throw new XmlRpcException(httpResp.StatusDescription);
     else
       throw new XmlRpcServerException(httpResp.StatusDescription);
       }
       XmlRpcSerializer serializer = new XmlRpcSerializer();
       serializer.NonStandard = _nonStandard;
       Type retType = returnType;
       if (retType == null)
     retType = req.mi.ReturnType;
       XmlRpcResponse xmlRpcResp
     = serializer.DeserializeResponse(respStm, retType);
       return xmlRpcResp;
 }
 static void GetRequestStreamCallback(IAsyncResult asyncResult)
 {
     XmlRpcAsyncResult clientResult
     = (XmlRpcAsyncResult)asyncResult.AsyncState;
       clientResult.CompletedSynchronously = asyncResult.CompletedSynchronously;
       try
       {
     Stream serStream = null;
     Stream reqStream = null;
     bool logging = (clientResult.ClientProtocol.RequestEvent != null);
     if (!logging)
     {
       serStream = reqStream
     = clientResult.Request.EndGetRequestStream(asyncResult);
     }
     else
       serStream = new MemoryStream(2000);
     try
     {
       XmlRpcRequest req = clientResult.XmlRpcRequest;
       XmlRpcSerializer serializer = new XmlRpcSerializer();
       if (clientResult.XmlEncoding != null)
     serializer.XmlEncoding = clientResult.XmlEncoding;
       serializer.UseEmptyParamsTag = clientResult.UseEmptyParamsTag;
       serializer.UseIndentation = clientResult.UseIndentation;
       serializer.Indentation = clientResult.Indentation;
       serializer.UseIntTag = clientResult.UseIntTag;
       serializer.UseStringTag = clientResult.UseStringTag;
       serializer.SerializeRequest(serStream, req);
       if (logging)
       {
     reqStream = clientResult.Request.EndGetRequestStream(asyncResult);
     serStream.Position = 0;
     Util.CopyStream(serStream, reqStream);
     reqStream.Flush();
     serStream.Position = 0;
     clientResult.ClientProtocol.OnRequest(
       new XmlRpcRequestEventArgs(req.proxyId, req.number, serStream));
       }
     }
     finally
     {
       if (reqStream != null)
     reqStream.Close();
     }
     clientResult.Request.BeginGetResponse(
       new AsyncCallback(GetResponseCallback), clientResult);
       }
       catch (Exception ex)
       {
     ProcessAsyncException(clientResult, ex);
       }
 }
 public object Invoke(
     Object clientObj,
     MethodInfo mi,
     params object[] parameters)
 {
     #if (!COMPACT_FRAMEWORK)
       _responseHeaders = null;
       _responseCookies = null;
     #endif
       WebRequest webReq = null;
       object reto = null;
       try
       {
     string useUrl = GetEffectiveUrl(clientObj);
     webReq = GetWebRequest(new Uri(useUrl));
     XmlRpcRequest req = MakeXmlRpcRequest(webReq, mi, parameters,
       clientObj, _xmlRpcMethod, _id);
     SetProperties(webReq);
     SetRequestHeaders(_headers, webReq);
     #if (!COMPACT_FRAMEWORK)
     SetClientCertificates(_clientCertificates, webReq);
     #endif
     Stream serStream = null;
     Stream reqStream = null;
     bool logging = (RequestEvent != null);
     if (!logging)
       serStream = reqStream = webReq.GetRequestStream();
     else
       serStream = new MemoryStream(2000);
     try
     {
       XmlRpcSerializer serializer = new XmlRpcSerializer();
       if (_xmlEncoding != null)
     serializer.XmlEncoding = _xmlEncoding;
       serializer.UseIndentation = _useIndentation;
       serializer.Indentation = _indentation;
       serializer.NonStandard = _nonStandard;
       serializer.UseStringTag = _useStringTag;
       serializer.UseIntTag = _useIntTag;
       serializer.UseEmptyParamsTag = _useEmptyParamsTag;
       serializer.SerializeRequest(serStream, req);
       if (logging)
       {
     reqStream = webReq.GetRequestStream();
     serStream.Position = 0;
     Util.CopyStream(serStream, reqStream);
     reqStream.Flush();
     serStream.Position = 0;
     OnRequest(new XmlRpcRequestEventArgs(req.proxyId, req.number,
       serStream));
       }
     }
     finally
     {
       if (reqStream != null)
     reqStream.Close();
     }
     HttpWebResponse webResp = GetWebResponse(webReq) as HttpWebResponse;
     #if (!COMPACT_FRAMEWORK)
     _responseCookies = webResp.Cookies;
     _responseHeaders = webResp.Headers;
     #endif
     Stream respStm = null;
     Stream deserStream;
     logging = (ResponseEvent != null);
     try
     {
       respStm = webResp.GetResponseStream();
       if (!logging)
       {
     deserStream = respStm;
       }
       else
       {
     deserStream = new MemoryStream(2000);
     Util.CopyStream(respStm, deserStream);
     deserStream.Flush();
     deserStream.Position = 0;
       }
     #if (!COMPACT_FRAMEWORK && !FX1_0)
       deserStream = MaybeDecompressStream((HttpWebResponse)webResp,
     deserStream);
     #endif
       try
       {
     XmlRpcResponse resp = ReadResponse(req, webResp, deserStream, null);
     reto = resp.retVal;
       }
       finally
       {
     if (logging)
     {
       deserStream.Position = 0;
       OnResponse(new XmlRpcResponseEventArgs(req.proxyId, req.number,
         deserStream));
     }
       }
     }
     finally
     {
       if (respStm != null)
     respStm.Close();
     }
       }
       finally
       {
     if (webReq != null)
       webReq = null;
       }
       return reto;
 }
        void SerializeResponse(
            IMessage responseMsg,
            ref ITransportHeaders responseHeaders,
            ref Stream responseStream)
        {
            XmlRpcSerializer serializer = new XmlRpcSerializer();
              responseStream = new MemoryStream();
              responseHeaders = new TransportHeaders();

              ReturnMessage retMsg = (ReturnMessage)responseMsg;
              if (retMsg.Exception == null)
              {
            XmlRpcResponse xmlRpcResp = new XmlRpcResponse(retMsg.ReturnValue);
            serializer.SerializeResponse(responseStream, xmlRpcResp);
              }
              else if (retMsg.Exception is XmlRpcFaultException)
              {
            serializer.SerializeFaultResponse(responseStream,
              (XmlRpcFaultException)retMsg.Exception);
              }
              else
              {
            serializer.SerializeFaultResponse(responseStream,
              new XmlRpcFaultException(1, retMsg.Exception.Message));
              }
              responseHeaders["Content-Type"] = "text/xml; charset=\"utf-8\"";
        }
 // private methods
 //
 MethodCall DeserializeRequest(
     ITransportHeaders requestHeaders,
     Stream requestStream)
 {
     string requestUri = (string) requestHeaders["__RequestUri"];
       Type svcType = GetServiceType(requestUri);
       XmlRpcSerializer serializer = new XmlRpcSerializer();
       XmlRpcRequest xmlRpcReq
     = serializer.DeserializeRequest(requestStream, svcType);
       Header[] headers = GetChannelHeaders(requestHeaders, xmlRpcReq, svcType);
       MethodCall mthdCall = new MethodCall(headers);
       mthdCall.ResolveMethod();
       return mthdCall;
 }
        public ServerProcessing ProcessMessage(
            IServerChannelSinkStack sinkStack,
            IMessage requestMsg,
            ITransportHeaders requestHeaders,
            Stream requestStream,
            out IMessage responseMsg,
            out ITransportHeaders responseHeaders,
            out Stream responseStream
            )
        {
            // use presence of SOAPAction header to determine if this is a SOAP
              // request - if so pass onto next sink in chain
              string soapAction = (string) requestHeaders["SOAPAction"];
              if (soapAction != null)
              {
            return m_next.ProcessMessage(sinkStack, requestMsg, requestHeaders,
              requestStream, out responseMsg, out responseHeaders,
              out responseStream);
              }

              // for time being assume we have an XML-RPC request (need to improve
              // this in case there are other non-SOAP formatters in the chain)
              try
              {
            MethodCall mthdCall = DeserializeRequest(requestHeaders, requestStream);
            sinkStack.Push(this, mthdCall);
            // forward to next sink in chain - pass request stream as null to
            // indicate that we have deserialized the request
            m_next.ProcessMessage(sinkStack, mthdCall, requestHeaders, null,
              out responseMsg, out responseHeaders, out responseStream);
            SerializeResponse(responseMsg, ref responseHeaders, ref responseStream);
              }
              catch (Exception ex)
              {
            responseMsg = new ReturnMessage(ex, (IMethodCallMessage)requestMsg);
            responseStream = new MemoryStream();
            XmlRpcFaultException fex = new XmlRpcFaultException(0, ex.Message);
            XmlRpcSerializer serializer = new XmlRpcSerializer();
            serializer.SerializeFaultResponse(responseStream,
              (XmlRpcFaultException)fex);
            responseHeaders = new TransportHeaders();
              }
              return ServerProcessing.Complete;
        }
        //  private methods
        //
        void SerializeMessage(
            IMethodCallMessage mcm,
            ref ITransportHeaders headers,
            ref Stream stream)
        {
            ITransportHeaders reqHeaders = new TransportHeaders();
              reqHeaders["__Uri"] = mcm.Uri;
              reqHeaders["Content-Type"] = "text/xml; charset=\"utf-8\"";
              reqHeaders["__RequestVerb"] = "POST";

              MethodInfo mi = (MethodInfo) mcm.MethodBase;
              string methodName = GetRpcMethodName(mi);
              XmlRpcRequest xmlRpcReq = new XmlRpcRequest(methodName, mcm.InArgs);
              // TODO: possibly call GetRequestStream from next sink in chain?
              // TODO: SoapClientFormatter sink uses ChunkedStream - check why?
              Stream stm = new MemoryStream();
              XmlRpcSerializer serializer = new XmlRpcSerializer();
              serializer.SerializeRequest(stm, xmlRpcReq);
              stm.Position = 0;

              headers = reqHeaders;
              stream = stm;
        }
 IMessage DeserializeMessage(
     IMethodCallMessage mcm,
     ITransportHeaders headers,
     Stream stream)
 {
     XmlRpcSerializer serializer = new XmlRpcSerializer();
       object tp = mcm.MethodBase;
       System.Reflection.MethodInfo mi = (System.Reflection.MethodInfo)tp;
       System.Type t = mi.ReturnType;
       XmlRpcResponse xmlRpcResp = serializer.DeserializeResponse(stream, t);
       IMessage imsg = new ReturnMessage(xmlRpcResp.retVal, null, 0, null, mcm);
       return imsg;
 }