aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Api/MvcRoutePrefix.cs
diff options
context:
space:
mode:
authorBond-009 <bond.009@outlook.com>2019-12-06 12:06:13 +0100
committerBond-009 <bond.009@outlook.com>2019-12-06 12:06:13 +0100
commita2c35e6dba02f068a3f06e5a4e4964e6539069d1 (patch)
treee75984ab85fedceaf96150ad9d5241cf88230a60 /Jellyfin.Api/MvcRoutePrefix.cs
parent94edb5b9f98cf3b06144255eccc988712332f0a8 (diff)
parent935525e77a18061195dea786be71d38fffe82a10 (diff)
Merge remote-tracking branch 'upstream/master' into random
Diffstat (limited to 'Jellyfin.Api/MvcRoutePrefix.cs')
-rw-r--r--Jellyfin.Api/MvcRoutePrefix.cs56
1 files changed, 56 insertions, 0 deletions
diff --git a/Jellyfin.Api/MvcRoutePrefix.cs b/Jellyfin.Api/MvcRoutePrefix.cs
new file mode 100644
index 000000000..e00973094
--- /dev/null
+++ b/Jellyfin.Api/MvcRoutePrefix.cs
@@ -0,0 +1,56 @@
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.ApplicationModels;
+
+namespace Jellyfin.Api
+{
+ /// <summary>
+ /// Route prefixing for ASP.NET MVC.
+ /// </summary>
+ public static class MvcRoutePrefix
+ {
+ /// <summary>
+ /// Adds route prefixes to the MVC conventions.
+ /// </summary>
+ /// <param name="opts">The MVC options.</param>
+ /// <param name="prefixes">The list of prefixes.</param>
+ public static void UseGeneralRoutePrefix(this MvcOptions opts, params string[] prefixes)
+ {
+ opts.Conventions.Insert(0, new RoutePrefixConvention(prefixes));
+ }
+
+ private class RoutePrefixConvention : IApplicationModelConvention
+ {
+ private readonly AttributeRouteModel[] _routePrefixes;
+
+ public RoutePrefixConvention(IEnumerable<string> prefixes)
+ {
+ _routePrefixes = prefixes.Select(p => new AttributeRouteModel(new RouteAttribute(p))).ToArray();
+ }
+
+ public void Apply(ApplicationModel application)
+ {
+ foreach (var controller in application.Controllers)
+ {
+ if (controller.Selectors == null)
+ {
+ continue;
+ }
+
+ var newSelectors = new List<SelectorModel>();
+ foreach (var selector in controller.Selectors)
+ {
+ newSelectors.AddRange(_routePrefixes.Select(routePrefix => new SelectorModel(selector)
+ {
+ AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(routePrefix, selector.AttributeRouteModel)
+ }));
+ }
+
+ controller.Selectors.Clear();
+ newSelectors.ForEach(selector => controller.Selectors.Add(selector));
+ }
+ }
+ }
+ }
+}