diff options
| author | Bond_009 <bond.009@outlook.com> | 2019-11-17 23:05:39 +0100 |
|---|---|---|
| committer | Bond-009 <bond.009@outlook.com> | 2019-11-25 11:55:24 +0100 |
| commit | 3221e837f9758e90b91f0f6760af1c3b67e04c2d (patch) | |
| tree | 1b0910d5b4a952def733728cd5faa9a4f3cee504 /Emby.Dlna | |
| parent | e7098f1997ee74eb3bdaad33836839ace6d80f64 (diff) | |
* Add support for multi segment base urls
* Make baseurl case-insensitive
Diffstat (limited to 'Emby.Dlna')
| -rw-r--r-- | Emby.Dlna/Api/DlnaServerService.cs | 110 | ||||
| -rw-r--r-- | Emby.Dlna/ContentDirectory/ContentDirectory.cs | 5 |
2 files changed, 83 insertions, 32 deletions
diff --git a/Emby.Dlna/Api/DlnaServerService.cs b/Emby.Dlna/Api/DlnaServerService.cs index 1f137e620c..f64c89389f 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,49 +204,103 @@ 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; + + // Remove the protocol part from the url + int pos = path.LastIndexOf("://"); + if (pos != -1) + { + path = path.Slice(pos + 3); + } - // backwards compatibility - if (baseUrl.Length == 0 - && (string.Equals(first, "mediabrowser", StringComparison.OrdinalIgnoreCase) - || string.Equals(first, "emby", StringComparison.OrdinalIgnoreCase))) + // Remove the query string + pos = path.LastIndexOf('?'); + if (pos != -1) { - index++; + path = path.Slice(0, pos); } - else if (string.Equals(first, baseUrl.Remove(0, 1))) + + // 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) { - index++; - var second = pathInfo[1]; - if (string.Equals(second, "mediabrowser", StringComparison.OrdinalIgnoreCase) - || string.Equals(second, "emby", StringComparison.OrdinalIgnoreCase)) + 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 List<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).ToList(); + return path; } public object Get(GetIcon request) diff --git a/Emby.Dlna/ContentDirectory/ContentDirectory.cs b/Emby.Dlna/ContentDirectory/ContentDirectory.cs index 5175898ab7..78d69b3380 100644 --- a/Emby.Dlna/ContentDirectory/ContentDirectory.cs +++ b/Emby.Dlna/ContentDirectory/ContentDirectory.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using Emby.Dlna.Service; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; @@ -104,7 +103,7 @@ namespace Emby.Dlna.ContentDirectory { if (!string.IsNullOrEmpty(profile.UserId)) { - var user = _userManager.GetUserById(profile.UserId); + var user = _userManager.GetUserById(Guid.Parse(profile.UserId)); if (user != null) { @@ -116,7 +115,7 @@ namespace Emby.Dlna.ContentDirectory if (!string.IsNullOrEmpty(userId)) { - var user = _userManager.GetUserById(userId); + var user = _userManager.GetUserById(Guid.Parse(userId)); if (user != null) { |
