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/incubator-shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new 45da016  [type:refactor] optimize response & cryptor. (#2304)
45da016 is described below

commit 45da0168d933899595a215a09aa3c79ab88be3ce
Author: Qicz <[email protected]>
AuthorDate: Mon Nov 8 15:16:07 2021 +0800

    [type:refactor] optimize response & cryptor. (#2304)
    
    * [type:refactor] optimize response & cryptor.
    
    * toggle ci again.
    
    * optimize response util.
    
    * optimize response util.
---
 ...ClientResponseUtils.java => ResponseUtils.java} | 63 +++++++++++++++++++---
 ...Decorator.java => CryptorRequestDecorator.java} | 13 ++---
 ...ecorator.java => CryptorResponseDecorator.java} | 27 +++++-----
 .../cryptor/request/CryptorRequestPlugin.java      | 22 ++++----
 .../cryptor/response/CryptorResponsePlugin.java    |  4 +-
 .../utils/{HttpUtil.java => CryptorUtil.java}      | 52 +-----------------
 .../response/CryptorResponsePluginTest.java        | 10 ++--
 .../modify/response/ModifyResponsePlugin.java      | 13 +++--
 8 files changed, 100 insertions(+), 104 deletions(-)

diff --git 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/utils/ClientResponseUtils.java
 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/utils/ResponseUtils.java
similarity index 57%
rename from 
shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/utils/ClientResponseUtils.java
rename to 
shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/utils/ResponseUtils.java
index 2e7b482..623275a 100644
--- 
a/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/utils/ClientResponseUtils.java
+++ 
b/shenyu-plugin/shenyu-plugin-base/src/main/java/org/apache/shenyu/plugin/base/utils/ResponseUtils.java
@@ -25,15 +25,31 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.http.codec.ServerCodecConfigurer;
 import org.springframework.http.server.reactive.ServerHttpResponse;
 import org.springframework.web.reactive.function.client.ClientResponse;
+import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 import java.util.Objects;
 
 /**
- * ClientResponseUtils.
+ * ResponseUtils.
  */
-public final class ClientResponseUtils {
+public final class ResponseUtils {
+
+    private static final String CHUNKED = "chunked";
+
+    /**
+     * create CachedBodyOutputMessage.
+     *
+     * @param exchange ServerWebExchange
+     * @return CachedBodyOutputMessage.
+     */
+    public static CachedBodyOutputMessage newCachedBodyOutputMessage(final 
ServerWebExchange exchange) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.putAll(exchange.getRequest().getHeaders());
+        headers.remove(HttpHeaders.CONTENT_LENGTH);
+        return new CachedBodyOutputMessage(exchange, headers);
+    }
 
     /**
      * build client response with current response data.
@@ -58,12 +74,43 @@ public final class ClientResponseUtils {
      */
     public static Mono<DataBuffer> fixBodyMessage(final ServerHttpResponse 
response,
                                                   final 
CachedBodyOutputMessage outputMessage) {
-        Mono<DataBuffer> messageBody = 
DataBufferUtils.join(outputMessage.getBody());
-        HttpHeaders headers = response.getHeaders();
-        if (!headers.containsKey(HttpHeaders.TRANSFER_ENCODING)
-                || headers.containsKey(HttpHeaders.CONTENT_LENGTH)) {
-            messageBody = messageBody.doOnNext(data -> 
headers.setContentLength(data.readableByteCount()));
+        fixHeaders(response.getHeaders());
+        return DataBufferUtils.join(outputMessage.getBody());
+    }
+
+    /**
+     * release source.
+     * @param outputMessage CachedBodyOutputMessage
+     * @param throwable Throwable
+     * @return Mono.
+     */
+    public static Mono<Void> release(final CachedBodyOutputMessage 
outputMessage, final Throwable throwable) {
+        if (outputMessage.getCache()) {
+            return 
outputMessage.getBody().map(DataBufferUtils::release).then(Mono.error(throwable));
         }
-        return messageBody;
+        return Mono.error(throwable);
+    }
+
+    /**
+     * ChunkedHeader.
+     *
+     * @param headers headers.
+     * @return chunked headers
+     */
+    public static HttpHeaders chunkedHeader(final HttpHeaders headers) {
+        final HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.putAll(headers);
+        fixHeaders(httpHeaders);
+        return httpHeaders;
+    }
+
+    /**
+     * fix headers.
+     *
+     * @param httpHeaders the headers
+     */
+    private static void fixHeaders(final HttpHeaders httpHeaders) {
+        httpHeaders.remove(HttpHeaders.CONTENT_LENGTH);
+        httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, CHUNKED);
     }
 }
