private void SerializeResponse(IMessage responseMsg, ref ITransportHeaders responseHeaders, ref Stream responseStream, IXmlRpcStreamRequestConfig config)
        {
            XmlRpcResponseSerializer serializer = new XmlRpcResponseSerializer();
            responseStream = new MemoryStream();
            responseHeaders = new TransportHeaders();

            ReturnMessage retMsg = (ReturnMessage)responseMsg;
            XmlRpcResponse response;
            if (retMsg.Exception == null)
            {
                response = new XmlRpcResponse(retMsg.ReturnValue);
            }
            else if (retMsg.Exception is XmlRpcException)
            {
                response = new XmlRpcResponse();
                response.Fault = (retMsg.Exception as XmlRpcException).Fault;
            }
            else
            {
                response = new XmlRpcResponse();
                response.Fault = new XmlRpcFault(1, retMsg.Exception.Message);
            }
            serializer.WriteResponse(responseStream, response, config, TypeSerializerFactory);
            responseHeaders["Content-Type"] = "text/xml; charset=\"utf-8\"";
        }
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
            IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream,
            out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
            if (requestHeaders["SOAPAction"] != null)
            {
                // pass to next sink if this is a SOAP request with SOAPAction header.
                return NextChannelSink.ProcessMessage(sinkStack,
                    requestMsg, requestHeaders, requestStream,
                    out responseMsg, out responseHeaders, out responseStream);
            }

            XmlRpcHttpRequestConfig requestConfig = GetConfig(requestHeaders);

            try
            {
                MethodCall call = DeserializeRequest(requestHeaders, requestStream, requestConfig);
                sinkStack.Push(this, call);
                // forward to next sink in chain - pass request stream as null to 
                // indicate that we have deserialized the request
                NextChannelSink.ProcessMessage(sinkStack, call, requestHeaders, null,
                  out responseMsg, out responseHeaders, out responseStream);
                SerializeResponse(responseMsg, ref responseHeaders, ref responseStream, requestConfig);
            }
            catch (Exception ex)
            {
                responseMsg = new ReturnMessage(ex, (IMethodCallMessage)requestMsg);
                responseStream = new MemoryStream();
                XmlRpcResponseSerializer serializer = new XmlRpcResponseSerializer();
                XmlRpcResponse faultResponse = new XmlRpcResponse();
                faultResponse.Fault = new XmlRpcFault(0, ex.Message);
                serializer.WriteResponse(responseStream, faultResponse, requestConfig, TypeSerializerFactory);
                responseHeaders = new TransportHeaders();
                responseHeaders["Content-Type"] = "text/xml; charset=\"utf-8\"";
            }

            return ServerProcessing.Complete;
        }
Esempio n. 3
0
 public void WriteXmlRpcFaultResponse()
 {
     XmlRpcResponse response = new XmlRpcResponse(null);
     response.Fault = new XmlRpcFault(4, "Too many parameters.");
     StringBuilder sb = new StringBuilder();
     XmlTextWriter writer = new XmlTextWriter(new StringWriter(sb));
     XmlRpcResponseSerializer serializer = new XmlRpcResponseSerializer();
     serializer.WriteResponse(writer, response, null, new TypeSerializerFactory());
     Assert.IsEqualTo(sb.ToString(), @"<?xml version=""1.0"" encoding=""utf-16""?><methodResponse><fault><value><struct><member><name>faultCode</name><value><i4>4</i4></value></member><member><name>faultString</name><value><string>Too many parameters.</string></value></member></struct></value></fault></methodResponse>");
 }
Esempio n. 4
0
 public void WriteXmlRpcResponse()
 {
     XmlRpcResponse response = new XmlRpcResponse("South Dakota");
     StringBuilder sb = new StringBuilder();
     XmlTextWriter writer = new XmlTextWriter(new StringWriter(sb));
     XmlRpcResponseSerializer serializer = new XmlRpcResponseSerializer();
     serializer.WriteResponse(writer, response, null, new TypeSerializerFactory());
     Assert.IsEqualTo(sb.ToString(), @"<?xml version=""1.0"" encoding=""utf-16""?><methodResponse><params><param><value><string>South Dakota</string></value></param></params></methodResponse>");
 }
Esempio n. 5
0
        public void ParseXmlRpcFaultResponse()
        {
            String xmlrpc = @"
<methodResponse>
   <fault>
      <value>
         <struct>
            <member>
               <name>faultCode</name>
               <value><int>4</int></value>
               </member>
            <member>
               <name>faultString</name>
               <value><string>Too many parameters.</string></value>
               </member>
            </struct>
         </value>
      </fault>
   </methodResponse>
";

            XmlTextReader reader = new XmlTextReader(new MemoryStream(Encoding.UTF8.GetBytes(xmlrpc)));
            XmlRpcResponseSerializer serializer = new XmlRpcResponseSerializer();
            IXmlRpcResponse request = serializer.ReadResponse(reader, null, new TypeSerializerFactory());
            Assert.IsNull(request.Result);
            Assert.IsNotNull(request.Fault);
            Assert.IsEqualTo(request.Fault.FaultCode, 4);
            Assert.IsEqualTo(request.Fault.FaultString, "Too many parameters.");
        }
Esempio n. 6
0
        public void ParseXmlRpcResponse()
        {
            String xmlrpc = @"
<methodResponse>
   <params>
      <param>
         <value><string>South Dakota</string></value>
         </param>
      </params>
   </methodResponse>";

            XmlTextReader reader = new XmlTextReader(new MemoryStream(Encoding.UTF8.GetBytes(xmlrpc)));
            XmlRpcResponseSerializer serializer = new XmlRpcResponseSerializer();
            IXmlRpcResponse request = serializer.ReadResponse(reader, null, new TypeSerializerFactory());
            Assert.IsNull(request.Fault);
            Assert.IsEqualTo(request.Result, "South Dakota");
        }
 private void WriteResponse(IXmlRpcStreamRequestConfig config, Stream outputStream, IXmlRpcResponse response)
 {
     XmlRpcResponseSerializer serializer = new XmlRpcResponseSerializer();
     if (_xmlWriterFactory != null)
         serializer.XmlWriterFactory = _xmlWriterFactory;
     serializer.WriteResponse(outputStream, response, config, TypeSerializerFactory);
 }