From 9c39be4e5f7dbb6299bdd5cf3ad95da1c051ff35 Mon Sep 17 00:00:00 2001 From: sun Date: Thu, 27 Jul 2023 15:48:40 +0800 Subject: [PATCH] feat[ssl]: websocket ssl client --- .../core/websocket/WebsocketSslClient.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 net/src/main/java/com/zfoo/net/core/websocket/WebsocketSslClient.java diff --git a/net/src/main/java/com/zfoo/net/core/websocket/WebsocketSslClient.java b/net/src/main/java/com/zfoo/net/core/websocket/WebsocketSslClient.java new file mode 100644 index 00000000..8cef4491 --- /dev/null +++ b/net/src/main/java/com/zfoo/net/core/websocket/WebsocketSslClient.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * + * Licensed 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 com.zfoo.net.core.websocket; + +import com.zfoo.net.core.AbstractClient; +import com.zfoo.net.core.AbstractServer; +import com.zfoo.net.handler.ClientRouteHandler; +import com.zfoo.net.handler.codec.websocket.WebSocketCodecHandler; +import com.zfoo.protocol.util.IOUtils; +import com.zfoo.util.net.HostAndPort; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.http.DefaultHttpHeaders; +import io.netty.handler.codec.http.HttpClientCodec; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory; +import io.netty.handler.codec.http.websocketx.WebSocketClientProtocolConfig; +import io.netty.handler.codec.http.websocketx.WebSocketClientProtocolHandler; +import io.netty.handler.codec.http.websocketx.WebSocketVersion; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.SslHandler; +import io.netty.handler.stream.ChunkedWriteHandler; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.SSLException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.security.NoSuchAlgorithmException; + +/** + * @author godotg + * @version 3.0 + */ +public class WebsocketSslClient extends AbstractClient { + + + private final WebSocketClientProtocolConfig webSocketClientProtocolConfig; + + public WebsocketSslClient(HostAndPort host, WebSocketClientProtocolConfig webSocketClientProtocolConfig) { + super(host); + this.webSocketClientProtocolConfig = webSocketClientProtocolConfig; + } + + @Override + protected void initChannel(SocketChannel channel) throws URISyntaxException, NoSuchAlgorithmException { + SSLEngine sslEngine = SSLContext.getDefault().createSSLEngine(); + sslEngine.setUseClientMode(true); + channel.pipeline().addLast( new SslHandler(sslEngine)); + channel.pipeline().addLast(new HttpClientCodec(8 * IOUtils.BYTES_PER_KB, 16 * IOUtils.BYTES_PER_KB, 16 * IOUtils.BYTES_PER_KB)); + channel.pipeline().addLast(new HttpObjectAggregator(16 * IOUtils.BYTES_PER_MB)); + channel.pipeline().addLast(new WebSocketClientProtocolHandler(webSocketClientProtocolConfig)); + channel.pipeline().addLast(new ChunkedWriteHandler()); + channel.pipeline().addLast(new WebSocketCodecHandler()); + channel.pipeline().addLast(new ClientRouteHandler()); + } + +}