View Javadoc
1   /*
2    * Copyright 2014 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  
16  package io.netty.handler.codec.http2;
17  
18  import io.netty.util.internal.UnstableApi;
19  
20  /**
21   * A single stream within an HTTP2 connection. Streams are compared to each other by priority.
22   */
23  @UnstableApi
24  public interface Http2Stream {
25  
26      /**
27       * The allowed states of an HTTP2 stream.
28       */
29      enum State {
30          IDLE(false, false),
31          RESERVED_LOCAL(false, false),
32          RESERVED_REMOTE(false, false),
33          OPEN(true, true),
34          HALF_CLOSED_LOCAL(false, true),
35          HALF_CLOSED_REMOTE(true, false),
36          CLOSED(false, false);
37  
38          private final boolean localSideOpen;
39          private final boolean remoteSideOpen;
40  
41          State(boolean localSideOpen, boolean remoteSideOpen) {
42              this.localSideOpen = localSideOpen;
43              this.remoteSideOpen = remoteSideOpen;
44          }
45  
46          /**
47           * Indicates whether the local side of this stream is open (i.e. the state is either
48           * {@link State#OPEN} or {@link State#HALF_CLOSED_REMOTE}).
49           */
50          public boolean localSideOpen() {
51              return localSideOpen;
52          }
53  
54          /**
55           * Indicates whether the remote side of this stream is open (i.e. the state is either
56           * {@link State#OPEN} or {@link State#HALF_CLOSED_LOCAL}).
57           */
58          public boolean remoteSideOpen() {
59              return remoteSideOpen;
60          }
61      }
62  
63      /**
64       * Gets the unique identifier for this stream within the connection.
65       */
66      int id();
67  
68      /**
69       * Gets the state of this stream.
70       */
71      State state();
72  
73      /**
74       * Opens this stream, making it available via {@link Http2Connection#forEachActiveStream(Http2StreamVisitor)} and
75       * transition state to:
76       * <ul>
77       * <li>{@link State#OPEN} if {@link #state()} is {@link State#IDLE} and {@code halfClosed} is {@code false}.</li>
78       * <li>{@link State#HALF_CLOSED_LOCAL} if {@link #state()} is {@link State#IDLE} and {@code halfClosed}
79       * is {@code true} and the stream is local. In this state, {@link #isHeadersSent()} is {@code true}</li>
80       * <li>{@link State#HALF_CLOSED_REMOTE} if {@link #state()} is {@link State#IDLE} and {@code halfClosed}
81       * is {@code true} and the stream is remote. In this state, {@link #isHeadersReceived()} is {@code true}</li>
82       * <li>{@link State#RESERVED_LOCAL} if {@link #state()} is {@link State#HALF_CLOSED_REMOTE}.</li>
83       * <li>{@link State#RESERVED_REMOTE} if {@link #state()} is {@link State#HALF_CLOSED_LOCAL}.</li>
84       * </ul>
85       */
86      Http2Stream open(boolean halfClosed) throws Http2Exception;
87  
88      /**
89       * Closes the stream.
90       */
91      Http2Stream close();
92  
93      /**
94       * Closes the local side of this stream. If this makes the stream closed, the child is closed as
95       * well.
96       */
97      Http2Stream closeLocalSide();
98  
99      /**
100      * Closes the remote side of this stream. If this makes the stream closed, the child is closed
101      * as well.
102      */
103     Http2Stream closeRemoteSide();
104 
105     /**
106      * Indicates whether a {@code RST_STREAM} frame has been sent from the local endpoint for this stream.
107      */
108     boolean isResetSent();
109 
110     /**
111      * Sets the flag indicating that a {@code RST_STREAM} frame has been sent from the local endpoint
112      * for this stream. This does not affect the stream state.
113      */
114     Http2Stream resetSent();
115 
116     /**
117      * Associates the application-defined data with this stream.
118      * @return The value that was previously associated with {@code key}, or {@code null} if there was none.
119      */
120     <V> V setProperty(Http2Connection.PropertyKey key, V value);
121 
122     /**
123      * Returns application-defined data if any was associated with this stream.
124      */
125     <V> V getProperty(Http2Connection.PropertyKey key);
126 
127     /**
128      * Returns and removes application-defined data if any was associated with this stream.
129      */
130     <V> V removeProperty(Http2Connection.PropertyKey key);
131 
132     /**
133      * Indicates that headers have been sent to the remote endpoint on this stream. The first call to this method would
134      * be for the initial headers (see {@link #isHeadersSent()}} and the second call would indicate the trailers
135      * (see {@link #isTrailersReceived()}).
136      * @param isInformational {@code true} if the headers contain an informational status code (for responses only).
137      */
138     Http2Stream headersSent(boolean isInformational);
139 
140     /**
141      * Indicates whether or not headers were sent to the remote endpoint.
142      */
143     boolean isHeadersSent();
144 
145     /**
146      * Indicates whether or not trailers were sent to the remote endpoint.
147      */
148     boolean isTrailersSent();
149 
150     /**
151      * Indicates that headers have been received. The first call to this method would be for the initial headers
152      * (see {@link #isHeadersReceived()}} and the second call would indicate the trailers
153      * (see {@link #isTrailersReceived()}).
154      * @param isInformational {@code true} if the headers contain an informational status code (for responses only).
155      */
156     Http2Stream headersReceived(boolean isInformational);
157 
158     /**
159      * Indicates whether or not the initial headers have been received.
160      */
161     boolean isHeadersReceived();
162 
163     /**
164      * Indicates whether or not the trailers have been received.
165      */
166     boolean isTrailersReceived();
167 
168     /**
169      * Indicates that a push promise was sent to the remote endpoint.
170      */
171     Http2Stream pushPromiseSent();
172 
173     /**
174      * Indicates whether or not a push promise was sent to the remote endpoint.
175      */
176     boolean isPushPromiseSent();
177 }