From ac7e1cb8767295204baabecc778b5553a3e60777 Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Fri, 22 May 2020 20:54:18 +0200 Subject: [PATCH] Fixed: only run custom path cutting logic when RouteAttribute is used --- .../Middleware/JsonApiMiddleware.cs | 22 +++++++++++++------ .../Middleware/JsonApiMiddlewareTests.cs | 1 + 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/JsonApiDotNetCore/Middleware/JsonApiMiddleware.cs b/src/JsonApiDotNetCore/Middleware/JsonApiMiddleware.cs index c4106c91b9..03d697e7bb 100644 --- a/src/JsonApiDotNetCore/Middleware/JsonApiMiddleware.cs +++ b/src/JsonApiDotNetCore/Middleware/JsonApiMiddleware.cs @@ -12,6 +12,7 @@ using JsonApiDotNetCore.Managers.Contracts; using JsonApiDotNetCore.Models.JsonApiDocuments; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Primitives; using Newtonsoft.Json; @@ -181,7 +182,7 @@ private static string GetBasePath(string resourceName, IJsonApiOptions options, builder.Append(httpRequest.Host); } - string customRoute = GetCustomRoute(httpRequest.Path.Value, resourceName, options.Namespace); + string customRoute = GetCustomRoute(resourceName, options.Namespace, httpRequest.HttpContext); if (!string.IsNullOrEmpty(customRoute)) { builder.Append('/'); @@ -196,13 +197,20 @@ private static string GetBasePath(string resourceName, IJsonApiOptions options, return builder.ToString(); } - private static string GetCustomRoute(string path, string resourceName, string apiNamespace) + private static string GetCustomRoute(string resourceName, string apiNamespace, HttpContext httpContext) { - var trimmedComponents = path.Trim('/').Split('/').ToList(); - var resourceNameIndex = trimmedComponents.FindIndex(c => c == resourceName); - var newComponents = trimmedComponents.Take(resourceNameIndex).ToArray(); - var customRoute = string.Join('/', newComponents); - return customRoute == apiNamespace ? null : customRoute; + var endpoint = httpContext.GetEndpoint(); + var routeAttribute = endpoint.Metadata.GetMetadata(); + if (routeAttribute != null) + { + var trimmedComponents = httpContext.Request.Path.Value.Trim('/').Split('/').ToList(); + var resourceNameIndex = trimmedComponents.FindIndex(c => c == resourceName); + var newComponents = trimmedComponents.Take(resourceNameIndex).ToArray(); + var customRoute = string.Join('/', newComponents); + return customRoute == apiNamespace ? null : customRoute; + } + + return null; } private static bool GetIsRelationshipPath(RouteValueDictionary routeValues) diff --git a/test/UnitTests/Middleware/JsonApiMiddlewareTests.cs b/test/UnitTests/Middleware/JsonApiMiddlewareTests.cs index ba008bb8d6..d3d446e211 100644 --- a/test/UnitTests/Middleware/JsonApiMiddlewareTests.cs +++ b/test/UnitTests/Middleware/JsonApiMiddlewareTests.cs @@ -144,6 +144,7 @@ private static DefaultHttpContext CreateHttpContext(string path, bool isRelation feature.RouteValues["id"] = id; } context.Features.Set(feature); + context.SetEndpoint(new Endpoint(null, new EndpointMetadataCollection(), null)); return context; }