diff options
Diffstat (limited to 'Emby.Dlna/Api/DlnaServerService.cs')
| -rw-r--r-- | Emby.Dlna/Api/DlnaServerService.cs | 108 |
1 files changed, 77 insertions, 31 deletions
diff --git a/Emby.Dlna/Api/DlnaServerService.cs b/Emby.Dlna/Api/DlnaServerService.cs index 7ddcaf7e6..a451bbcf9 100644 --- a/Emby.Dlna/Api/DlnaServerService.cs +++ b/Emby.Dlna/Api/DlnaServerService.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; using System.Threading.Tasks; using Emby.Dlna.Main; @@ -195,7 +193,7 @@ namespace Emby.Dlna.Api private ControlResponse PostAsync(Stream requestStream, IUpnpService service) { - var id = GetPathValue(2); + var id = GetPathValue(2).ToString(); return service.ProcessControlRequest(new ControlRequest { @@ -206,51 +204,99 @@ namespace Emby.Dlna.Api }); } - protected string GetPathValue(int index) + // Copied from MediaBrowser.Api/BaseApiService.cs + // TODO: Remove code duplication + /// <summary> + /// Gets the path segment at the specified index. + /// </summary> + /// <param name="index">The index of the path segment.</param> + /// <returns>The path segment at the specified index.</returns> + /// <exception cref="IndexOutOfRangeException" >Path doesn't contain enough segments.</exception> + /// <exception cref="InvalidDataException" >Path doesn't start with the base url.</exception> + protected internal ReadOnlySpan<char> GetPathValue(int index) { - var pathInfo = Parse(Request.PathInfo); - var first = pathInfo[0]; + static void ThrowIndexOutOfRangeException() + => throw new IndexOutOfRangeException("Path doesn't contain enough segments."); - string baseUrl = _configurationManager.Configuration.BaseUrl; + static void ThrowInvalidDataException() + => throw new InvalidDataException("Path doesn't start with the base url."); + + ReadOnlySpan<char> path = Request.PathInfo; - // backwards compatibility - if (baseUrl.Length == 0) + // Remove the protocol part from the url + int pos = path.LastIndexOf("://"); + if (pos != -1) { - if (string.Equals(first, "mediabrowser", StringComparison.OrdinalIgnoreCase) - || string.Equals(first, "emby", StringComparison.OrdinalIgnoreCase)) - { - index++; - } + path = path.Slice(pos + 3); } - else if (string.Equals(first, baseUrl.Remove(0, 1))) + + // Remove the query string + pos = path.LastIndexOf('?'); + if (pos != -1) { - index++; - var second = pathInfo[1]; - if (string.Equals(second, "mediabrowser", StringComparison.OrdinalIgnoreCase) - || string.Equals(second, "emby", StringComparison.OrdinalIgnoreCase)) + path = path.Slice(0, pos); + } + + // Remove the domain + pos = path.IndexOf('/'); + if (pos != -1) + { + path = path.Slice(pos); + } + + // Remove base url + string baseUrl = _configurationManager.Configuration.BaseUrl; + int baseUrlLen = baseUrl.Length; + if (baseUrlLen != 0) + { + if (path.StartsWith(baseUrl, StringComparison.OrdinalIgnoreCase)) { - index++; + path = path.Slice(baseUrlLen); + } + else + { + // The path doesn't start with the base url, + // how did we get here? + ThrowInvalidDataException(); } } - return pathInfo[index]; - } + // Remove leading / + path = path.Slice(1); - private static string[] Parse(string pathUri) - { - var actionParts = pathUri.Split(new[] { "://" }, StringSplitOptions.None); + // Backwards compatibility + const string Emby = "emby/"; + if (path.StartsWith(Emby, StringComparison.OrdinalIgnoreCase)) + { + path = path.Slice(Emby.Length); + } - var pathInfo = actionParts[actionParts.Length - 1]; + const string MediaBrowser = "mediabrowser/"; + if (path.StartsWith(MediaBrowser, StringComparison.OrdinalIgnoreCase)) + { + path = path.Slice(MediaBrowser.Length); + } - var optionsPos = pathInfo.LastIndexOf('?'); - if (optionsPos != -1) + // Skip segments until we are at the right index + for (int i = 0; i < index; i++) { - pathInfo = pathInfo.Substring(0, optionsPos); + pos = path.IndexOf('/'); + if (pos == -1) + { + ThrowIndexOutOfRangeException(); + } + + path = path.Slice(pos + 1); } - var args = pathInfo.Split('/'); + // Remove the rest + pos = path.IndexOf('/'); + if (pos != -1) + { + path = path.Slice(0, pos); + } - return args.Skip(1).ToArray(); + return path; } public object Get(GetIcon request) |
