aboutsummaryrefslogtreecommitdiff
path: root/Emby.Dlna/Service/BaseControlHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Dlna/Service/BaseControlHandler.cs')
-rw-r--r--Emby.Dlna/Service/BaseControlHandler.cs242
1 files changed, 0 insertions, 242 deletions
diff --git a/Emby.Dlna/Service/BaseControlHandler.cs b/Emby.Dlna/Service/BaseControlHandler.cs
deleted file mode 100644
index bff5307a4..000000000
--- a/Emby.Dlna/Service/BaseControlHandler.cs
+++ /dev/null
@@ -1,242 +0,0 @@
-#pragma warning disable CS1591
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using System.Threading.Tasks;
-using System.Xml;
-using Emby.Dlna.Didl;
-using Jellyfin.Extensions;
-using MediaBrowser.Controller.Configuration;
-using Microsoft.Extensions.Logging;
-
-namespace Emby.Dlna.Service
-{
- public abstract class BaseControlHandler
- {
- private const string NsSoapEnv = "http://schemas.xmlsoap.org/soap/envelope/";
-
- protected BaseControlHandler(IServerConfigurationManager config, ILogger logger)
- {
- Config = config;
- Logger = logger;
- }
-
- protected IServerConfigurationManager Config { get; }
-
- protected ILogger Logger { get; }
-
- public async Task<ControlResponse> ProcessControlRequestAsync(ControlRequest request)
- {
- try
- {
- LogRequest(request);
-
- var response = await ProcessControlRequestInternalAsync(request).ConfigureAwait(false);
- LogResponse(response);
- return response;
- }
- catch (Exception ex)
- {
- Logger.LogError(ex, "Error processing control request");
-
- return ControlErrorHandler.GetResponse(ex);
- }
- }
-
- private async Task<ControlResponse> ProcessControlRequestInternalAsync(ControlRequest request)
- {
- ControlRequestInfo requestInfo;
-
- using (var streamReader = new StreamReader(request.InputXml, Encoding.UTF8))
- {
- var readerSettings = new XmlReaderSettings()
- {
- ValidationType = ValidationType.None,
- CheckCharacters = false,
- IgnoreProcessingInstructions = true,
- IgnoreComments = true,
- Async = true
- };
-
- using var reader = XmlReader.Create(streamReader, readerSettings);
- requestInfo = await ParseRequestAsync(reader).ConfigureAwait(false);
- }
-
- Logger.LogDebug("Received control request {LocalName}, params: {@Headers}", requestInfo.LocalName, requestInfo.Headers);
-
- return CreateControlResponse(requestInfo);
- }
-
- private ControlResponse CreateControlResponse(ControlRequestInfo requestInfo)
- {
- var settings = new XmlWriterSettings
- {
- Encoding = Encoding.UTF8,
- CloseOutput = false
- };
-
- StringWriter builder = new StringWriterWithEncoding(Encoding.UTF8);
-
- using (var writer = XmlWriter.Create(builder, settings))
- {
- writer.WriteStartDocument(true);
-
- writer.WriteStartElement("SOAP-ENV", "Envelope", NsSoapEnv);
- writer.WriteAttributeString(string.Empty, "encodingStyle", NsSoapEnv, "http://schemas.xmlsoap.org/soap/encoding/");
-
- writer.WriteStartElement("SOAP-ENV", "Body", NsSoapEnv);
- writer.WriteStartElement("u", requestInfo.LocalName + "Response", requestInfo.NamespaceURI);
-
- WriteResult(requestInfo.LocalName, requestInfo.Headers, writer);
-
- writer.WriteFullEndElement();
- writer.WriteFullEndElement();
-
- writer.WriteFullEndElement();
- writer.WriteEndDocument();
- }
-
- var xml = builder.ToString().Replace("xmlns:m=", "xmlns:u=", StringComparison.Ordinal);
-
- var controlResponse = new ControlResponse(xml, true);
-
- controlResponse.Headers.Add("EXT", string.Empty);
-
- return controlResponse;
- }
-
- private async Task<ControlRequestInfo> ParseRequestAsync(XmlReader reader)
- {
- await reader.MoveToContentAsync().ConfigureAwait(false);
- await reader.ReadAsync().ConfigureAwait(false);
-
- // Loop through each element
- while (!reader.EOF && reader.ReadState == ReadState.Interactive)
- {
- if (reader.NodeType == XmlNodeType.Element)
- {
- if (string.Equals(reader.LocalName, "Body", StringComparison.Ordinal))
- {
- if (reader.IsEmptyElement)
- {
- await reader.ReadAsync().ConfigureAwait(false);
- continue;
- }
-
- using var subReader = reader.ReadSubtree();
- return await ParseBodyTagAsync(subReader).ConfigureAwait(false);
- }
-
- await reader.SkipAsync().ConfigureAwait(false);
- }
- else
- {
- await reader.ReadAsync().ConfigureAwait(false);
- }
- }
-
- throw new EndOfStreamException("Stream ended but no body tag found.");
- }
-
- private async Task<ControlRequestInfo> ParseBodyTagAsync(XmlReader reader)
- {
- string? namespaceURI = null, localName = null;
-
- await reader.MoveToContentAsync().ConfigureAwait(false);
- await reader.ReadAsync().ConfigureAwait(false);
-
- // Loop through each element
- while (!reader.EOF && reader.ReadState == ReadState.Interactive)
- {
- if (reader.NodeType == XmlNodeType.Element)
- {
- localName = reader.LocalName;
- namespaceURI = reader.NamespaceURI;
-
- if (reader.IsEmptyElement)
- {
- await reader.ReadAsync().ConfigureAwait(false);
- }
- else
- {
- var result = new ControlRequestInfo(localName, namespaceURI);
- using var subReader = reader.ReadSubtree();
- await ParseFirstBodyChildAsync(subReader, result.Headers).ConfigureAwait(false);
- return result;
- }
- }
- else
- {
- await reader.ReadAsync().ConfigureAwait(false);
- }
- }
-
- if (localName is not null && namespaceURI is not null)
- {
- return new ControlRequestInfo(localName, namespaceURI);
- }
-
- throw new EndOfStreamException("Stream ended but no control found.");
- }
-
- private async Task ParseFirstBodyChildAsync(XmlReader reader, IDictionary<string, string> headers)
- {
- await reader.MoveToContentAsync().ConfigureAwait(false);
- await reader.ReadAsync().ConfigureAwait(false);
-
- // Loop through each element
- while (!reader.EOF && reader.ReadState == ReadState.Interactive)
- {
- if (reader.NodeType == XmlNodeType.Element)
- {
- // TODO: Should we be doing this here, or should it be handled earlier when decoding the request?
- headers[reader.LocalName.RemoveDiacritics()] = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);
- }
- else
- {
- await reader.ReadAsync().ConfigureAwait(false);
- }
- }
- }
-
- protected abstract void WriteResult(string methodName, IReadOnlyDictionary<string, string> methodParams, XmlWriter xmlWriter);
-
- private void LogRequest(ControlRequest request)
- {
- if (!Config.GetDlnaConfiguration().EnableDebugLog)
- {
- return;
- }
-
- Logger.LogDebug("Control request. Headers: {@Headers}", request.Headers);
- }
-
- private void LogResponse(ControlResponse response)
- {
- if (!Config.GetDlnaConfiguration().EnableDebugLog)
- {
- return;
- }
-
- Logger.LogDebug("Control response. Headers: {@Headers}\n{Xml}", response.Headers, response.Xml);
- }
-
- private class ControlRequestInfo
- {
- public ControlRequestInfo(string localName, string namespaceUri)
- {
- LocalName = localName;
- NamespaceURI = namespaceUri;
- Headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
- }
-
- public string LocalName { get; set; }
-
- public string NamespaceURI { get; set; }
-
- public Dictionary<string, string> Headers { get; }
- }
- }
-}