1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.quic;
17
18 import io.netty.buffer.ByteBuf;
19 import io.netty.channel.ChannelHandlerContext;
20 import io.netty.channel.ChannelPromise;
21 import org.jetbrains.annotations.Nullable;
22
23 import java.net.InetSocketAddress;
24 import java.net.SocketAddress;
25 import java.nio.ByteBuffer;
26 import java.util.concurrent.Executor;
27 import java.util.function.Consumer;
28 import java.util.function.Function;
29
30
31
32
33 final class QuicheQuicClientCodec extends QuicheQuicCodec {
34
35 private final Function<QuicChannel, ? extends QuicSslEngine> sslEngineProvider;
36 private final Executor sslTaskExecutor;
37
38 QuicheQuicClientCodec(QuicheConfig config, Function<QuicChannel, ? extends QuicSslEngine> sslEngineProvider,
39 Executor sslTaskExecutor, int localConnIdLength, FlushStrategy flushStrategy) {
40
41
42 super(config, localConnIdLength, flushStrategy);
43 this.sslEngineProvider = sslEngineProvider;
44 this.sslTaskExecutor = sslTaskExecutor;
45 }
46
47 @Override
48 @Nullable
49 protected QuicheQuicChannel quicPacketRead(
50 ChannelHandlerContext ctx, InetSocketAddress sender, InetSocketAddress recipient,
51 QuicPacketType type, long version, ByteBuf scid, ByteBuf dcid,
52 ByteBuf token, ByteBuf senderSockaddrMemory, ByteBuf recipientSockaddrMemory,
53 Consumer<QuicheQuicChannel> freeTask, int localConnIdLength, QuicheConfig config) {
54 ByteBuffer key = dcid.internalNioBuffer(dcid.readerIndex(), dcid.readableBytes());
55 return getChannel(key);
56 }
57
58 @Override
59 protected void connectQuicChannel(QuicheQuicChannel channel, SocketAddress remoteAddress,
60 SocketAddress localAddress, ByteBuf senderSockaddrMemory,
61 ByteBuf recipientSockaddrMemory, Consumer<QuicheQuicChannel> freeTask,
62 int localConnIdLength, QuicheConfig config, ChannelPromise promise) {
63 try {
64 channel.connectNow(sslEngineProvider, sslTaskExecutor, freeTask, config.nativeAddress(),
65 localConnIdLength, config.isDatagramSupported(),
66 senderSockaddrMemory.internalNioBuffer(0, senderSockaddrMemory.capacity()),
67 recipientSockaddrMemory.internalNioBuffer(0, recipientSockaddrMemory.capacity()));
68 } catch (Throwable cause) {
69
70 promise.setFailure(cause);
71 return;
72 }
73
74 addChannel(channel);
75 channel.finishConnect();
76 promise.setSuccess();
77 }
78 }