This is an automated email from the ASF dual-hosted git repository.

xiaoyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new 4ba581d0e [ISSUE #3870] fix request plugin can't replaceCookie (#3872)
4ba581d0e is described below

commit 4ba581d0e63edbbc4d5ddd1dfe9748724583bf92
Author: Jairo <[email protected]>
AuthorDate: Mon Aug 29 15:28:57 2022 +0800

    [ISSUE #3870] fix request plugin can't replaceCookie (#3872)
---
 .../shenyu/plugin/request/RequestPlugin.java       |  3 ++-
 .../shenyu/plugin/request/RequestPluginTest.java   | 23 ++++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git 
a/shenyu-plugin/shenyu-plugin-request/src/main/java/org/apache/shenyu/plugin/request/RequestPlugin.java
 
b/shenyu-plugin/shenyu-plugin-request/src/main/java/org/apache/shenyu/plugin/request/RequestPlugin.java
index 7253e770f..94e9f5618 100644
--- 
a/shenyu-plugin/shenyu-plugin-request/src/main/java/org/apache/shenyu/plugin/request/RequestPlugin.java
+++ 
b/shenyu-plugin/shenyu-plugin-request/src/main/java/org/apache/shenyu/plugin/request/RequestPlugin.java
@@ -187,8 +187,9 @@ public class RequestPlugin extends AbstractShenyuPlugin {
     private void replaceCookieKey(final Map.Entry<String, String> 
shenyuCookie, final MultiValueMap<String, HttpCookie> cookies) {
         List<HttpCookie> httpCookies = cookies.get(shenyuCookie.getKey());
         if (Objects.nonNull(httpCookies)) {
-            cookies.addAll(shenyuCookie.getValue(), httpCookies);
             cookies.remove(shenyuCookie.getKey());
+            List<HttpCookie> newKeyCookieList = 
httpCookies.stream().filter(Objects::nonNull).map(cookie -> new 
HttpCookie(shenyuCookie.getValue(), 
cookie.getValue())).collect(Collectors.toList());
+            cookies.addAll(shenyuCookie.getValue(), newKeyCookieList);
         }
     }
 
diff --git 
a/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/RequestPluginTest.java
 
b/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/RequestPluginTest.java
index 746067495..95efbec00 100644
--- 
a/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/RequestPluginTest.java
+++ 
b/shenyu-plugin/shenyu-plugin-request/src/test/java/org/apache/shenyu/plugin/request/RequestPluginTest.java
@@ -18,6 +18,9 @@
 package org.apache.shenyu.plugin.request;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import org.apache.commons.collections4.ListUtils;
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.common.dto.convert.rule.RequestHandle;
@@ -41,11 +44,16 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
 import org.springframework.mock.web.server.MockServerWebExchange;
+import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 import reactor.test.StepVerifier;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -129,6 +137,12 @@ public class RequestPluginTest {
         assertFalse(httpHeaders.containsKey("removeKey"));
         assertTrue(httpHeaders.containsKey(HttpHeaders.COOKIE));
 
+        LinkedMultiValueMap<String, String> cookies = 
getCookieMapFromHeader(httpHeaders);
+        assertTrue(checkMapSizeAndEqualVal(cookies, "addKey", "addValue"));
+        assertTrue(checkMapSizeAndEqualVal(cookies, "newKey", "oldValue"));
+        assertTrue(checkMapSizeAndEqualVal(cookies, "setKey", "newValue"));
+        assertFalse(cookies.containsKey("removeKey"));
+
         MultiValueMap<String, String> queryParams = request.getQueryParams();
         assertNotNull(queryParams);
         assertTrue(checkMapSizeAndEqualVal(queryParams, "addKey", "addValue"));
@@ -150,6 +164,15 @@ public class RequestPluginTest {
         return value.equals(headersOrParams.get(key).get(0));
     }
 
+    private LinkedMultiValueMap<String, String> getCookieMapFromHeader(final 
HttpHeaders httpHeaders) {
+        List<String> cookies = httpHeaders.get(HttpHeaders.COOKIE);
+        return new 
LinkedMultiValueMap<>(ListUtils.emptyIfNull(cookies).stream().map(cookiePair -> 
cookiePair.split(";"))
+                .flatMap(s ->
+                        Arrays.stream(s).filter(cookie -> 
cookie.split("=").length == 2)
+                                .map(cookie -> 
Pair.of(cookie.split("=")[0].trim(), 
Lists.newArrayList(cookie.split("=")[1].trim()))))
+                .collect(Collectors.toMap(Pair::getKey, Pair::getValue, (k, v) 
-> k)));
+    }
+
     @Test
     public void testGetOrder() {
         assertEquals(this.requestPlugin.getOrder(), 
PluginEnum.REQUEST.getCode());

Reply via email to