网关 api 结尾支持多个 /

pull/1800/head
shedfreewu 1 month ago
parent 96f16231cd
commit b1213cddec

@ -374,9 +374,10 @@ public class ContextGatewayFilter implements GatewayFilter, Ordered {
matchPath.append("/").append(pathSegments[i]);
realPath.append("/").append(pathSegments[i]);
}
if (path.endsWith("/")) {
matchPath.append("/");
realPath.append("/");
String trailingSlashes = getTrailingSlashes(path);
if (StringUtils.isNotEmpty(trailingSlashes)) {
matchPath.append(trailingSlashes);
realPath.append(trailingSlashes);
}
return new String[] {matchPath.toString(), realPath.toString()};
}
@ -394,9 +395,10 @@ public class ContextGatewayFilter implements GatewayFilter, Ordered {
matchPath.append("/").append(pathSegments[i]);
realPath.append("/").append(pathSegments[i]);
}
if (path.endsWith("/")) {
matchPath.append("/");
realPath.append("/");
String trailingSlashes = getTrailingSlashes(path);
if (StringUtils.isNotEmpty(trailingSlashes)) {
matchPath.append(trailingSlashes);
realPath.append(trailingSlashes);
}
return new String[] {matchPath.toString(), realPath.toString()};
}
@ -450,9 +452,10 @@ public class ContextGatewayFilter implements GatewayFilter, Ordered {
matchPath.append("/").append(pathSegments[i]);
realPath.append("/").append(pathSegments[i]);
}
if (path.endsWith("/")) {
matchPath.append("/");
realPath.append("/");
String trailingSlashes = getTrailingSlashes(path);
if (StringUtils.isNotEmpty(trailingSlashes)) {
matchPath.append(trailingSlashes);
realPath.append(trailingSlashes);
}
return new String[] {matchPath.toString(), realPath.toString()};
@ -614,4 +617,16 @@ public class ContextGatewayFilter implements GatewayFilter, Ordered {
MetadataContextUtils.putMetadataObjectValue(ContextConstant.Trace.EXTRA_TRACE_ATTRIBUTES, traceAttributes);
}
}
/**
* Returns all trailing slashes of the given path, e.g. "/api/test///" "///"
*/
private String getTrailingSlashes(String path) {
int end = path.length();
int start = end;
while (start > 0 && path.charAt(start - 1) == '/') {
start--;
}
return path.substring(start, end);
}
}

@ -17,6 +17,7 @@
package com.tencent.cloud.plugin.gateway.context;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.Collections;
@ -119,6 +120,20 @@ class ContextGatewayFilterTest {
}
// Test getTrailingSlashes via reflection
@Test
void shouldGetTrailingSlashesCorrectly() throws Exception {
Method method = ContextGatewayFilter.class.getDeclaredMethod("getTrailingSlashes", String.class);
method.setAccessible(true);
assertThat(method.invoke(filter, "/api/test///")).isEqualTo("///");
assertThat(method.invoke(filter, "/api/test/")).isEqualTo("/");
assertThat(method.invoke(filter, "/api/test")).isEqualTo("");
assertThat(method.invoke(filter, "/")).isEqualTo("/");
assertThat(method.invoke(filter, "///")).isEqualTo("///");
assertThat(method.invoke(filter, "")).isEqualTo("");
}
// Helper method to create test predicate
private GroupContext.ContextPredicate createPredicate(ApiType apiType, Position nsPos, Position svcPos) {
GroupContext.ContextPredicate predicate = new GroupContext.ContextPredicate();

Loading…
Cancel
Save