1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.netty.handler.codec.http3;
18
19 import io.netty.handler.codec.quic.QuicChannel;
20 import io.netty.handler.codec.quic.QuicStreamChannel;
21 import io.netty.util.concurrent.Future;
22 import io.netty.util.concurrent.GenericFutureListener;
23 import io.netty.util.concurrent.Promise;
24
25 import static java.util.Objects.requireNonNull;
26
27 final class QpackAttributes {
28 private final QuicChannel channel;
29 private final boolean dynamicTableDisabled;
30 private final Promise<QuicStreamChannel> encoderStreamPromise;
31 private final Promise<QuicStreamChannel> decoderStreamPromise;
32
33 private QuicStreamChannel encoderStream;
34 private QuicStreamChannel decoderStream;
35
36 QpackAttributes(QuicChannel channel, boolean disableDynamicTable) {
37 this.channel = channel;
38 dynamicTableDisabled = disableDynamicTable;
39 encoderStreamPromise = dynamicTableDisabled ? null : channel.eventLoop().newPromise();
40 decoderStreamPromise = dynamicTableDisabled ? null : channel.eventLoop().newPromise();
41 }
42
43 boolean dynamicTableDisabled() {
44 return dynamicTableDisabled;
45 }
46
47 boolean decoderStreamAvailable() {
48 return !dynamicTableDisabled && decoderStream != null;
49 }
50
51 boolean encoderStreamAvailable() {
52 return !dynamicTableDisabled && encoderStream != null;
53 }
54
55 void whenEncoderStreamAvailable(GenericFutureListener<Future<? super QuicStreamChannel>> listener) {
56 assert !dynamicTableDisabled;
57 assert encoderStreamPromise != null;
58 encoderStreamPromise.addListener(listener);
59 }
60
61 void whenDecoderStreamAvailable(GenericFutureListener<Future<? super QuicStreamChannel>> listener) {
62 assert !dynamicTableDisabled;
63 assert decoderStreamPromise != null;
64 decoderStreamPromise.addListener(listener);
65 }
66
67 QuicStreamChannel decoderStream() {
68 assert decoderStreamAvailable();
69 return decoderStream;
70 }
71
72 QuicStreamChannel encoderStream() {
73 assert encoderStreamAvailable();
74 return encoderStream;
75 }
76
77 void decoderStream(QuicStreamChannel decoderStream) {
78 assert channel.eventLoop().inEventLoop();
79 assert !dynamicTableDisabled;
80 assert decoderStreamPromise != null;
81 assert this.decoderStream == null;
82 this.decoderStream = requireNonNull(decoderStream);
83 decoderStreamPromise.setSuccess(decoderStream);
84 }
85
86 void encoderStream(QuicStreamChannel encoderStream) {
87 assert channel.eventLoop().inEventLoop();
88 assert !dynamicTableDisabled;
89 assert encoderStreamPromise != null;
90 assert this.encoderStream == null;
91 this.encoderStream = requireNonNull(encoderStream);
92 encoderStreamPromise.setSuccess(encoderStream);
93 }
94
95 void encoderStreamInactive(Throwable cause) {
96 assert channel.eventLoop().inEventLoop();
97 assert !dynamicTableDisabled;
98 assert encoderStreamPromise != null;
99 encoderStreamPromise.tryFailure(cause);
100 }
101
102 void decoderStreamInactive(Throwable cause) {
103 assert channel.eventLoop().inEventLoop();
104 assert !dynamicTableDisabled;
105 assert decoderStreamPromise != null;
106 decoderStreamPromise.tryFailure(cause);
107 }
108 }