Skip to content

Commit

Permalink
fix: dynamic routing using cookies. (#1151)
Browse files Browse the repository at this point in the history
  • Loading branch information
blankjee authored Sep 27, 2023
1 parent a9515fc commit 1637912
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
- [feat:support service contract reporting.](https://github.com/Tencent/spring-cloud-tencent/pull/1140)
- [feat:add swagger exposure filters.](https://github.com/Tencent/spring-cloud-tencent/pull/1145)
- [feat:add swagger report switch.](https://github.com/Tencent/spring-cloud-tencent/pull/1149)
- [fix: dynamic routing using cookies.](https://github.com/Tencent/spring-cloud-tencent/pull/1097)
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,13 @@ else if (ExpressionLabelUtils.isQueryLabel(labelKey)) {
}
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());
}
Expand All @@ -83,4 +90,9 @@ public static String getHeaderValue(RequestTemplate request, String key) {
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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package com.tencent.cloud.polaris.router.feign;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
Expand Down Expand Up @@ -138,4 +139,24 @@ public void testGetUri2() {
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; auth-token=dfhuwshfy77"));

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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
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;
Expand Down Expand Up @@ -169,4 +170,27 @@ public static String getFirstValue(Map<String, Collection<String>> valueMaps, St

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[] cookieArray = StringUtils.split(value, ";");
for (String cookieValue : cookieArray) {
String[] cookieKV = StringUtils.split(cookieValue, "=");
if (cookieKV != null && cookieKV.length == 2 && StringUtils.equals(cookieKV[0], key)) {
return cookieKV[1];
}
}
}
return StringUtils.EMPTY;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,13 @@ else if (ExpressionLabelUtils.isQueryLabel(labelKey)) {
}
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.getMethodValue());
}
Expand Down Expand Up @@ -158,4 +165,19 @@ public static String getQueryValue(HttpRequest request, String key) {
String query = request.getURI().getQuery();
return ExpressionLabelUtils.getQueryValue(query, key);
}

public static String getCookieValue(HttpRequest request, String key) {
String first = request.getHeaders().getFirst(HttpHeaders.COOKIE);
if (StringUtils.isEmpty(first)) {
return StringUtils.EMPTY;
}
String[] cookieArray = StringUtils.split(first, ";");
for (String cookieItem : cookieArray) {
String[] cookieKv = StringUtils.split(cookieItem, "=");
if (cookieKv != null && cookieKv.length == 2 && StringUtils.equals(cookieKv[0], key)) {
return cookieKv[1];
}
}
return StringUtils.EMPTY;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -197,12 +197,13 @@ public void testResolveHttpRequest() {
request.setMethod(HttpMethod.GET);
request.setURI(URI.create("http://calleeService/user/get?uid=zhangsan"));
request.getHeaders().add("uid", "zhangsan");
request.getHeaders().add("cookie", "uid=zhangsan; auth-token=hauigdfu8esgf8");

Map<String, String> result = SpringWebExpressionLabelUtils.resolve(request, labelKeys);

assertThat(result.get(validLabel1)).isEqualTo("zhangsan");
assertThat(result.get(validLabel2)).isEqualTo("zhangsan");
assertThat(result.get(validLabel3)).isNull();
assertThat(result.get(validLabel3)).isEqualTo("zhangsan");
assertThat(result.get(validLabel4)).isEqualTo("GET");
assertThat(result.get(validLabel5)).isEqualTo("/user/get");
assertThat(result.get(invalidLabel1)).isNull();
Expand Down

0 comments on commit 1637912

Please sign in to comment.