aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/BaseApiService.cs
diff options
context:
space:
mode:
authorBond-009 <bond.009@outlook.com>2019-12-17 17:35:27 +0100
committerGitHub <noreply@github.com>2019-12-17 17:35:27 +0100
commit6b185119aa329764c1ccc57d9be3e81f05680b69 (patch)
treea2dd354a5a55ed9669750ede3f7c00baae4f09be /MediaBrowser.Api/BaseApiService.cs
parent35151553e3fc9ddbe352744af8d832b1337491c8 (diff)
parentdb61a58c39490f86c86c3ee6c6f11743796fb10e (diff)
Merge branch 'master' into namingtests
Diffstat (limited to 'MediaBrowser.Api/BaseApiService.cs')
-rw-r--r--MediaBrowser.Api/BaseApiService.cs135
1 files changed, 98 insertions, 37 deletions
diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs
index 5f1f6c5b1..2b994d279 100644
--- a/MediaBrowser.Api/BaseApiService.cs
+++ b/MediaBrowser.Api/BaseApiService.cs
@@ -1,5 +1,7 @@
using System;
+using System.IO;
using System.Linq;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -16,19 +18,35 @@ namespace MediaBrowser.Api
/// <summary>
/// Class BaseApiService
/// </summary>
- public class BaseApiService : IService, IRequiresRequest
+ public abstract class BaseApiService : IService, IRequiresRequest
{
+ public BaseApiService(
+ ILogger logger,
+ IServerConfigurationManager serverConfigurationManager,
+ IHttpResultFactory httpResultFactory)
+ {
+ Logger = logger;
+ ServerConfigurationManager = serverConfigurationManager;
+ ResultFactory = httpResultFactory;
+ }
+
/// <summary>
- /// Gets or sets the logger.
+ /// Gets the logger.
/// </summary>
/// <value>The logger.</value>
- public ILogger Logger => ApiEntryPoint.Instance.Logger;
+ protected ILogger Logger { get; }
/// <summary>
- /// Gets or sets the HTTP result factory.
+ /// Gets or sets the server configuration manager.
+ /// </summary>
+ /// <value>The server configuration manager.</value>
+ protected IServerConfigurationManager ServerConfigurationManager { get; }
+
+ /// <summary>
+ /// Gets the HTTP result factory.
/// </summary>
/// <value>The HTTP result factory.</value>
- public IHttpResultFactory ResultFactory => ApiEntryPoint.Instance.ResultFactory;
+ protected IHttpResultFactory ResultFactory { get; }
/// <summary>
/// Gets or sets the request context.
@@ -36,10 +54,7 @@ namespace MediaBrowser.Api
/// <value>The request context.</value>
public IRequest Request { get; set; }
- public string GetHeader(string name)
- {
- return Request.Headers[name];
- }
+ public string GetHeader(string name) => Request.Headers[name];
public static string[] SplitValue(string value, char delim)
{
@@ -292,51 +307,97 @@ namespace MediaBrowser.Api
return result;
}
- protected string GetPathValue(int index)
+ /// <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.");
+
+ static void ThrowInvalidDataException()
+ => throw new InvalidDataException("Path doesn't start with the base url.");
- string baseUrl = ApiEntryPoint.Instance.ConfigurationManager.Configuration.BaseUrl;
+ 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)
+ {
+ path = path.Slice(0, pos);
+ }
+
+ // Remove the domain
+ pos = path.IndexOf('/');
+ if (pos != -1)
{
- index++;
- var second = pathInfo[1];
- if (string.Equals(second, "mediabrowser", StringComparison.OrdinalIgnoreCase)
- || string.Equals(second, "emby", StringComparison.OrdinalIgnoreCase))
+ path = path.Slice(pos);
+ }
+
+ // Remove base url
+ string baseUrl = ServerConfigurationManager.Configuration.BaseUrl;
+ int baseUrlLen = baseUrl.Length;
+ if (baseUrlLen != 0)
+ {
+ if (path.StartsWith(baseUrl, StringComparison.OrdinalIgnoreCase))
+ {
+ path = path.Slice(baseUrlLen);
+ }
+ else
{
- index++;
+ // 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;
}
/// <summary>