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.channel.ChannelHandler;
19 import io.netty.channel.ChannelOption;
20 import io.netty.util.AttributeKey;
21 import io.netty.util.internal.ObjectUtil;
22 import org.jetbrains.annotations.Nullable;
23
24 import java.util.HashMap;
25 import java.util.LinkedHashMap;
26 import java.util.Map;
27 import java.util.concurrent.Executor;
28 import java.util.function.Function;
29
30
31
32
33
34 public final class QuicServerCodecBuilder extends QuicCodecBuilder<QuicServerCodecBuilder> {
35
36
37 private final Map<ChannelOption<?>, Object> options = new LinkedHashMap<>();
38 private final Map<AttributeKey<?>, Object> attrs = new HashMap<>();
39 private final Map<ChannelOption<?>, Object> streamOptions = new LinkedHashMap<>();
40 private final Map<AttributeKey<?>, Object> streamAttrs = new HashMap<>();
41 private ChannelHandler handler;
42 private ChannelHandler streamHandler;
43 private QuicConnectionIdGenerator connectionIdAddressGenerator;
44 private QuicTokenHandler tokenHandler;
45 private QuicResetTokenGenerator resetTokenGenerator;
46
47
48
49
50 public QuicServerCodecBuilder() {
51 super(true);
52 }
53
54 private QuicServerCodecBuilder(QuicServerCodecBuilder builder) {
55 super(builder);
56 options.putAll(builder.options);
57 attrs.putAll(builder.attrs);
58 streamOptions.putAll(builder.streamOptions);
59 streamAttrs.putAll(builder.streamAttrs);
60 handler = builder.handler;
61 streamHandler = builder.streamHandler;
62 connectionIdAddressGenerator = builder.connectionIdAddressGenerator;
63 tokenHandler = builder.tokenHandler;
64 resetTokenGenerator = builder.resetTokenGenerator;
65 }
66
67 @Override
68 public QuicServerCodecBuilder clone() {
69 return new QuicServerCodecBuilder(this);
70 }
71
72
73
74
75
76
77
78
79
80
81 public <T> QuicServerCodecBuilder option(ChannelOption<T> option, @Nullable T value) {
82 Quic.updateOptions(options, option, value);
83 return self();
84 }
85
86
87
88
89
90
91
92
93
94
95 public <T> QuicServerCodecBuilder attr(AttributeKey<T> key, @Nullable T value) {
96 Quic.updateAttributes(attrs, key, value);
97 return self();
98 }
99
100
101
102
103
104
105
106
107
108 public QuicServerCodecBuilder handler(ChannelHandler handler) {
109 this.handler = ObjectUtil.checkNotNull(handler, "handler");
110 return self();
111 }
112
113
114
115
116
117
118
119
120
121
122 public <T> QuicServerCodecBuilder streamOption(ChannelOption<T> option, @Nullable T value) {
123 Quic.updateOptions(streamOptions, option, value);
124 return self();
125 }
126
127
128
129
130
131
132
133
134
135
136 public <T> QuicServerCodecBuilder streamAttr(AttributeKey<T> key, @Nullable T value) {
137 Quic.updateAttributes(streamAttrs, key, value);
138 return self();
139 }
140
141
142
143
144
145
146
147
148
149 public QuicServerCodecBuilder streamHandler(ChannelHandler streamHandler) {
150 this.streamHandler = ObjectUtil.checkNotNull(streamHandler, "streamHandler");
151 return self();
152 }
153
154
155
156
157
158
159
160 public QuicServerCodecBuilder connectionIdAddressGenerator(
161 QuicConnectionIdGenerator connectionIdAddressGenerator) {
162 this.connectionIdAddressGenerator = connectionIdAddressGenerator;
163 return this;
164 }
165
166
167
168
169
170
171
172
173 public QuicServerCodecBuilder tokenHandler(@Nullable QuicTokenHandler tokenHandler) {
174 this.tokenHandler = tokenHandler;
175 return self();
176 }
177
178
179
180
181
182
183
184
185 public QuicServerCodecBuilder resetTokenGenerator(@Nullable QuicResetTokenGenerator resetTokenGenerator) {
186 this.resetTokenGenerator = resetTokenGenerator;
187 return self();
188 }
189
190 @Override
191 protected void validate() {
192 super.validate();
193 if (handler == null && streamHandler == null) {
194 throw new IllegalStateException("handler and streamHandler not set");
195 }
196 }
197
198 @Override
199 ChannelHandler build(QuicheConfig config,
200 Function<QuicChannel, ? extends QuicSslEngine> sslEngineProvider,
201 Executor sslTaskExecutor,
202 int localConnIdLength, FlushStrategy flushStrategy) {
203 validate();
204 QuicTokenHandler tokenHandler = this.tokenHandler;
205 if (tokenHandler == null) {
206 tokenHandler = NoQuicTokenHandler.INSTANCE;
207 }
208 QuicConnectionIdGenerator generator = connectionIdAddressGenerator;
209 if (generator == null) {
210 generator = QuicConnectionIdGenerator.signGenerator();
211 }
212 QuicResetTokenGenerator resetTokenGenerator = this.resetTokenGenerator;
213 if (resetTokenGenerator == null) {
214 resetTokenGenerator = QuicResetTokenGenerator.signGenerator();
215 }
216 ChannelHandler handler = this.handler;
217 ChannelHandler streamHandler = this.streamHandler;
218 return new QuicheQuicServerCodec(config, localConnIdLength, tokenHandler, generator, resetTokenGenerator,
219 flushStrategy, sslEngineProvider, sslTaskExecutor, handler,
220 Quic.toOptionsArray(options), Quic.toAttributesArray(attrs),
221 streamHandler, Quic.toOptionsArray(streamOptions), Quic.toAttributesArray(streamAttrs));
222 }
223 }