aboutsummaryrefslogtreecommitdiff
path: root/Mono.Nat/Upnp/Messages/UpnpMessage.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Mono.Nat/Upnp/Messages/UpnpMessage.cs')
-rw-r--r--Mono.Nat/Upnp/Messages/UpnpMessage.cs61
1 files changed, 12 insertions, 49 deletions
diff --git a/Mono.Nat/Upnp/Messages/UpnpMessage.cs b/Mono.Nat/Upnp/Messages/UpnpMessage.cs
index 44c16eec6..54cca4494 100644
--- a/Mono.Nat/Upnp/Messages/UpnpMessage.cs
+++ b/Mono.Nat/Upnp/Messages/UpnpMessage.cs
@@ -31,6 +31,7 @@ using System.Net;
using System.IO;
using System.Text;
using System.Globalization;
+using MediaBrowser.Common.Net;
namespace Mono.Nat.Upnp
{
@@ -44,17 +45,16 @@ namespace Mono.Nat.Upnp
this.device = device;
}
- protected WebRequest CreateRequest(string upnpMethod, string methodParameters, out byte[] body)
+ protected HttpRequestOptions CreateRequest(string upnpMethod, string methodParameters)
{
string ss = "http://" + this.device.HostEndPoint.ToString() + this.device.ControlUrl;
NatUtility.Log("Initiating request to: {0}", ss);
- Uri location = new Uri(ss);
- HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(location);
- req.KeepAlive = false;
- req.Method = "POST";
- req.ContentType = "text/xml; charset=\"utf-8\"";
- req.Headers.Add("SOAPACTION", "\"" + device.ServiceType + "#" + upnpMethod + "\"");
+ var req = new HttpRequestOptions();
+ req.Url = ss;
+ req.EnableKeepAlive = false;
+ req.RequestContentType = "text/xml; charset=\"utf-8\"";
+ req.RequestHeaders.Add("SOAPACTION", "\"" + device.ServiceType + "#" + upnpMethod + "\"");
string bodyString = "<s:Envelope "
+ "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
@@ -67,54 +67,17 @@ namespace Mono.Nat.Upnp
+ "</s:Body>"
+ "</s:Envelope>\r\n\r\n";
- body = System.Text.Encoding.UTF8.GetBytes(bodyString);
+ req.RequestContentBytes = System.Text.Encoding.UTF8.GetBytes(bodyString);
return req;
}
- public static MessageBase Decode(UpnpNatDevice device, string message)
- {
- XmlNode node;
- XmlDocument doc = new XmlDocument();
- doc.LoadXml(message);
-
- XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable);
-
- // Error messages should be found under this namespace
- nsm.AddNamespace("errorNs", "urn:schemas-upnp-org:control-1-0");
- nsm.AddNamespace("responseNs", device.ServiceType);
-
- // Check to see if we have a fault code message.
- if ((node = doc.SelectSingleNode("//errorNs:UPnPError", nsm)) != null) {
- string errorCode = node["errorCode"] != null ? node["errorCode"].InnerText : "";
- string errorDescription = node["errorDescription"] != null ? node["errorDescription"].InnerText : "";
-
- return new ErrorMessage(Convert.ToInt32(errorCode, CultureInfo.InvariantCulture), errorDescription);
- }
-
- if ((doc.SelectSingleNode("//responseNs:AddPortMappingResponse", nsm)) != null)
- return new CreatePortMappingResponseMessage();
+ public abstract HttpRequestOptions Encode();
- if ((doc.SelectSingleNode("//responseNs:DeletePortMappingResponse", nsm)) != null)
- return new DeletePortMapResponseMessage();
-
- if ((node = doc.SelectSingleNode("//responseNs:GetExternalIPAddressResponse", nsm)) != null) {
- string newExternalIPAddress = node["NewExternalIPAddress"] != null ? node["NewExternalIPAddress"].InnerText : "";
- return new GetExternalIPAddressResponseMessage(newExternalIPAddress);
- }
-
- if ((node = doc.SelectSingleNode("//responseNs:GetGenericPortMappingEntryResponse", nsm)) != null)
- return new GetGenericPortMappingEntryResponseMessage(node, true);
-
- if ((node = doc.SelectSingleNode("//responseNs:GetSpecificPortMappingEntryResponse", nsm)) != null)
- return new GetGenericPortMappingEntryResponseMessage(node, false);
-
- NatUtility.Log("Unknown message returned. Please send me back the following XML:");
- NatUtility.Log(message);
- return null;
+ public virtual string Method
+ {
+ get { return "POST"; }
}
- public abstract WebRequest Encode(out byte[] body);
-
internal static void WriteFullElement(XmlWriter writer, string element, string value)
{
writer.WriteStartElement(element);