diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtils.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtils.java index 1e6c994ba..d61a9be96 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtils.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtils.java @@ -18,6 +18,11 @@ package com.tencent.cloud.polaris.router.feign; +import com.tencent.cloud.common.util.expresstion.ExpressionLabelUtils; +import feign.RequestTemplate; +import org.apache.commons.lang.StringUtils; +import org.springframework.util.CollectionUtils; + import java.net.URI; import java.util.Collection; import java.util.Collections; @@ -25,12 +30,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; -import com.tencent.cloud.common.util.expresstion.ExpressionLabelUtils; -import feign.RequestTemplate; -import org.apache.commons.lang.StringUtils; - -import org.springframework.util.CollectionUtils; - /** * Resolve rule expression label from feign request. * @@ -63,6 +62,13 @@ public final class FeignExpressionLabelUtils { } labels.put(labelKey, getQueryValue(request, queryKey)); } + else if (ExpressionLabelUtils.isCookieLabel(labelKey)) { + String cookieKey = ExpressionLabelUtils.parseCookieKey(labelKey); + if (StringUtils.isBlank(cookieKey)) { + continue; + } + labels.put(labelKey, getCookieValue(request, cookieKey)); + } else if (ExpressionLabelUtils.isMethodLabel(labelKey)) { labels.put(labelKey, request.method()); } @@ -84,4 +90,9 @@ public final class FeignExpressionLabelUtils { public static String getQueryValue(RequestTemplate request, String key) { return ExpressionLabelUtils.getFirstValue(request.queries(), key); } + + public static String getCookieValue(RequestTemplate request, String key) { + Map> headers = request.headers(); + return ExpressionLabelUtils.getCookieFirstValue(headers, key); + } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtilsTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtilsTest.java index b57ac2692..a829e7188 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtilsTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/feign/FeignExpressionLabelUtilsTest.java @@ -18,14 +18,15 @@ package com.tencent.cloud.polaris.router.feign; -import java.util.HashMap; -import java.util.Map; -import java.util.stream.Stream; - import feign.Request; import feign.RequestTemplate; import org.junit.jupiter.api.Test; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Stream; + import static java.util.stream.Collectors.toSet; import static org.assertj.core.api.Assertions.assertThat; @@ -137,4 +138,24 @@ public class FeignExpressionLabelUtilsTest { assertThat(result).isNotEmpty(); assertThat(result.get(labelKey1)).isEqualTo(uri); } + + @Test + public void testGetCookie() { + String uri = "/"; + String cookieValue = "zhangsan"; + + RequestTemplate requestTemplate = new RequestTemplate(); + requestTemplate.uri(uri); + requestTemplate.method(Request.HttpMethod.GET); + requestTemplate.target("http://localhost"); + requestTemplate = requestTemplate.resolve(new HashMap<>()); + requestTemplate.header("cookie", Collections.singleton("uid=zhangsan")); + + String labelKey1 = "${http.cookie.uid}"; + Map result = FeignExpressionLabelUtils.resolve(requestTemplate, Stream.of(labelKey1) + .collect(toSet())); + + assertThat(result).isNotEmpty(); + assertThat(result.get(labelKey1)).isEqualTo(cookieValue); + } } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/expresstion/ExpressionLabelUtils.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/expresstion/ExpressionLabelUtils.java index 9fb1038c8..a3e464987 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/expresstion/ExpressionLabelUtils.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/expresstion/ExpressionLabelUtils.java @@ -23,6 +23,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import io.netty.handler.codec.http.HttpHeaderNames; import org.apache.commons.lang.StringUtils; import org.springframework.util.CollectionUtils; @@ -170,4 +171,31 @@ public final class ExpressionLabelUtils { return StringUtils.EMPTY; } + + public static String getCookieFirstValue(Map> valueMaps, String key) { + if (CollectionUtils.isEmpty(valueMaps)) { + return StringUtils.EMPTY; + } + + Collection values = valueMaps.get(HttpHeaderNames.COOKIE.toString()); + + if (CollectionUtils.isEmpty(values)) { + return StringUtils.EMPTY; + } + + for (String value : values) { + String[] split = value.split("="); + if (split.length == 0) { + return StringUtils.EMPTY; + } + if (StringUtils.isEmpty(split[0]) || StringUtils.isEmpty(split[1])) { + return StringUtils.EMPTY; + } + if (key.equals(split[0])) { + return split[1]; + } + } + + return StringUtils.EMPTY; + } }