From 3436961bb5c01d659d09be134368f4f69460cef9 Mon Sep 17 00:00:00 2001
From: MW
Date: Sat, 26 May 2007 13:40:19 +0000
Subject: Start of rewrite 5279!
---
Common/XmlRpcCS/XmlRpcResponder.cs | 98 ++++++++++++++++++++++++++++++++++++++
1 file changed, 98 insertions(+)
create mode 100644 Common/XmlRpcCS/XmlRpcResponder.cs
(limited to 'Common/XmlRpcCS/XmlRpcResponder.cs')
diff --git a/Common/XmlRpcCS/XmlRpcResponder.cs b/Common/XmlRpcCS/XmlRpcResponder.cs
new file mode 100644
index 0000000..0412568
--- /dev/null
+++ b/Common/XmlRpcCS/XmlRpcResponder.cs
@@ -0,0 +1,98 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Xml;
+ using System.Net.Sockets;
+
+ /// The class is a container of the context of an XML-RPC dialog on the server side.
+ /// Instances of this class maintain the context for an individual XML-RPC server
+ /// side dialog. Namely they manage an inbound deserializer and an outbound serializer.
+ public class XmlRpcResponder
+ {
+ private XmlRpcRequestDeserializer _deserializer = new XmlRpcRequestDeserializer();
+ private XmlRpcResponseSerializer _serializer = new XmlRpcResponseSerializer();
+ private XmlRpcServer _server;
+ private TcpClient _client;
+ private SimpleHttpRequest _httpReq;
+
+ /// The SimpleHttpRequest based on the TcpClient.
+ public SimpleHttpRequest HttpReq
+ {
+ get { return _httpReq; }
+ }
+
+ /// Basic constructor.
+ /// XmlRpcServer that this XmlRpcResponder services.
+ /// TcpClient with the connection.
+ public XmlRpcResponder(XmlRpcServer server, TcpClient client)
+ {
+ _server = server;
+ _client = client;
+ _httpReq = new SimpleHttpRequest(_client);
+ }
+
+ /// Call close to insure proper shutdown.
+ ~XmlRpcResponder()
+ {
+ Close();
+ }
+
+ ///Respond using this responders HttpReq.
+ public void Respond()
+ {
+ Respond(HttpReq);
+ }
+
+ /// Handle an HTTP request containing an XML-RPC request.
+ /// This method deserializes the XML-RPC request, invokes the
+ /// described method, serializes the response (or fault) and sends the XML-RPC response
+ /// back as a valid HTTP page.
+ ///
+ /// SimpleHttpRequest containing the request.
+ public void Respond(SimpleHttpRequest httpReq)
+ {
+ XmlRpcRequest xmlRpcReq = (XmlRpcRequest)_deserializer.Deserialize(httpReq.Input);
+ XmlRpcResponse xmlRpcResp = new XmlRpcResponse();
+
+ try
+ {
+ xmlRpcResp.Value = _server.Invoke(xmlRpcReq);
+ }
+ catch (XmlRpcException e)
+ {
+ xmlRpcResp.SetFault(e.FaultCode, e.FaultString);
+ }
+ catch (Exception e2)
+ {
+ xmlRpcResp.SetFault(XmlRpcErrorCodes.APPLICATION_ERROR,
+ XmlRpcErrorCodes.APPLICATION_ERROR_MSG + ": " + e2.Message);
+ }
+
+ if (Logger.Delegate != null)
+ Logger.WriteEntry(xmlRpcResp.ToString(), LogLevel.Information);
+
+ XmlRpcServer.HttpHeader(httpReq.Protocol, "text/xml", 0, " 200 OK", httpReq.Output);
+ httpReq.Output.Flush();
+ XmlTextWriter xml = new XmlTextWriter(httpReq.Output);
+ _serializer.Serialize(xml, xmlRpcResp);
+ xml.Flush();
+ httpReq.Output.Flush();
+ }
+
+ ///Close all contained resources, both the HttpReq and client.
+ public void Close()
+ {
+ if (_httpReq != null)
+ {
+ _httpReq.Close();
+ _httpReq = null;
+ }
+
+ if (_client != null)
+ {
+ _client.Close();
+ _client = null;
+ }
+ }
+ }
+}
--
cgit v1.1