View Javadoc
1   /*
2    * Copyright 2015 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License, version 2.0 (the
5    * "License"); you may not use this file except in compliance with the License. You may obtain a
6    * 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 distributed under the License
11   * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing permissions and limitations under
13   * the License.
14   */
15  package io.netty.handler.codec.http2;
16  
17  import io.netty.handler.codec.TooLongFrameException;
18  
19  import static io.netty.util.internal.ObjectUtil.checkNotNull;
20  
21  /**
22   * A skeletal builder implementation of {@link InboundHttp2ToHttpAdapter} and its subtypes.
23   */
24  public abstract class AbstractInboundHttp2ToHttpAdapterBuilder<
25          T extends InboundHttp2ToHttpAdapter, B extends AbstractInboundHttp2ToHttpAdapterBuilder<T, B>> {
26  
27      private final Http2Connection connection;
28      private int maxContentLength;
29      private boolean validateHttpHeaders;
30      private boolean propagateSettings;
31  
32      /**
33       * Creates a new {@link InboundHttp2ToHttpAdapter} builder for the specified {@link Http2Connection}.
34       *
35       * @param connection the object which will provide connection notification events
36       *                   for the current connection
37       */
38      protected AbstractInboundHttp2ToHttpAdapterBuilder(Http2Connection connection) {
39          this.connection = checkNotNull(connection, "connection");
40      }
41  
42      @SuppressWarnings("unchecked")
43      protected final B self() {
44          return (B) this;
45      }
46  
47      /**
48       * Returns the {@link Http2Connection}.
49       */
50      protected Http2Connection connection() {
51          return connection;
52      }
53  
54      /**
55       * Returns the maximum length of the message content.
56       */
57      protected int maxContentLength() {
58          return maxContentLength;
59      }
60  
61      /**
62       * Specifies the maximum length of the message content.
63       *
64       * @param maxContentLength the maximum length of the message content. If the length of the message content
65       *        exceeds this value, a {@link TooLongFrameException} will be raised
66       * @return {@link AbstractInboundHttp2ToHttpAdapterBuilder} the builder for the {@link InboundHttp2ToHttpAdapter}
67       */
68      protected B maxContentLength(int maxContentLength) {
69          this.maxContentLength = maxContentLength;
70          return self();
71      }
72  
73      /**
74       * Return {@code true} if HTTP header validation should be performed.
75       */
76      protected boolean isValidateHttpHeaders() {
77          return validateHttpHeaders;
78      }
79  
80      /**
81       * Specifies whether validation of HTTP headers should be performed.
82       *
83       * @param validate
84       * <ul>
85       * <li>{@code true} to validate HTTP headers in the http-codec</li>
86       * <li>{@code false} not to validate HTTP headers in the http-codec</li>
87       * </ul>
88       * @return {@link AbstractInboundHttp2ToHttpAdapterBuilder} the builder for the {@link InboundHttp2ToHttpAdapter}
89       */
90      protected B validateHttpHeaders(boolean validate) {
91          validateHttpHeaders = validate;
92          return self();
93      }
94  
95      /**
96       * Returns {@code true} if a read settings frame should be propagated along the channel pipeline.
97       */
98      protected boolean isPropagateSettings() {
99          return propagateSettings;
100     }
101 
102     /**
103      * Specifies whether a read settings frame should be propagated along the channel pipeline.
104      *
105      * @param propagate if {@code true} read settings will be passed along the pipeline. This can be useful
106      *                     to clients that need hold off sending data until they have received the settings.
107      * @return {@link AbstractInboundHttp2ToHttpAdapterBuilder} the builder for the {@link InboundHttp2ToHttpAdapter}
108      */
109     protected B propagateSettings(boolean propagate) {
110         propagateSettings = propagate;
111         return self();
112     }
113 
114     /**
115      * Builds/creates a new {@link InboundHttp2ToHttpAdapter} instance using this builder's current settings.
116      */
117     protected T build() {
118         final T instance;
119         try {
120             instance = build(connection(), maxContentLength(),
121                                      isValidateHttpHeaders(), isPropagateSettings());
122         } catch (Throwable t) {
123             throw new IllegalStateException("failed to create a new InboundHttp2ToHttpAdapter", t);
124         }
125         connection.addListener(instance);
126         return instance;
127     }
128 
129     /**
130      * Creates a new {@link InboundHttp2ToHttpAdapter} with the specified properties.
131      */
132     protected abstract T build(Http2Connection connection, int maxContentLength,
133                                boolean validateHttpHeaders, boolean propagateSettings) throws Exception;
134 }