Use async methods

This commit is contained in:
Bond-009 2020-01-21 17:59:41 +01:00
parent 2610f377c0
commit ac3b958c67
8 changed files with 68 additions and 75 deletions

View File

@ -170,32 +170,32 @@ namespace Emby.Dlna.Api
return _resultFactory.GetResult(Request, xml, XMLContentType); return _resultFactory.GetResult(Request, xml, XMLContentType);
} }
public object Post(ProcessMediaReceiverRegistrarControlRequest request) public async Task<object> Post(ProcessMediaReceiverRegistrarControlRequest request)
{ {
var response = PostAsync(request.RequestStream, MediaReceiverRegistrar); var response = await PostAsync(request.RequestStream, MediaReceiverRegistrar).ConfigureAwait(false);
return _resultFactory.GetResult(Request, response.Xml, XMLContentType); return _resultFactory.GetResult(Request, response.Xml, XMLContentType);
} }
public object Post(ProcessContentDirectoryControlRequest request) public async Task<object> Post(ProcessContentDirectoryControlRequest request)
{ {
var response = PostAsync(request.RequestStream, ContentDirectory); var response = await PostAsync(request.RequestStream, ContentDirectory).ConfigureAwait(false);
return _resultFactory.GetResult(Request, response.Xml, XMLContentType); return _resultFactory.GetResult(Request, response.Xml, XMLContentType);
} }
public object Post(ProcessConnectionManagerControlRequest request) public async Task<object> Post(ProcessConnectionManagerControlRequest request)
{ {
var response = PostAsync(request.RequestStream, ConnectionManager); var response = await PostAsync(request.RequestStream, ConnectionManager).ConfigureAwait(false);
return _resultFactory.GetResult(Request, response.Xml, XMLContentType); return _resultFactory.GetResult(Request, response.Xml, XMLContentType);
} }
private ControlResponse PostAsync(Stream requestStream, IUpnpService service) private Task<ControlResponse> PostAsync(Stream requestStream, IUpnpService service)
{ {
var id = GetPathValue(2).ToString(); var id = GetPathValue(2).ToString();
return service.ProcessControlRequest(new ControlRequest return service.ProcessControlRequestAsync(new ControlRequest
{ {
Headers = Request.Headers, Headers = Request.Headers,
InputXml = requestStream, InputXml = requestStream,

View File

@ -1,3 +1,4 @@
using System.Threading.Tasks;
using Emby.Dlna.Service; using Emby.Dlna.Service;
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
@ -20,17 +21,19 @@ namespace Emby.Dlna.ConnectionManager
_logger = logger; _logger = logger;
} }
/// <inheritdoc />
public string GetServiceXml() public string GetServiceXml()
{ {
return new ConnectionManagerXmlBuilder().GetXml(); return new ConnectionManagerXmlBuilder().GetXml();
} }
public ControlResponse ProcessControlRequest(ControlRequest request) /// <inheritdoc />
public Task<ControlResponse> ProcessControlRequestAsync(ControlRequest request)
{ {
var profile = _dlna.GetProfile(request.Headers) ?? var profile = _dlna.GetProfile(request.Headers) ??
_dlna.GetDefaultProfile(); _dlna.GetDefaultProfile();
return new ControlHandler(_config, _logger, profile).ProcessControlRequest(request); return new ControlHandler(_config, _logger, profile).ProcessControlRequestAsync(request);
} }
} }
} }

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Emby.Dlna.Service; using Emby.Dlna.Service;
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
@ -66,12 +67,14 @@ namespace Emby.Dlna.ContentDirectory
} }
} }
/// <inheritdoc />
public string GetServiceXml() public string GetServiceXml()
{ {
return new ContentDirectoryXmlBuilder().GetXml(); return new ContentDirectoryXmlBuilder().GetXml();
} }
public ControlResponse ProcessControlRequest(ControlRequest request) /// <inheritdoc />
public Task<ControlResponse> ProcessControlRequestAsync(ControlRequest request)
{ {
var profile = _dlna.GetProfile(request.Headers) ?? var profile = _dlna.GetProfile(request.Headers) ??
_dlna.GetDefaultProfile(); _dlna.GetDefaultProfile();
@ -96,7 +99,7 @@ namespace Emby.Dlna.ContentDirectory
_userViewManager, _userViewManager,
_mediaEncoder, _mediaEncoder,
_tvSeriesManager) _tvSeriesManager)
.ProcessControlRequest(request); .ProcessControlRequestAsync(request);
} }
private User GetUser(DeviceProfile profile) private User GetUser(DeviceProfile profile)

View File

@ -76,7 +76,7 @@ namespace Emby.Dlna.ContentDirectory
_profile = profile; _profile = profile;
_config = config; _config = config;
_didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization, mediaSourceManager, _logger, mediaEncoder); _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization, mediaSourceManager, Logger, mediaEncoder);
} }
protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, IDictionary<string, string> methodParams) protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, IDictionary<string, string> methodParams)
@ -1336,7 +1336,7 @@ namespace Emby.Dlna.ContentDirectory
}; };
} }
_logger.LogError("Error parsing item Id: {id}. Returning user root folder.", id); Logger.LogError("Error parsing item Id: {id}. Returning user root folder.", id);
return new ServerItem(_libraryManager.GetUserRootFolder()); return new ServerItem(_libraryManager.GetUserRootFolder());
} }

