View Javadoc
1   /*
2    * Copyright 2021 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
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 }