Browse Source

Solve the URI fetching bug in sentinel-zuul-adapter #1109 (#1605)

Use `getRequestURI` instead of `getServletPath` to get URI of current request(Both in prefix and regex matching).
master
M4Y GitHub 4 years ago
parent
commit
b50ce662bd
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 79 additions and 6 deletions
  1. +6
    -0
      sentinel-adapter/sentinel-zuul-adapter/pom.xml
  2. +8
    -2
      sentinel-adapter/sentinel-zuul-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/gateway/zuul/api/route/PrefixRoutePathMatcher.java
  3. +9
    -4
      sentinel-adapter/sentinel-zuul-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/gateway/zuul/api/route/RegexRoutePathMatcher.java
  4. +56
    -0
      sentinel-adapter/sentinel-zuul-adapter/src/test/java/com/alibaba/csp/sentinel/adapter/gateway/zuul/route/SentinelZuulRouteTest.java

+ 6
- 0
sentinel-adapter/sentinel-zuul-adapter/pom.xml View File

@@ -69,6 +69,12 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.20.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>

+ 8
- 2
sentinel-adapter/sentinel-zuul-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/gateway/zuul/api/route/PrefixRoutePathMatcher.java View File

@@ -17,11 +17,12 @@ package com.alibaba.csp.sentinel.adapter.gateway.zuul.api.route;

import com.alibaba.csp.sentinel.util.AssertUtil;
import com.alibaba.csp.sentinel.util.function.Predicate;

import com.netflix.zuul.context.RequestContext;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;

import javax.servlet.http.HttpServletRequest;

/**
* @author Eric Zhao
* @since 1.6.0
@@ -42,7 +43,12 @@ public class PrefixRoutePathMatcher implements Predicate<RequestContext> {

@Override
public boolean test(RequestContext context) {
String path = context.getRequest().getServletPath();
//Solve the problem of prefix matching
HttpServletRequest request = context.getRequest();
String path = request.getRequestURI();
if (path == null) {
AssertUtil.assertNotBlank(pattern, "requesturi cannot be blank");
}
if (canMatch) {
return pathMatcher.match(pattern, path);
}


+ 9
- 4
sentinel-adapter/sentinel-zuul-adapter/src/main/java/com/alibaba/csp/sentinel/adapter/gateway/zuul/api/route/RegexRoutePathMatcher.java View File

@@ -15,13 +15,13 @@
*/
package com.alibaba.csp.sentinel.adapter.gateway.zuul.api.route;

import java.util.regex.Pattern;

import com.alibaba.csp.sentinel.util.AssertUtil;
import com.alibaba.csp.sentinel.util.function.Predicate;

import com.netflix.zuul.context.RequestContext;

import javax.servlet.http.HttpServletRequest;
import java.util.regex.Pattern;

/**
* @author Eric Zhao
* @since 1.6.0
@@ -39,7 +39,12 @@ public class RegexRoutePathMatcher implements Predicate<RequestContext> {

@Override
public boolean test(RequestContext context) {
String path = context.getRequest().getServletPath();
//Solve the problem of route matching
HttpServletRequest request = context.getRequest();
String path = request.getRequestURI();
if (path == null) {
AssertUtil.assertNotBlank(pattern, "requesturi cannot be blank");
}
return regex.matcher(path).matches();
}



+ 56
- 0
sentinel-adapter/sentinel-zuul-adapter/src/test/java/com/alibaba/csp/sentinel/adapter/gateway/zuul/route/SentinelZuulRouteTest.java View File

@@ -0,0 +1,56 @@
package com.alibaba.csp.sentinel.adapter.gateway.zuul.route;

import com.alibaba.csp.sentinel.adapter.gateway.zuul.api.route.PrefixRoutePathMatcher;
import com.alibaba.csp.sentinel.adapter.gateway.zuul.api.route.RegexRoutePathMatcher;
import com.netflix.zuul.context.RequestContext;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;

import static com.alibaba.csp.sentinel.adapter.gateway.zuul.constants.ZuulConstant.SERVICE_ID_KEY;

/**
* @author: jiangzian
**/
public class SentinelZuulRouteTest {

private final String SERVICE_ID = "servicea";

private final String SERVER_NAME = "www.example.com";
private final String REQUEST_URI = "/servicea/test.jsp";
private final String QUERY_STRING = "param1=value1&param";

private RequestContext requestContext = new RequestContext();


@Before
public void setUp() {
MockHttpServletRequest request = new MockHttpServletRequest();
request.setServerName(SERVER_NAME);
request.setRequestURI(REQUEST_URI);
request.setQueryString(QUERY_STRING);
requestContext.set(SERVICE_ID_KEY, SERVICE_ID);
requestContext.setRequest(request);
RequestContext.testSetCurrentContext(requestContext);
}

@Test
public void testPrefixRoutePathMatche() {
PrefixRoutePathMatcher prefixRoutePathMatcher = new PrefixRoutePathMatcher("/servicea/????.jsp");
Assert.assertTrue(prefixRoutePathMatcher.test(requestContext));

prefixRoutePathMatcher = new PrefixRoutePathMatcher("/servicea/????.do");
Assert.assertTrue(!prefixRoutePathMatcher.test(requestContext));
}

@Test
public void testRegexRoutePathMatcher() {
RegexRoutePathMatcher regexRoutePathMatcher = new RegexRoutePathMatcher("/servicea/[a-zA-z]+(\\.jsp)");
Assert.assertTrue(regexRoutePathMatcher.test(requestContext));

regexRoutePathMatcher = new RegexRoutePathMatcher("/serviceb/[a-zA-z]+(\\.jsp)");
Assert.assertTrue(!regexRoutePathMatcher.test(requestContext));
}

}

Loading…
Cancel
Save