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 package io.netty.handler.codec.http2;
16
17 import io.netty.buffer.ByteBuf;
18 import io.netty.channel.ChannelFuture;
19 import io.netty.channel.ChannelHandlerContext;
20 import io.netty.channel.ChannelPromise;
21 import io.netty.util.internal.UnstableApi;
22
23 /**
24 * Manager for the life cycle of the HTTP/2 connection. Handles graceful shutdown of the channel,
25 * closing only after all of the streams have closed.
26 */
27 @UnstableApi
28 public interface Http2LifecycleManager {
29
30 /**
31 * Closes the local side of the {@code stream}. Depending on the {@code stream} state this may result in
32 * {@code stream} being closed. See {@link #closeStream(Http2Stream, ChannelFuture)}.
33 * @param stream the stream to be half closed.
34 * @param future See {@link #closeStream(Http2Stream, ChannelFuture)}.
35 */
36 void closeStreamLocal(Http2Stream stream, ChannelFuture future);
37
38 /**
39 * Closes the remote side of the {@code stream}. Depending on the {@code stream} state this may result in
40 * {@code stream} being closed. See {@link #closeStream(Http2Stream, ChannelFuture)}.
41 * @param stream the stream to be half closed.
42 * @param future See {@link #closeStream(Http2Stream, ChannelFuture)}.
43 */
44 void closeStreamRemote(Http2Stream stream, ChannelFuture future);
45
46 /**
47 * Closes and deactivates the given {@code stream}. A listener is also attached to {@code future} and upon
48 * completion the underlying channel will be closed if {@link Http2Connection#numActiveStreams()} is 0.
49 * @param stream the stream to be closed and deactivated.
50 * @param future when completed if {@link Http2Connection#numActiveStreams()} is 0 then the underlying channel
51 * will be closed.
52 */
53 void closeStream(Http2Stream stream, ChannelFuture future);
54
55 /**
56 * Ensure the stream identified by {@code streamId} is reset. If our local state does not indicate the stream has
57 * been reset yet then a {@code RST_STREAM} will be sent to the peer. If our local state indicates the stream
58 * has already been reset then the return status will indicate success without sending anything to the peer.
59 * @param ctx The context used for communication and buffer allocation if necessary.
60 * @param streamId The identifier of the stream to reset.
61 * @param errorCode Justification as to why this stream is being reset. See {@link Http2Error}.
62 * @param promise Used to indicate the return status of this operation.
63 * @return Will be considered successful when the connection and stream state has been updated, and a
64 * {@code RST_STREAM} frame has been sent to the peer. If the stream state has already been updated and a
65 * {@code RST_STREAM} frame has been sent then the return status may indicate success immediately.
66 */
67 ChannelFuture resetStream(ChannelHandlerContext ctx, int streamId, long errorCode,
68 ChannelPromise promise);
69
70 /**
71 * Prevents the peer from creating streams and close the connection if {@code errorCode} is not
72 * {@link Http2Error#NO_ERROR}. After this call the peer is not allowed to create any new streams and the local
73 * endpoint will be limited to creating streams with {@code stream identifier <= lastStreamId}. This may result in
74 * sending a {@code GO_AWAY} frame (assuming we have not already sent one with
75 * {@code Last-Stream-ID <= lastStreamId}), or may just return success if a {@code GO_AWAY} has previously been
76 * sent.
77 * @param ctx The context used for communication and buffer allocation if necessary.
78 * @param lastStreamId The last stream that the local endpoint is claiming it will accept.
79 * @param errorCode The rational as to why the connection is being closed. See {@link Http2Error}.
80 * @param debugData For diagnostic purposes (carries no semantic value).
81 * @param promise Used to indicate the return status of this operation.
82 * @return Will be considered successful when the connection and stream state has been updated, and a
83 * {@code GO_AWAY} frame has been sent to the peer. If the stream state has already been updated and a
84 * {@code GO_AWAY} frame has been sent then the return status may indicate success immediately.
85 */
86 ChannelFuture goAway(ChannelHandlerContext ctx, int lastStreamId, long errorCode,
87 ByteBuf debugData, ChannelPromise promise);
88
89 /**
90 * Processes the given error.
91 *
92 * @param ctx The context used for communication and buffer allocation if necessary.
93 * @param outbound {@code true} if the error was caused by an outbound operation and so the corresponding
94 * {@link ChannelPromise} was failed as well.
95 * @param cause the error.
96 */
97 void onError(ChannelHandlerContext ctx, boolean outbound, Throwable cause);
98 }