diff --git 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/RequestDecorator.java
 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/CryptorRequestDecorator.java
similarity index 78%
rename from 
shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/RequestDecorator.java
rename to 
shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/CryptorRequestDecorator.java
index edf3018..53c1aa1 100644
--- 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/RequestDecorator.java
+++ 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/CryptorRequestDecorator.java
@@ -18,7 +18,7 @@
 package org.apache.shenyu.plugin.cryptor.decorator;
 
 import org.apache.shenyu.plugin.base.support.CachedBodyOutputMessage;
-import org.apache.shenyu.plugin.cryptor.utils.HttpUtil;
+import org.apache.shenyu.plugin.base.utils.ResponseUtils;
 import org.springframework.core.io.buffer.DataBuffer;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
@@ -29,14 +29,14 @@ import reactor.util.annotation.NonNull;
 /**
  * Build and modify the request class.
  */
-public class RequestDecorator extends ServerHttpRequestDecorator {
+public class CryptorRequestDecorator extends ServerHttpRequestDecorator {
 
     private final CachedBodyOutputMessage cachedBodyOutputMessage;
 
     private final ServerWebExchange exchange;
 
-    public RequestDecorator(final ServerWebExchange exchange,
-                            final CachedBodyOutputMessage 
cachedBodyOutputMessage) {
+    public CryptorRequestDecorator(final ServerWebExchange exchange,
+                                   final CachedBodyOutputMessage 
cachedBodyOutputMessage) {
         super(exchange.getRequest());
         this.cachedBodyOutputMessage = cachedBodyOutputMessage;
         this.exchange = exchange;
@@ -51,9 +51,6 @@ public class RequestDecorator extends 
ServerHttpRequestDecorator {
     @Override
     @NonNull
     public HttpHeaders getHeaders() {
-        HttpHeaders headers = new HttpHeaders();
-        headers.putAll(exchange.getRequest().getHeaders());
-        headers.remove(HttpHeaders.CONTENT_LENGTH);
-        return HttpUtil.modifiedContentLength(headers);
+        return 
ResponseUtils.chunkedHeader(this.exchange.getRequest().getHeaders());
     }
 }
diff --git 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/ResponseDecorator.java
 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/CryptorResponseDecorator.java
similarity index 76%
rename from 
shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/ResponseDecorator.java
rename to 
shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/CryptorResponseDecorator.java
index aa2b1d9..41c018c 100644
--- 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/ResponseDecorator.java
+++ 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/decorator/CryptorResponseDecorator.java
@@ -20,10 +20,10 @@ package org.apache.shenyu.plugin.cryptor.decorator;
 import org.apache.shenyu.common.constant.Constants;
 import org.apache.shenyu.plugin.base.support.BodyInserterContext;
 import org.apache.shenyu.plugin.base.support.CachedBodyOutputMessage;
-import org.apache.shenyu.plugin.base.utils.ClientResponseUtils;
+import org.apache.shenyu.plugin.base.utils.ResponseUtils;
 import org.apache.shenyu.plugin.cryptor.dto.CryptorRuleHandle;
 import org.apache.shenyu.plugin.cryptor.strategy.CryptorStrategyFactory;
-import org.apache.shenyu.plugin.cryptor.utils.HttpUtil;
+import org.apache.shenyu.plugin.cryptor.utils.CryptorUtil;
 import org.apache.shenyu.plugin.cryptor.utils.JsonUtil;
 import org.reactivestreams.Publisher;
 import org.springframework.core.io.buffer.DataBuffer;
@@ -36,19 +36,20 @@ import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 import reactor.util.annotation.NonNull;
 
+import java.util.Objects;
 import java.util.function.Function;
 
 /**
  * Build and modify the response class.
  */
-public class ResponseDecorator extends ServerHttpResponseDecorator {
+public class CryptorResponseDecorator extends ServerHttpResponseDecorator {
 
     private final ServerWebExchange exchange;
 
     private final CryptorRuleHandle ruleHandle;
 
-    public ResponseDecorator(final ServerWebExchange exchange,
-                             final CryptorRuleHandle ruleHandle) {
+    public CryptorResponseDecorator(final ServerWebExchange exchange,
+                                    final CryptorRuleHandle ruleHandle) {
         super(exchange.getResponse());
         this.exchange = exchange;
         this.ruleHandle = ruleHandle;
@@ -58,29 +59,29 @@ public class ResponseDecorator extends 
ServerHttpResponseDecorator {
     @NonNull
     @SuppressWarnings("unchecked")
     public Mono<Void> writeWith(@NonNull final Publisher<? extends DataBuffer> 
body) {
-        ClientResponse clientResponse = 
ClientResponseUtils.buildClientResponse(this.getDelegate(), body);
+        ClientResponse clientResponse = 
ResponseUtils.buildClientResponse(this.getDelegate(), body);
         Mono<String> mono = 
clientResponse.bodyToMono(String.class).flatMap(originalBody ->
                         strategyMatch(originalBody, this.ruleHandle, 
this.exchange));
         BodyInserter<Mono<String>, ReactiveHttpOutputMessage> bodyInserter = 
BodyInserters.fromPublisher(mono, String.class);
-        CachedBodyOutputMessage outputMessage = 
HttpUtil.newCachedBodyOutputMessage(exchange);
+        CachedBodyOutputMessage outputMessage = 
ResponseUtils.newCachedBodyOutputMessage(exchange);
         return bodyInserter.insert(outputMessage, new BodyInserterContext())
                 .then(Mono.defer(() -> {
-                    Mono<DataBuffer> messageBody = 
ClientResponseUtils.fixBodyMessage(this.getDelegate(), outputMessage);
+                    Mono<DataBuffer> messageBody = 
ResponseUtils.fixBodyMessage(this.getDelegate(), outputMessage);
                     
exchange.getAttributes().put(Constants.CLIENT_RESPONSE_ATTR, clientResponse);
                     return getDelegate().writeWith(messageBody);
-                })).onErrorResume((Function<Throwable, Mono<Void>>) throwable 
-> HttpUtil.release(outputMessage, throwable));
+                })).onErrorResume((Function<Throwable, Mono<Void>>) throwable 
-> ResponseUtils.release(outputMessage, throwable));
     }
 
     @SuppressWarnings("rawtypes")
     private Mono strategyMatch(final String originalBody, final 
CryptorRuleHandle ruleHandle, final ServerWebExchange exchange) {
         String parseBody = JsonUtil.parser(originalBody, 
ruleHandle.getFieldNames());
-        if (parseBody == null) {
+        if (Objects.isNull(parseBody)) {
             return Mono.just(originalBody);
         }
         String modifiedBody = CryptorStrategyFactory.match(ruleHandle, 
parseBody);
-        if (modifiedBody == null) {
-            return HttpUtil.fail(ruleHandle.getWay(), exchange);
+        if (Objects.isNull(modifiedBody)) {
+            return CryptorUtil.fail(ruleHandle.getWay(), exchange);
         }
-        return HttpUtil.success(originalBody, modifiedBody, 
ruleHandle.getWay(), ruleHandle.getFieldNames());
+        return CryptorUtil.success(originalBody, modifiedBody, 
ruleHandle.getWay(), ruleHandle.getFieldNames());
     }
 }
diff --git 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/request/CryptorRequestPlugin.java
 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/request/CryptorRequestPlugin.java
index 6ea7ff0..cf82419 100644
--- 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/request/CryptorRequestPlugin.java
+++ 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/request/CryptorRequestPlugin.java
@@ -19,7 +19,6 @@ package org.apache.shenyu.plugin.cryptor.request;
 
 import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.dto.SelectorData;
-import org.apache.shenyu.plugin.cryptor.dto.CryptorRuleHandle;
 import org.apache.shenyu.common.enums.PluginEnum;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
 import org.apache.shenyu.plugin.api.result.ShenyuResultEnum;
@@ -29,10 +28,12 @@ import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
 import org.apache.shenyu.plugin.base.support.BodyInserterContext;
 import org.apache.shenyu.plugin.base.support.CachedBodyOutputMessage;
 import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
-import org.apache.shenyu.plugin.cryptor.decorator.RequestDecorator;
+import org.apache.shenyu.plugin.base.utils.ResponseUtils;
+import org.apache.shenyu.plugin.cryptor.decorator.CryptorRequestDecorator;
+import org.apache.shenyu.plugin.cryptor.dto.CryptorRuleHandle;
 import 
org.apache.shenyu.plugin.cryptor.handler.CryptorRequestPluginDataHandler;
 import org.apache.shenyu.plugin.cryptor.strategy.CryptorStrategyFactory;
-import org.apache.shenyu.plugin.cryptor.utils.HttpUtil;
+import org.apache.shenyu.plugin.cryptor.utils.CryptorUtil;
 import org.apache.shenyu.plugin.cryptor.utils.JsonUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -67,7 +68,6 @@ public class CryptorRequestPlugin extends 
AbstractShenyuPlugin {
             LOG.error("Cryptor request rule configuration is null :{}", 
rule.getId());
             return chain.execute(exchange);
         }
-        CachedBodyOutputMessage outputMessage = 
HttpUtil.newCachedBodyOutputMessage(exchange);
         if (JsonUtil.checkParam(ruleHandle)) {
             Object error = 
ShenyuResultWrap.error(ShenyuResultEnum.CRYPTOR_REQUEST_ERROR_CONFIGURATION.getCode(),
                     
ShenyuResultEnum.CRYPTOR_REQUEST_ERROR_CONFIGURATION.getMsg()
@@ -81,12 +81,12 @@ public class CryptorRequestPlugin extends 
AbstractShenyuPlugin {
                 .flatMap(originalBody -> strategyMatch(ruleHandle, 
originalBody, exchange));
 
         BodyInserter<Mono<String>, ReactiveHttpOutputMessage> bodyInserter = 
BodyInserters.fromPublisher(mono, String.class);
+        CachedBodyOutputMessage outputMessage = 
ResponseUtils.newCachedBodyOutputMessage(exchange);
         return bodyInserter.insert(outputMessage, new BodyInserterContext())
                 .then(Mono.defer(() -> {
-                    ServerHttpRequestDecorator decorator = new 
RequestDecorator(exchange, outputMessage);
+                    ServerHttpRequestDecorator decorator = new 
CryptorRequestDecorator(exchange, outputMessage);
                     return 
chain.execute(exchange.mutate().request(decorator).build());
-                })).onErrorResume((Function<Throwable, Mono<Void>>) throwable 
-> HttpUtil.release(outputMessage, throwable));
-
+                })).onErrorResume((Function<Throwable, Mono<Void>>) throwable 
-> ResponseUtils.release(outputMessage, throwable));
     }
 
     @Override
@@ -102,15 +102,15 @@ public class CryptorRequestPlugin extends 
AbstractShenyuPlugin {
     @SuppressWarnings("rawtypes")
     private Mono strategyMatch(final CryptorRuleHandle ruleHandle, final 
String originalBody, final ServerWebExchange exchange) {
         String parseBody = JsonUtil.parser(originalBody, 
ruleHandle.getFieldNames());
-        if (null == parseBody) {
+        if (Objects.isNull(parseBody)) {
             Object error = 
ShenyuResultWrap.error(ShenyuResultEnum.CRYPTOR_REQUEST_ERROR_CONFIGURATION.getCode(),
                     
ShenyuResultEnum.CRYPTOR_REQUEST_ERROR_CONFIGURATION.getMsg() + "[fieldNames]", 
null);
             return WebFluxResultUtils.result(exchange, error);
         }
         String modifiedBody = CryptorStrategyFactory.match(ruleHandle, 
parseBody);
-        if (modifiedBody == null) {
-            return HttpUtil.fail(ruleHandle.getWay(), exchange);
+        if (Objects.isNull(modifiedBody)) {
+            return CryptorUtil.fail(ruleHandle.getWay(), exchange);
         }
-        return HttpUtil.success(originalBody, modifiedBody, 
ruleHandle.getWay(), ruleHandle.getFieldNames());
+        return CryptorUtil.success(originalBody, modifiedBody, 
ruleHandle.getWay(), ruleHandle.getFieldNames());
     }
 }
diff --git 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/response/CryptorResponsePlugin.java
 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/response/CryptorResponsePlugin.java
index 88ce0e4..9c3e515 100644
--- 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/response/CryptorResponsePlugin.java
+++ 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/response/CryptorResponsePlugin.java
@@ -26,7 +26,7 @@ import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
 import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
 import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
 import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
-import org.apache.shenyu.plugin.cryptor.decorator.ResponseDecorator;
+import org.apache.shenyu.plugin.cryptor.decorator.CryptorResponseDecorator;
 import org.apache.shenyu.plugin.cryptor.dto.CryptorRuleHandle;
 import 
org.apache.shenyu.plugin.cryptor.handler.CryptorResponsePluginDataHandler;
 import org.apache.shenyu.plugin.cryptor.utils.JsonUtil;
@@ -57,7 +57,7 @@ public class CryptorResponsePlugin extends 
AbstractShenyuPlugin {
             return WebFluxResultUtils.result(exchange, error);
         }
         return chain.execute(exchange.mutate()
-                .response(new ResponseDecorator(exchange, 
ruleHandle)).build());
+                .response(new CryptorResponseDecorator(exchange, 
ruleHandle)).build());
     }
 
     @Override
diff --git 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/utils/HttpUtil.java
 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/utils/CryptorUtil.java
similarity index 63%
rename from 
shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/utils/HttpUtil.java
rename to 
shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/utils/CryptorUtil.java
index cbaa773..838274e 100644
--- 
a/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/utils/HttpUtil.java
+++ 
b/shenyu-plugin/shenyu-plugin-cryptor/src/main/java/org/apache/shenyu/plugin/cryptor/utils/CryptorUtil.java
@@ -22,10 +22,7 @@ import com.google.gson.JsonParser;
 import org.apache.shenyu.plugin.api.result.ShenyuResultEnum;
 import org.apache.shenyu.plugin.api.result.ShenyuResultWrap;
 import org.apache.shenyu.plugin.api.utils.WebFluxResultUtils;
-import org.apache.shenyu.plugin.base.support.CachedBodyOutputMessage;
 import org.apache.shenyu.plugin.cryptor.strategy.CryptorStrategyFactory;
-import org.springframework.core.io.buffer.DataBufferUtils;
-import org.springframework.http.HttpHeaders;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
@@ -33,53 +30,9 @@ import java.util.Arrays;
 import java.util.concurrent.atomic.AtomicInteger;
 
 /**
- * http util.
+ * cryptor util.
  */
-public class HttpUtil {
-
-    private static final String CHUNKED = "chunked";
-
-    /**
-     * change header.
-     * @param headers headers
-     * @return HttpHeaders.
-     */
-    public static HttpHeaders modifiedContentLength(final HttpHeaders headers) 
{
-        long contentLength = headers.getContentLength();
-        HttpHeaders httpHeaders = new HttpHeaders();
-        httpHeaders.putAll(headers);
-        if (contentLength > 0) {
-            httpHeaders.setContentLength(contentLength);
-        } else {
-            httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, CHUNKED);
-        }
-        return httpHeaders;
-    }
-
-    /**
-     * create CachedBodyOutputMessage.
-     * @param exchange ServerWebExchange
-     * @return CachedBodyOutputMessage.
-     */
-    public static CachedBodyOutputMessage newCachedBodyOutputMessage(final 
ServerWebExchange exchange) {
-        HttpHeaders headers = new HttpHeaders();
-        headers.putAll(exchange.getRequest().getHeaders());
-        headers.remove(HttpHeaders.CONTENT_LENGTH);
-        return new CachedBodyOutputMessage(exchange, headers);
-    }
-
-    /**
-     * release source.
-     * @param outputMessage CachedBodyOutputMessage
-     * @param throwable Throwable
-     * @return Mono.
-     */
-    public static Mono<Void> release(final CachedBodyOutputMessage 
outputMessage, final Throwable throwable) {
-        if (outputMessage.getCache()) {
-            return 
outputMessage.getBody().map(DataBufferUtils::release).then(Mono.error(throwable));
-        }
-        return Mono.error(throwable);
-    }
+public class CryptorUtil {
 
     /**
      * error handling.
@@ -120,5 +73,4 @@ public class HttpUtil {
                 Arrays.asList(fieldNames.split("\\.")));
         return Mono.just(resultJe.toString());
     }
-
 }
diff --git 
a/shenyu-plugin/shenyu-plugin-cryptor/src/test/java/org/apache/shenyu/plugin/cryptor/response/CryptorResponsePluginTest.java
 
b/shenyu-plugin/shenyu-plugin-cryptor/src/test/java/org/apache/shenyu/plugin/cryptor/response/CryptorResponsePluginTest.java
index 9447d1a..80cd62f 100644
--- 
a/shenyu-plugin/shenyu-plugin-cryptor/src/test/java/org/apache/shenyu/plugin/cryptor/response/CryptorResponsePluginTest.java
+++ 
b/shenyu-plugin/shenyu-plugin-cryptor/src/test/java/org/apache/shenyu/plugin/cryptor/response/CryptorResponsePluginTest.java
@@ -22,7 +22,7 @@ import org.apache.shenyu.common.dto.RuleData;
 import org.apache.shenyu.common.dto.SelectorData;
 import org.apache.shenyu.common.enums.PluginEnum;
 import org.apache.shenyu.plugin.api.ShenyuPluginChain;
-import org.apache.shenyu.plugin.cryptor.decorator.ResponseDecorator;
+import org.apache.shenyu.plugin.cryptor.decorator.CryptorResponseDecorator;
 import 
org.apache.shenyu.plugin.cryptor.handler.CryptorResponsePluginDataHandler;
 import org.junit.Before;
 import org.junit.Test;
@@ -98,7 +98,7 @@ public class CryptorResponsePluginTest {
                 + "}\n");
         ServerWebExchange.Builder builder = 
mock(ServerWebExchange.Builder.class);
         when(exchange.mutate()).thenReturn(builder);
-        
when(builder.response(any(ResponseDecorator.class))).thenReturn(builder);
+        
when(builder.response(any(CryptorResponseDecorator.class))).thenReturn(builder);
         when(builder.build()).thenReturn(exchange);
         when(chain.execute(any())).thenReturn(Mono.empty());
         cryptorResponsePluginDataHandler.handlerRule(ruleData);
@@ -129,7 +129,7 @@ public class CryptorResponsePluginTest {
                 + "}\n");
         ServerWebExchange.Builder builder = 
mock(ServerWebExchange.Builder.class);
         when(exchange.mutate()).thenReturn(builder);
-        
when(builder.response(any(ResponseDecorator.class))).thenReturn(builder);
+        
when(builder.response(any(CryptorResponseDecorator.class))).thenReturn(builder);
         when(builder.build()).thenReturn(exchange);
         when(chain.execute(any())).thenReturn(Mono.empty());
         cryptorResponsePluginDataHandler.handlerRule(ruleData);
@@ -159,7 +159,7 @@ public class CryptorResponsePluginTest {
                 + "}\n");
         ServerWebExchange.Builder builder = 
mock(ServerWebExchange.Builder.class);
         when(exchange.mutate()).thenReturn(builder);
-        
when(builder.response(any(ResponseDecorator.class))).thenReturn(builder);
+        
when(builder.response(any(CryptorResponseDecorator.class))).thenReturn(builder);
         when(builder.build()).thenReturn(exchange);
         when(chain.execute(any())).thenReturn(Mono.empty());
         cryptorResponsePluginDataHandler.handlerRule(ruleData);
@@ -190,7 +190,7 @@ public class CryptorResponsePluginTest {
                 + "}\n");
         ServerWebExchange.Builder builder = 
mock(ServerWebExchange.Builder.class);
         when(exchange.mutate()).thenReturn(builder);
-        
when(builder.response(any(ResponseDecorator.class))).thenReturn(builder);
+        
when(builder.response(any(CryptorResponseDecorator.class))).thenReturn(builder);
         when(builder.build()).thenReturn(exchange);
         when(chain.execute(any())).thenReturn(Mono.empty());
         cryptorResponsePluginDataHandler.handlerRule(ruleData);
diff --git 
a/shenyu-plugin/shenyu-plugin-modify-response/src/main/java/org/apache/shenyu/plugin/modify/response/ModifyResponsePlugin.java
 
b/shenyu-plugin/shenyu-plugin-modify-response/src/main/java/org/apache/shenyu/plugin/modify/response/ModifyResponsePlugin.java
index 78ae208..0ef59c3 100644
--- 
a/shenyu-plugin/shenyu-plugin-modify-response/src/main/java/org/apache/shenyu/plugin/modify/response/ModifyResponsePlugin.java
+++ 
b/shenyu-plugin/shenyu-plugin-modify-response/src/main/java/org/apache/shenyu/plugin/modify/response/ModifyResponsePlugin.java
@@ -32,7 +32,7 @@ import org.apache.shenyu.plugin.base.AbstractShenyuPlugin;
 import org.apache.shenyu.plugin.base.support.BodyInserterContext;
 import org.apache.shenyu.plugin.base.support.CachedBodyOutputMessage;
 import org.apache.shenyu.plugin.base.utils.CacheKeyUtils;
-import org.apache.shenyu.plugin.base.utils.ClientResponseUtils;
+import org.apache.shenyu.plugin.base.utils.ResponseUtils;
 import 
org.apache.shenyu.plugin.modify.response.handler.ModifyResponsePluginDataHandler;
 import org.reactivestreams.Publisher;
 import org.springframework.core.io.buffer.DataBuffer;
@@ -55,6 +55,7 @@ import java.util.Collections;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.function.Function;
 
 /**
  * ModifyResponse plugin.
@@ -133,20 +134,18 @@ public class ModifyResponsePlugin extends 
AbstractShenyuPlugin {
         @Override
         @NonNull
         public Mono<Void> writeWith(@NonNull final Publisher<? extends 
DataBuffer> body) {
-            ClientResponse clientResponse = 
ClientResponseUtils.buildClientResponse(this.getDelegate(), body);
+            ClientResponse clientResponse = 
ResponseUtils.buildClientResponse(this.getDelegate(), body);
             Mono<byte[]> modifiedBody = clientResponse.bodyToMono(byte[].class)
                     .flatMap(originalBody -> 
Mono.just(updateResponse(originalBody)));
 
             BodyInserter<Mono<byte[]>, ReactiveHttpOutputMessage> bodyInserter 
=
                     BodyInserters.fromPublisher(modifiedBody, byte[].class);
-            CachedBodyOutputMessage outputMessage = new 
CachedBodyOutputMessage(exchange,
-                    exchange.getResponse().getHeaders());
+            CachedBodyOutputMessage outputMessage = 
ResponseUtils.newCachedBodyOutputMessage(this.exchange);
             return bodyInserter.insert(outputMessage, new 
BodyInserterContext()).then(Mono.defer(() -> {
-                Mono<DataBuffer> messageBody = 
ClientResponseUtils.fixBodyMessage(this.getDelegate(), outputMessage);
+                Mono<DataBuffer> messageBody = 
ResponseUtils.fixBodyMessage(this.getDelegate(), outputMessage);
                 exchange.getAttributes().put(Constants.CLIENT_RESPONSE_ATTR, 
clientResponse);
                 return getDelegate().writeWith(messageBody);
-            }));
-
+            })).onErrorResume((Function<Throwable, Mono<Void>>) throwable -> 
ResponseUtils.release(outputMessage, throwable));
         }
 
         private byte[] updateResponse(final byte[] responseBody) {

Reply via email to