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

yaohaishi pushed a commit to branch 2.8.x
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit b044687de0a6a6ec5cc8b4bbc747af1e521e8a9e
Author: yhs0092 <[email protected]>
AuthorDate: Thu Mar 20 10:14:59 2025 +0800

    [SCB-2897] ServerWebSocket should not be serialized
---
 .../rest/filter/inner/ServerRestArgsFilter.java    |  6 ---
 .../rest/vertx/ws/ServerWebSocketArgsFilter.java   | 56 ++++++++++++++++++++++
 ...servicecomb.common.rest.filter.HttpServerFilter |  1 +
 3 files changed, 57 insertions(+), 6 deletions(-)

diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/ServerRestArgsFilter.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/ServerRestArgsFilter.java
index 534146885..bef5b48a4 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/ServerRestArgsFilter.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/filter/inner/ServerRestArgsFilter.java
@@ -27,7 +27,6 @@ import org.apache.servicecomb.common.rest.codec.RestCodec;
 import org.apache.servicecomb.common.rest.codec.produce.ProduceProcessor;
 import org.apache.servicecomb.common.rest.definition.RestOperationMeta;
 import org.apache.servicecomb.common.rest.filter.HttpServerFilter;
-import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.Invocation;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.foundation.common.utils.PartUtils;
@@ -56,11 +55,6 @@ public class ServerRestArgsFilter implements 
HttpServerFilter {
     return enabled;
   }
 
-  @Override
-  public boolean enabledForTransport(String transport) {
-    return HttpServerFilter.super.enabledForTransport(transport) || 
Const.WEBSOCKET.equals(transport);
-  }
-
   @Override
   public Response afterReceiveRequest(Invocation invocation, 
HttpServletRequestEx requestEx) {
     OperationMeta operationMeta = invocation.getOperationMeta();
diff --git 
a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/ServerWebSocketArgsFilter.java
 
b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/ServerWebSocketArgsFilter.java
new file mode 100644
index 000000000..1bd3a7f51
--- /dev/null
+++ 
b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/ws/ServerWebSocketArgsFilter.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.transport.rest.vertx.ws;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.servicecomb.common.rest.RestConst;
+import org.apache.servicecomb.common.rest.filter.inner.ServerRestArgsFilter;
+import org.apache.servicecomb.core.Const;
+import org.apache.servicecomb.core.Invocation;
+import org.apache.servicecomb.foundation.vertx.http.HttpServletResponseEx;
+import org.apache.servicecomb.swagger.invocation.Response;
+import org.apache.servicecomb.swagger.invocation.ws.ServerWebSocket;
+
+import com.netflix.config.DynamicPropertyFactory;
+
+public class ServerWebSocketArgsFilter extends ServerRestArgsFilter {
+  private static final boolean enabled = 
DynamicPropertyFactory.getInstance().getBooleanProperty
+      ("servicecomb.http.filter.server.serverWebSocketArgs.enabled", 
true).get();
+
+  @Override
+  public boolean enabled() {
+    return enabled;
+  }
+
+  @Override
+  public boolean enabledForTransport(String transport) {
+    return Const.WEBSOCKET.equals(transport);
+  }
+
+  @Override
+  public CompletableFuture<Void> beforeSendResponseAsync(Invocation 
invocation, HttpServletResponseEx responseEx) {
+    Response response = (Response) 
responseEx.getAttribute(RestConst.INVOCATION_HANDLER_RESPONSE);
+    if (response.getResult() instanceof ServerWebSocket) {
+      // don't do anything on WebSocket response. Let the 
WebSocketHandshakeServerFilter to handle WS handshaking.
+      return CompletableFuture.completedFuture(null);
+    }
+    // WS handshaking may fail and return an HTTP response, like 401
+    return super.beforeSendResponseAsync(invocation, responseEx);
+  }
+}
diff --git 
a/transports/transport-rest/transport-rest-vertx/src/main/resources/META-INF/services/org.apache.servicecomb.common.rest.filter.HttpServerFilter
 
b/transports/transport-rest/transport-rest-vertx/src/main/resources/META-INF/services/org.apache.servicecomb.common.rest.filter.HttpServerFilter
index 21226cefd..41cd4403f 100644
--- 
a/transports/transport-rest/transport-rest-vertx/src/main/resources/META-INF/services/org.apache.servicecomb.common.rest.filter.HttpServerFilter
+++ 
b/transports/transport-rest/transport-rest-vertx/src/main/resources/META-INF/services/org.apache.servicecomb.common.rest.filter.HttpServerFilter
@@ -16,3 +16,4 @@
 #
 
 org.apache.servicecomb.transport.rest.vertx.ws.WebSocketHandshakeServerFilter
+org.apache.servicecomb.transport.rest.vertx.ws.ServerWebSocketArgsFilter

Reply via email to