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