View File

@ -1,3 +1,5 @@
using System.Threading.Tasks;
namespace Emby.Dlna namespace Emby.Dlna
{ {
public interface IUpnpService public interface IUpnpService
@ -13,6 +15,6 @@ namespace Emby.Dlna
/// </summary> /// </summary>
/// <param name="request">The request.</param> /// <param name="request">The request.</param>
/// <returns>ControlResponse.</returns> /// <returns>ControlResponse.</returns>
ControlResponse ProcessControlRequest(ControlRequest request); Task<ControlResponse> ProcessControlRequestAsync(ControlRequest request);
} }
} }

View File

@ -1,3 +1,4 @@
using System.Threading.Tasks;
using Emby.Dlna.Service; using Emby.Dlna.Service;
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
@ -15,17 +16,19 @@ namespace Emby.Dlna.MediaReceiverRegistrar
_config = config; _config = config;
} }
/// <inheritdoc />
public string GetServiceXml() public string GetServiceXml()
{ {
return new MediaReceiverRegistrarXmlBuilder().GetXml(); return new MediaReceiverRegistrarXmlBuilder().GetXml();
} }
public ControlResponse ProcessControlRequest(ControlRequest request) /// <inheritdoc />
public Task<ControlResponse> ProcessControlRequestAsync(ControlRequest request)
{ {
return new ControlHandler( return new ControlHandler(
_config, _config,
Logger) Logger)
.ProcessControlRequest(request); .ProcessControlRequestAsync(request);
} }
} }
} }

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks;
using System.Xml; using System.Xml;
using Emby.Dlna.Didl; using Emby.Dlna.Didl;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
@ -15,44 +16,34 @@ namespace Emby.Dlna.Service
{ {
private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/"; private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
protected readonly IServerConfigurationManager Config; protected IServerConfigurationManager Config { get; }
protected readonly ILogger _logger; protected ILogger Logger { get; }
protected BaseControlHandler(IServerConfigurationManager config, ILogger logger) protected BaseControlHandler(IServerConfigurationManager config, ILogger logger)
{ {
Config = config; Config = config;
_logger = logger; Logger = logger;
} }
public ControlResponse ProcessControlRequest(ControlRequest request) public async Task<ControlResponse> ProcessControlRequestAsync(ControlRequest request)
{ {
try try
{ {
var enableDebugLogging = Config.GetDlnaConfiguration().EnableDebugLog; LogRequest(request);
if (enableDebugLogging)
{
LogRequest(request);
}
var response = ProcessControlRequestInternal(request);
if (enableDebugLogging)
{
LogResponse(response);
}
var response = await ProcessControlRequestInternalAsync(request).ConfigureAwait(false);
LogResponse(response);
return response; return response;
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Error processing control request"); Logger.LogError(ex, "Error processing control request");
return new ControlErrorHandler().GetResponse(ex); return ControlErrorHandler.GetResponse(ex);
} }
} }
private ControlResponse ProcessControlRequestInternal(ControlRequest request) private async Task<ControlResponse> ProcessControlRequestInternalAsync(ControlRequest request)
{ {
ControlRequestInfo requestInfo = null; ControlRequestInfo requestInfo = null;
@ -69,19 +60,18 @@ namespace Emby.Dlna.Service
using (var reader = XmlReader.Create(streamReader, readerSettings)) using (var reader = XmlReader.Create(streamReader, readerSettings))
{ {
requestInfo = ParseRequest(reader); requestInfo = await ParseRequestAsync(reader).ConfigureAwait(false);
} }
} }
_logger.LogDebug("Received control request {0}", requestInfo.LocalName); Logger.LogDebug("Received control request {0}", requestInfo.LocalName);
var result = GetResult(requestInfo.LocalName, requestInfo.Headers); var result = GetResult(requestInfo.LocalName, requestInfo.Headers);
var settings = new XmlWriterSettings var settings = new XmlWriterSettings
{ {
Encoding = Encoding.UTF8, Encoding = Encoding.UTF8,
CloseOutput = false, CloseOutput = false
Async = true
}; };
StringWriter builder = new StringWriterWithEncoding(Encoding.UTF8); StringWriter builder = new StringWriterWithEncoding(Encoding.UTF8);
@ -116,17 +106,15 @@ namespace Emby.Dlna.Service
IsSuccessful = true IsSuccessful = true
}; };
//logger.LogDebug(xml);
controlResponse.Headers.Add("EXT", string.Empty); controlResponse.Headers.Add("EXT", string.Empty);
return controlResponse; return controlResponse;
} }
private ControlRequestInfo ParseRequest(XmlReader reader) private async Task<ControlRequestInfo> ParseRequestAsync(XmlReader reader)
{ {
reader.MoveToContent(); await reader.MoveToContentAsync().ConfigureAwait(false);
reader.Read(); await reader.ReadAsync().ConfigureAwait(false);
// Loop through each element // Loop through each element
while (!reader.EOF && reader.ReadState == ReadState.Interactive) while (!reader.EOF && reader.ReadState == ReadState.Interactive)
@ -141,37 +129,38 @@ namespace Emby.Dlna.Service
{ {
using (var subReader = reader.ReadSubtree()) using (var subReader = reader.ReadSubtree())
{ {
return ParseBodyTag(subReader); return await ParseBodyTagAsync(subReader).ConfigureAwait(false);
} }
} }
else else
{ {
reader.Read(); await reader.ReadAsync().ConfigureAwait(false);
} }
break; break;
} }
default: default:
{ {
reader.Skip(); await reader.SkipAsync().ConfigureAwait(false);
break; break;
} }
} }
} }
else else
{ {
reader.Read(); await reader.ReadAsync().ConfigureAwait(false);
} }
} }
return new ControlRequestInfo(); return new ControlRequestInfo();
} }
private ControlRequestInfo ParseBodyTag(XmlReader reader) private async Task<ControlRequestInfo> ParseBodyTagAsync(XmlReader reader)
{ {
var result = new ControlRequestInfo(); var result = new ControlRequestInfo();
reader.MoveToContent(); await reader.MoveToContentAsync().ConfigureAwait(false);
reader.Read(); await reader.ReadAsync().ConfigureAwait(false);
// Loop through each element // Loop through each element
while (!reader.EOF && reader.ReadState == ReadState.Interactive) while (!reader.EOF && reader.ReadState == ReadState.Interactive)
@ -185,28 +174,28 @@ namespace Emby.Dlna.Service
{ {
using (var subReader = reader.ReadSubtree()) using (var subReader = reader.ReadSubtree())
{ {
ParseFirstBodyChild(subReader, result.Headers); await ParseFirstBodyChildAsync(subReader, result.Headers).ConfigureAwait(false);
return result; return result;
} }
} }
else else
{ {
reader.Read(); await reader.ReadAsync().ConfigureAwait(false);
} }
} }
else else
{ {
reader.Read(); await reader.ReadAsync().ConfigureAwait(false);
} }
} }
return result; return result;
} }
private void ParseFirstBodyChild(XmlReader reader, IDictionary<string, string> headers) private async Task ParseFirstBodyChildAsync(XmlReader reader, IDictionary<string, string> headers)
{ {
reader.MoveToContent(); await reader.MoveToContentAsync().ConfigureAwait(false);
reader.Read(); await reader.ReadAsync().ConfigureAwait(false);
// Loop through each element // Loop through each element
while (!reader.EOF && reader.ReadState == ReadState.Interactive) while (!reader.EOF && reader.ReadState == ReadState.Interactive)
@ -214,20 +203,20 @@ namespace Emby.Dlna.Service
if (reader.NodeType == XmlNodeType.Element) if (reader.NodeType == XmlNodeType.Element)
{ {
// TODO: Should we be doing this here, or should it be handled earlier when decoding the request? // TODO: Should we be doing this here, or should it be handled earlier when decoding the request?
headers[reader.LocalName.RemoveDiacritics()] = reader.ReadElementContentAsString(); headers[reader.LocalName.RemoveDiacritics()] = await reader.ReadElementContentAsStringAsync().ConfigureAwait(false);
} }
else else
{ {
reader.Read(); await reader.ReadAsync().ConfigureAwait(false);
} }
} }
} }
private class ControlRequestInfo private class ControlRequestInfo
{ {
public string LocalName; public string LocalName { get; set; }
public string NamespaceURI; public string NamespaceURI { get; set; }
public IDictionary<string, string> Headers = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); public Dictionary<string, string> Headers { get; } = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
} }
protected abstract IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, IDictionary<string, string> methodParams); protected abstract IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, IDictionary<string, string> methodParams);
@ -239,10 +228,7 @@ namespace Emby.Dlna.Service
return; return;
} }
var originalHeaders = request.Headers; Logger.LogDebug("Control request. Headers: {@Header}", request.Headers);
var headers = string.Join(", ", originalHeaders.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray());
_logger.LogDebug("Control request. Headers: {0}", headers);
} }
private void LogResponse(ControlResponse response) private void LogResponse(ControlResponse response)
@ -252,11 +238,7 @@ namespace Emby.Dlna.Service
return; return;
} }
var originalHeaders = response.Headers; Logger.LogDebug("Control response. Headers: {@Headers}\n{Xml}", response.Headers, response.Xml);
var headers = string.Join(", ", originalHeaders.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray());
//builder.Append(response.Xml);
_logger.LogDebug("Control response. Headers: {0}", headers);
} }
} }
} }

View File

@ -6,11 +6,11 @@ using Emby.Dlna.Didl;
namespace Emby.Dlna.Service namespace Emby.Dlna.Service
{ {
public class ControlErrorHandler public static class ControlErrorHandler
{ {
private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/"; private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
public ControlResponse GetResponse(Exception ex) public static ControlResponse GetResponse(Exception ex)
{ {
var settings = new XmlWriterSettings var settings = new XmlWriterSettings
{ {