@Override
    protected void channelRead0(ChannelHandlerContext ctx, FullHttpResponse msg) throws Exception {
        HttpHeaders headers = msg.headers();
        Integer streamId = headers.getInt(HttpConversionUtil.ExtensionHeaderNames.STREAM_ID.text());
        if (streamId == null) {
            if (LOGGER.isWarnEnabled()) {
                LOGGER.warn("HttpResponseHandler unexpected message received: {}, data is {}", msg.toString(),
                    NettyHelper.toString(msg.content()));
            }
            return;
        }

        Entry<ChannelFuture, AbstractHttpClientHandler> entry = removePromise(streamId);
        if (entry == null) {
            if (LOGGER.isWarnEnabled()) {
                LOGGER.warn("Message received for unknown stream id {}, msg is {}, data is {}", streamId,
                    msg.toString(), NettyHelper.toString(msg.content()));
            }
        } else {
            final AbstractHttpClientHandler callback = entry.getValue();
            callback.receiveHttpResponse(msg);
        }
    }
Create an association between an anticipated response stream id and a {@link ChannelPromise}

@param streamId    The stream for which a response is expected
@param writeFuture A future that represent the request write operation
@param promise     The promise object that will be used to wait/notify events
@return The previous object associated with {@code streamId}
remoting/remoting-http/src/main/java/com/alipay/sofa/rpc/transport/http/Http2ClientChannelHandler.java