mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 22:30:50 +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]))
 | 
					                    if (IsPlaceholder(upstreamUrlPathTemplate[counterForTemplate]))
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        var variableName = GetPlaceholderVariableName(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);
 | 
					                        var templateVariableNameAndValue = new UrlPathPlaceholderNameAndValue(variableName, variableValue);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -40,15 +40,15 @@ namespace Ocelot.DownstreamRouteFinder.UrlMatcher
 | 
				
			|||||||
            return new OkResponse<List<UrlPathPlaceholderNameAndValue>>(templateKeysAndValues);
 | 
					            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);
 | 
					            var positionOfNextSlash = urlPath.IndexOf('/', counterForUrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if(positionOfNextSlash == -1)
 | 
					            if (positionOfNextSlash == -1 || urlPathTemplate.Trim('/').EndsWith(variableName))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                positionOfNextSlash = urlPath.Length;
 | 
					                positionOfNextSlash = urlPath.Length;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            
 | 
					
 | 
				
			||||||
            var variableValue = urlPath.Substring(counterForUrl, positionOfNextSlash - counterForUrl);
 | 
					            var variableValue = urlPath.Substring(counterForUrl, positionOfNextSlash - counterForUrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return variableValue;
 | 
					            return variableValue;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -46,7 +46,6 @@ namespace Ocelot.AcceptanceTests
 | 
				
			|||||||
                            DownstreamPort = 51879,
 | 
					                            DownstreamPort = 51879,
 | 
				
			||||||
                            UpstreamPathTemplate = "/",
 | 
					                            UpstreamPathTemplate = "/",
 | 
				
			||||||
                            UpstreamHttpMethod = "Get",
 | 
					                            UpstreamHttpMethod = "Get",
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
@@ -292,6 +291,34 @@ namespace Ocelot.AcceptanceTests
 | 
				
			|||||||
                .BDDfy();
 | 
					                .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)
 | 
					        private void GivenThereIsAServiceRunningOn(string url, int statusCode, string responseBody)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            _builder = new WebHostBuilder()
 | 
					            _builder = new WebHostBuilder()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -140,6 +140,21 @@ namespace Ocelot.UnitTests.DownstreamRouteFinder.UrlMatcher
 | 
				
			|||||||
                 .BDDfy();
 | 
					                 .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)
 | 
					        private void ThenTheTemplatesVariablesAre(List<UrlPathPlaceholderNameAndValue> expectedResults)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            foreach (var expectedResult in expectedResults)
 | 
					            foreach (var expectedResult in expectedResults)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user