aboutsummaryrefslogtreecommitdiff
path: root/Emby.Dlna/PlayTo/SsdpHttpClient.cs
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2016-10-29 18:22:20 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2016-10-29 18:22:20 -0400
commitdca78b13411db96366dddfa0d68bb6d36d28ad14 (patch)
tree7d41e670f1cadec0db9e1ed7115e151da891f7ea /Emby.Dlna/PlayTo/SsdpHttpClient.cs
parent597e27d1c6199a40398abb068282711a9cb9db1b (diff)
rework dlna project
Diffstat (limited to 'Emby.Dlna/PlayTo/SsdpHttpClient.cs')
-rw-r--r--Emby.Dlna/PlayTo/SsdpHttpClient.cs139
1 files changed, 139 insertions, 0 deletions
diff --git a/Emby.Dlna/PlayTo/SsdpHttpClient.cs b/Emby.Dlna/PlayTo/SsdpHttpClient.cs
new file mode 100644
index 000000000..a1eb19d9a
--- /dev/null
+++ b/Emby.Dlna/PlayTo/SsdpHttpClient.cs
@@ -0,0 +1,139 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Dlna.Common;
+using System;
+using System.Globalization;
+using System.IO;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace MediaBrowser.Dlna.PlayTo
+{
+ public class SsdpHttpClient
+ {
+ private const string USERAGENT = "Microsoft-Windows/6.2 UPnP/1.0 Microsoft-DLNA DLNADOC/1.50";
+ private const string FriendlyName = "Emby";
+
+ private readonly IHttpClient _httpClient;
+ private readonly IServerConfigurationManager _config;
+
+ public SsdpHttpClient(IHttpClient httpClient, IServerConfigurationManager config)
+ {
+ _httpClient = httpClient;
+ _config = config;
+ }
+
+ public async Task<XDocument> SendCommandAsync(string baseUrl,
+ DeviceService service,
+ string command,
+ string postData,
+ bool logRequest = true,
+ string header = null)
+ {
+ var response = await PostSoapDataAsync(NormalizeServiceUrl(baseUrl, service.ControlUrl), "\"" + service.ServiceType + "#" + command + "\"", postData, header, logRequest)
+ .ConfigureAwait(false);
+
+ using (var stream = response.Content)
+ {
+ using (var reader = new StreamReader(stream, Encoding.UTF8))
+ {
+ return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace);
+ }
+ }
+ }
+
+ private string NormalizeServiceUrl(string baseUrl, string serviceUrl)
+ {
+ // If it's already a complete url, don't stick anything onto the front of it
+ if (serviceUrl.StartsWith("http", StringComparison.OrdinalIgnoreCase))
+ {
+ return serviceUrl;
+ }
+
+ if (!serviceUrl.StartsWith("/"))
+ serviceUrl = "/" + serviceUrl;
+
+ return baseUrl + serviceUrl;
+ }
+
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ public async Task SubscribeAsync(string url,
+ string ip,
+ int port,
+ string localIp,
+ int eventport,
+ int timeOut = 3600)
+ {
+ var options = new HttpRequestOptions
+ {
+ Url = url,
+ UserAgent = USERAGENT,
+ LogErrorResponseBody = true,
+ BufferContent = false
+ };
+
+ options.RequestHeaders["HOST"] = ip + ":" + port.ToString(_usCulture);
+ options.RequestHeaders["CALLBACK"] = "<" + localIp + ":" + eventport.ToString(_usCulture) + ">";
+ options.RequestHeaders["NT"] = "upnp:event";
+ options.RequestHeaders["TIMEOUT"] = "Second-" + timeOut.ToString(_usCulture);
+
+ await _httpClient.SendAsync(options, "SUBSCRIBE").ConfigureAwait(false);
+ }
+
+ public async Task<XDocument> GetDataAsync(string url)
+ {
+ var options = new HttpRequestOptions
+ {
+ Url = url,
+ UserAgent = USERAGENT,
+ LogErrorResponseBody = true,
+ BufferContent = false
+ };
+
+ options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
+
+ using (var stream = await _httpClient.Get(options).ConfigureAwait(false))
+ {
+ using (var reader = new StreamReader(stream, Encoding.UTF8))
+ {
+ return XDocument.Parse(reader.ReadToEnd(), LoadOptions.PreserveWhitespace);
+ }
+ }
+ }
+
+ private Task<HttpResponseInfo> PostSoapDataAsync(string url,
+ string soapAction,
+ string postData,
+ string header,
+ bool logRequest)
+ {
+ if (!soapAction.StartsWith("\""))
+ soapAction = "\"" + soapAction + "\"";
+
+ var options = new HttpRequestOptions
+ {
+ Url = url,
+ UserAgent = USERAGENT,
+ LogRequest = logRequest || _config.GetDlnaConfiguration().EnableDebugLog,
+ LogErrorResponseBody = true,
+ BufferContent = false
+ };
+
+ options.RequestHeaders["SOAPAction"] = soapAction;
+ options.RequestHeaders["Pragma"] = "no-cache";
+ options.RequestHeaders["FriendlyName.DLNA.ORG"] = FriendlyName;
+
+ if (!string.IsNullOrWhiteSpace(header))
+ {
+ options.RequestHeaders["contentFeatures.dlna.org"] = header;
+ }
+
+ options.RequestContentType = "text/xml; charset=\"utf-8\"";
+ options.RequestContent = postData;
+
+ return _httpClient.Post(options);
+ }
+ }
+}