1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.http3;
17
18 import io.netty.buffer.ByteBuf;
19 import io.netty.channel.ChannelInitializer;
20 import io.netty.channel.ChannelPipeline;
21 import io.netty.handler.codec.quic.QuicStreamChannel;
22
23 import static io.netty.handler.codec.http3.Http3CodecUtils.isServerInitiatedQuicStream;
24 import static io.netty.handler.codec.http3.Http3CodecUtils.writeVariableLengthInteger;
25 import static io.netty.handler.codec.http3.Http3RequestStreamCodecState.NO_STATE;
26 import static io.netty.util.internal.ObjectUtil.checkPositiveOrZero;
27
28
29
30
31
32 public abstract class Http3PushStreamServerInitializer extends ChannelInitializer<QuicStreamChannel> {
33
34 private final long pushId;
35
36 protected Http3PushStreamServerInitializer(long pushId) {
37 this.pushId = checkPositiveOrZero(pushId, "pushId");
38 }
39
40 @Override
41 protected final void initChannel(QuicStreamChannel ch) {
42 if (!isServerInitiatedQuicStream(ch)) {
43 throw new IllegalArgumentException("Using server push stream initializer for client stream: " +
44 ch.streamId());
45 }
46 Http3CodecUtils.verifyIsUnidirectional(ch);
47
48
49
50
51 ByteBuf buffer = ch.alloc().buffer(16);
52 writeVariableLengthInteger(buffer, Http3CodecUtils.HTTP3_PUSH_STREAM_TYPE);
53 writeVariableLengthInteger(buffer, pushId);
54 ch.write(buffer);
55
56 Http3ConnectionHandler connectionHandler = Http3CodecUtils.getConnectionHandlerOrClose(ch.parent());
57 if (connectionHandler == null) {
58
59 return;
60 }
61
62 ChannelPipeline pipeline = ch.pipeline();
63 Http3RequestStreamEncodeStateValidator encodeStateValidator = new Http3RequestStreamEncodeStateValidator();
64
65 pipeline.addLast(connectionHandler.newCodec(encodeStateValidator, NO_STATE));
66 pipeline.addLast(encodeStateValidator);
67
68 pipeline.addLast(connectionHandler.newPushStreamValidationHandler(ch, NO_STATE));
69 initPushStream(ch);
70 }
71
72
73
74
75
76
77
78 protected abstract void initPushStream(QuicStreamChannel ch);
79 }