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

suncairong pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.2 by this push:
     new 1c32c001a7 feat: rest protocol support keep-alive timeout header 
config (#14560)
1c32c001a7 is described below

commit 1c32c001a7ad3175a2ee4c452b168e6942babfed
Author: funkye <[email protected]>
AuthorDate: Wed Aug 21 22:05:42 2024 +0800

    feat: rest protocol support keep-alive timeout header config (#14560)
    
    * feat: rest protocol support keep-alive timeout header config
    
    * optimize: rest protocol connection default keepalive
    
    * optimize: rest protocol connection default keepalive
---
 .../rpc/protocol/rest/netty/NettyHttpResponse.java | 31 +++++++++++-----------
 .../rest/netty/RestHttpRequestDecoder.java         |  5 ++--
 2 files changed, 17 insertions(+), 19 deletions(-)

diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/netty/NettyHttpResponse.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/netty/NettyHttpResponse.java
index 24aa8153a7..3f90ffb272 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/netty/NettyHttpResponse.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/netty/NettyHttpResponse.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.remoting.Constants;
 import org.apache.dubbo.rpc.protocol.rest.RestHeaderEnum;
+import org.apache.dubbo.rpc.protocol.rest.constans.RestConstant;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -36,10 +37,9 @@ import io.netty.handler.codec.http.DefaultFullHttpResponse;
 import io.netty.handler.codec.http.DefaultHttpResponse;
 import io.netty.handler.codec.http.HttpHeaderNames;
 import io.netty.handler.codec.http.HttpHeaderValues;
-import io.netty.handler.codec.http.HttpHeaders;
-import io.netty.handler.codec.http.HttpHeaders.Names;
 import io.netty.handler.codec.http.HttpMethod;
 import io.netty.handler.codec.http.HttpResponseStatus;
+import io.netty.handler.codec.http.HttpUtil;
 import io.netty.handler.codec.http.LastHttpContent;
 
 import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
@@ -51,11 +51,13 @@ public class NettyHttpResponse implements HttpResponse {
     private static final int EMPTY_CONTENT_LENGTH = 0;
     private int status = 200;
     private OutputStream os;
-    private Map<String, List<String>> outputHeaders;
+    private final Map<String, List<String>> outputHeaders;
     private final ChannelHandlerContext ctx;
     private boolean committed;
-    private boolean keepAlive;
-    private HttpMethod method;
+    private final boolean keepAlive;
+
+    private final int idleTimeout;
+    private final HttpMethod method;
     // raw response body
     private Object responseBody;
     // raw response class
@@ -69,6 +71,7 @@ public class NettyHttpResponse implements HttpResponse {
         outputHeaders = new HashMap<>();
         this.method = method;
         os = new ChunkOutputStream(this, ctx, 
url.getParameter(Constants.PAYLOAD_KEY, Constants.DEFAULT_PAYLOAD));
+        this.idleTimeout = url.getParameter(RestConstant.IDLE_TIMEOUT_PARAM, 
RestConstant.IDLE_TIMEOUT);
         this.ctx = ctx;
         this.keepAlive = keepAlive;
     }
@@ -125,7 +128,6 @@ public class NettyHttpResponse implements HttpResponse {
             throw new 
IllegalStateException("Messages.MESSAGES.alreadyCommitted()");
         }
         outputHeaders.clear();
-        outputHeaders.clear();
     }
 
     public boolean isKeepAlive() {
@@ -141,7 +143,7 @@ public class NettyHttpResponse implements HttpResponse {
     public DefaultHttpResponse getEmptyHttpResponse() {
         DefaultFullHttpResponse res = new DefaultFullHttpResponse(HTTP_1_1, 
HttpResponseStatus.valueOf(getStatus()));
         if (method == null || !method.equals(HttpMethod.HEAD)) {
-            res.headers().add(Names.CONTENT_LENGTH, EMPTY_CONTENT_LENGTH);
+            res.headers().add(HttpHeaderNames.CONTENT_LENGTH, 
EMPTY_CONTENT_LENGTH);
         }
         transformResponseHeaders(res);
 
@@ -155,7 +157,7 @@ public class NettyHttpResponse implements HttpResponse {
     public void prepareChunkStream() {
         committed = true;
         DefaultHttpResponse response = getDefaultHttpResponse();
-        HttpHeaders.setTransferEncodingChunked(response);
+        HttpUtil.setTransferEncodingChunked(response, true);
         ctx.write(response);
     }
 
@@ -185,12 +187,7 @@ public class NettyHttpResponse implements HttpResponse {
     @Override
     public void addOutputHeaders(String name, String value) {
 
-        List<String> values = outputHeaders.get(name);
-
-        if (values == null) {
-            values = new ArrayList<>();
-            outputHeaders.put(name, values);
-        }
+        List<String> values = outputHeaders.computeIfAbsent(name, k -> new 
ArrayList<>());
 
         if (values.contains(value)) {
             return;
@@ -200,10 +197,12 @@ public class NettyHttpResponse implements HttpResponse {
     }
 
     @SuppressWarnings({"rawtypes", "unchecked"})
-    public static void transformHeaders(
-            NettyHttpResponse nettyResponse, 
io.netty.handler.codec.http.HttpResponse response) {
+    public void transformHeaders(NettyHttpResponse nettyResponse, 
io.netty.handler.codec.http.HttpResponse response) {
         if (nettyResponse.isKeepAlive()) {
             response.headers().set(HttpHeaderNames.CONNECTION, 
HttpHeaderValues.KEEP_ALIVE);
+            if (idleTimeout > 0) {
+                response.headers().set(HttpHeaderNames.KEEP_ALIVE, "timeout=" 
+ idleTimeout);
+            }
         } else {
             response.headers().set(HttpHeaderNames.CONNECTION, 
HttpHeaderValues.CLOSE);
         }
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/netty/RestHttpRequestDecoder.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/netty/RestHttpRequestDecoder.java
index 753bc09a17..20f93344e5 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/netty/RestHttpRequestDecoder.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/netty/RestHttpRequestDecoder.java
@@ -31,7 +31,7 @@ import java.util.concurrent.Executor;
 
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.handler.codec.MessageToMessageDecoder;
-import io.netty.handler.codec.http.HttpHeaders;
+import io.netty.handler.codec.http.HttpUtil;
 
 import static org.apache.dubbo.config.Constants.SERVER_THREAD_POOL_NAME;
 
@@ -56,8 +56,7 @@ public class RestHttpRequestDecoder extends 
MessageToMessageDecoder<io.netty.han
     protected void decode(
             ChannelHandlerContext ctx, 
io.netty.handler.codec.http.FullHttpRequest request, List<Object> out)
             throws Exception {
-        boolean keepAlive = HttpHeaders.isKeepAlive(request);
-
+        boolean keepAlive = HttpUtil.isKeepAlive(request);
         NettyHttpResponse nettyHttpResponse = new NettyHttpResponse(ctx, 
keepAlive, url);
         NettyRequestFacade requestFacade = new NettyRequestFacade(request, 
ctx, serviceDeployer);
 

Reply via email to