fix: dynamic routing using cookies

pull/1097/head
jealhuang 2 years ago
parent fa5d8c3d46
commit 3bb486befb

@ -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<String, Collection<String>> headers = request.headers();
return ExpressionLabelUtils.getCookieFirstValue(headers, key);
}
}

@ -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<String, String> result = FeignExpressionLabelUtils.resolve(requestTemplate, Stream.of(labelKey1)
.collect(toSet()));
assertThat(result).isNotEmpty();
assertThat(result.get(labelKey1)).isEqualTo(cookieValue);
}
}

@ -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<String, Collection<String>> valueMaps, String key) {
if (CollectionUtils.isEmpty(valueMaps)) {
return StringUtils.EMPTY;
}
Collection<String> 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;
}
}

Loading…
Cancel
Save