Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ public Response<List<UrlPathPlaceholderNameAndValue>> Find(string upstreamUrlPat
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);

Expand All @@ -40,15 +40,15 @@ public Response<List<UrlPathPlaceholderNameAndValue>> Find(string upstreamUrlPat
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;
Expand Down
29 changes: 28 additions & 1 deletion test/Ocelot.AcceptanceTests/RoutingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ public void should_return_response_200_with_simple_url()
DownstreamPort = 51879,
UpstreamPathTemplate = "/",
UpstreamHttpMethod = "Get",

}
}
};
Expand Down Expand Up @@ -292,6 +291,34 @@ public void should_return_response_201_with_complex_query_string()
.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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,21 @@ public void can_match_down_stream_url_with_downstream_template_with_three_place_
.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)
Expand Down