aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/BaseApiService.cs
diff options
context:
space:
mode:
authordkanada <dkanada@users.noreply.github.com>2020-01-08 01:21:09 +0900
committerdkanada <dkanada@users.noreply.github.com>2020-01-08 01:21:09 +0900
commitaca31457c06ea13042accd60e27ab61208a51577 (patch)
treeb734310d099f9b896ccce0b200ab96a3786d168b /MediaBrowser.Api/BaseApiService.cs
parentdee247453e7b5cab1badb6a844af690cdf80aacd (diff)
parent0b592376d59d10d14dbdd248c24f7ec6397c3508 (diff)
merge branch master into media-attachments
Diffstat (limited to 'MediaBrowser.Api/BaseApiService.cs')
-rw-r--r--MediaBrowser.Api/BaseApiService.cs131
1 files changed, 103 insertions, 28 deletions
diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs
index 49f8c6ace..2b994d279 100644
--- a/MediaBrowser.Api/BaseApiService.cs
+++ b/MediaBrowser.Api/BaseApiService.cs
@@ -1,6 +1,7 @@
using System;
-using System.Collections.Generic;
+using System.IO;
using System.Linq;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -17,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.
@@ -37,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)
{
@@ -293,36 +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.");
+
+ ReadOnlySpan<char> path = Request.PathInfo;
- // backwards compatibility
- if (string.Equals(first, "mediabrowser", StringComparison.OrdinalIgnoreCase) ||
- string.Equals(first, "emby", StringComparison.OrdinalIgnoreCase))
+ // Remove the protocol part from the url
+ int pos = path.LastIndexOf("://");
+ if (pos != -1)
{
- index++;
+ path = path.Slice(pos + 3);
}
- return pathInfo[index];
- }
+ // Remove the query string
+ pos = path.LastIndexOf('?');
+ if (pos != -1)
+ {
+ path = path.Slice(0, pos);
+ }
- private static string[] Parse(string pathUri)
- {
- var actionParts = pathUri.Split(new[] { "://" }, StringSplitOptions.None);
+ // Remove the domain
+ pos = path.IndexOf('/');
+ if (pos != -1)
+ {
+ path = path.Slice(pos);
+ }
- var pathInfo = actionParts[actionParts.Length - 1];
+ // 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
+ {
+ // The path doesn't start with the base url,
+ // how did we get here?
+ ThrowInvalidDataException();
+ }
+ }
+
+ // Remove leading /
+ path = path.Slice(1);
+
+ // Backwards compatibility
+ const string Emby = "emby/";
+ if (path.StartsWith(Emby, StringComparison.OrdinalIgnoreCase))
+ {
+ path = path.Slice(Emby.Length);
+ }
- var optionsPos = pathInfo.LastIndexOf('?');
- if (optionsPos != -1)
+ const string MediaBrowser = "mediabrowser/";
+ if (path.StartsWith(MediaBrowser, StringComparison.OrdinalIgnoreCase))
{
- pathInfo = pathInfo.Substring(0, optionsPos);
+ path = path.Slice(MediaBrowser.Length);
}
- var args = pathInfo.Split('/');
+ // Skip segments until we are at the right index
+ for (int i = 0; i < index; i++)
+ {
+ pos = path.IndexOf('/');
+ if (pos == -1)
+ {
+ ThrowIndexOutOfRangeException();
+ }
+
+ path = path.Slice(pos + 1);
+ }
+
+ // Remove the rest
+ pos = path.IndexOf('/');
+ if (pos != -1)
+ {
+ path = path.Slice(0, pos);
+ }
- return args.Skip(1).ToArray();
+ return path;
}
/// <summary>