mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 18:00:48 +08:00 
			
		
		
		
	Merge pull request #89 from juancash/placeholder_for_final_url_path
Use final paths in the reroutes of configuration.json file.
This commit is contained in:
		@@ -18,8 +18,8 @@ namespace Ocelot.DownstreamRouteFinder.UrlMatcher
 | 
			
		||||
                    if (IsPlaceholder(upstreamUrlPathTemplate[counterForTemplate]))
 | 
			
		||||
                    {
 | 
			
		||||
                        var variableName = GetPlaceholderVariableName(upstreamUrlPathTemplate, counterForTemplate);
 | 
			
		||||
                        
 | 
			
		||||
                        var variableValue = GetPlaceholderVariableValue(upstreamUrlPath, counterForUrl);
 | 
			
		||||
 | 
			
		||||
                        var variableValue = GetPlaceholderVariableValue(upstreamUrlPathTemplate, variableName, upstreamUrlPath, counterForUrl);
 | 
			
		||||
 | 
			
		||||
                        var templateVariableNameAndValue = new UrlPathPlaceholderNameAndValue(variableName, variableValue);
 | 
			
		||||
 | 
			
		||||
@@ -40,15 +40,15 @@ namespace Ocelot.DownstreamRouteFinder.UrlMatcher
 | 
			
		||||
            return new OkResponse<List<UrlPathPlaceholderNameAndValue>>(templateKeysAndValues);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private string GetPlaceholderVariableValue(string urlPath, int counterForUrl)
 | 
			
		||||
        private string GetPlaceholderVariableValue(string urlPathTemplate, string variableName, string urlPath, int counterForUrl)
 | 
			
		||||
        {
 | 
			
		||||
            var positionOfNextSlash = urlPath.IndexOf('/', counterForUrl);
 | 
			
		||||
 | 
			
		||||
            if(positionOfNextSlash == -1)
 | 
			
		||||
            if (positionOfNextSlash == -1 || urlPathTemplate.Trim('/').EndsWith(variableName))
 | 
			
		||||
            {
 | 
			
		||||
                positionOfNextSlash = urlPath.Length;
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            var variableValue = urlPath.Substring(counterForUrl, positionOfNextSlash - counterForUrl);
 | 
			
		||||
 | 
			
		||||
            return variableValue;
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,6 @@ namespace Ocelot.AcceptanceTests
 | 
			
		||||
                            DownstreamPort = 51879,
 | 
			
		||||
                            UpstreamPathTemplate = "/",
 | 
			
		||||
                            UpstreamHttpMethod = "Get",
 | 
			
		||||
 
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
            };
 | 
			
		||||
@@ -292,6 +291,34 @@ namespace Ocelot.AcceptanceTests
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_return_response_200_with_placeholder_for_final_url_path()
 | 
			
		||||
        {
 | 
			
		||||
            var configuration = new FileConfiguration
 | 
			
		||||
            {
 | 
			
		||||
                ReRoutes = new List<FileReRoute>
 | 
			
		||||
                    {
 | 
			
		||||
                        new FileReRoute
 | 
			
		||||
                        {
 | 
			
		||||
                            DownstreamPathTemplate = "/api/{urlPath}",
 | 
			
		||||
                            DownstreamScheme = "http",
 | 
			
		||||
                            DownstreamHost = "localhost",
 | 
			
		||||
                            DownstreamPort = 51879,
 | 
			
		||||
                            UpstreamPathTemplate = "/myApp1Name/api/{urlPath}",
 | 
			
		||||
                            UpstreamHttpMethod = "Get",
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(x => x.GivenThereIsAServiceRunningOn("http://localhost:51879/myApp1Name/api/products/1", 200, "Some Product"))
 | 
			
		||||
                .And(x => _steps.GivenThereIsAConfiguration(configuration))
 | 
			
		||||
                .And(x => _steps.GivenOcelotIsRunning())
 | 
			
		||||
                .When(x => _steps.WhenIGetUrlOnTheApiGateway("/myApp1Name/api/products/1"))
 | 
			
		||||
                .Then(x => _steps.ThenTheStatusCodeShouldBe(HttpStatusCode.OK))
 | 
			
		||||
                .And(x => _steps.ThenTheResponseBodyShouldBe("Some Product"))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenThereIsAServiceRunningOn(string url, int statusCode, string responseBody)
 | 
			
		||||
        {
 | 
			
		||||
            _builder = new WebHostBuilder()
 | 
			
		||||
 
 | 
			
		||||
@@ -140,6 +140,21 @@ namespace Ocelot.UnitTests.DownstreamRouteFinder.UrlMatcher
 | 
			
		||||
                 .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void can_match_down_stream_url_with_downstream_template_with_place_holder_to_final_url_path()
 | 
			
		||||
        {
 | 
			
		||||
            var expectedTemplates = new List<UrlPathPlaceholderNameAndValue>
 | 
			
		||||
            {
 | 
			
		||||
                new UrlPathPlaceholderNameAndValue("{finalUrlPath}", "product/products/categories/"),
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(x => x.GivenIHaveAUpstreamPath("api/product/products/categories/"))
 | 
			
		||||
                 .And(x => x.GivenIHaveAnUpstreamUrlTemplate("api/{finalUrlPath}/"))
 | 
			
		||||
                 .When(x => x.WhenIFindTheUrlVariableNamesAndValues())
 | 
			
		||||
                 .And(x => x.ThenTheTemplatesVariablesAre(expectedTemplates))
 | 
			
		||||
                 .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheTemplatesVariablesAre(List<UrlPathPlaceholderNameAndValue> expectedResults)
 | 
			
		||||
        {
 | 
			
		||||
            foreach (var expectedResult in expectedResults)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user