protected void writeChunk()

in src/main/java/com/twitter/http2/HttpStreamEncoder.java [200:243]


    protected void writeChunk(
            ChannelHandlerContext ctx, ChannelPromise future, int streamId, HttpContent content) {

        HttpFrame[] httpFrames = createHttpDataFrames(streamId, content.content());

        if (content instanceof LastHttpContent) {
            LastHttpContent trailer = (LastHttpContent) content;
            HttpHeaders trailers = trailer.trailingHeaders();
            if (trailers.isEmpty()) {
                if (httpFrames.length == 0) {
                    HttpDataFrame httpDataFrame = new DefaultHttpDataFrame(streamId);
                    httpDataFrame.setLast(true);
                    httpFrames = new HttpFrame[1];
                    httpFrames[0] = httpDataFrame;
                } else {
                    HttpDataFrame httpDataFrame = (HttpDataFrame) httpFrames[httpFrames.length - 1];
                    httpDataFrame.setLast(true);
                }
            } else {
                // Create HTTP HEADERS frame out of trailers
                HttpHeadersFrame httpHeadersFrame = new DefaultHttpHeadersFrame(streamId);
                httpHeadersFrame.setLast(true);
                for (Map.Entry<String, String> entry : trailer.trailingHeaders()) {
                    httpHeadersFrame.headers().add(entry.getKey(), entry.getValue());
                }
                if (httpFrames.length == 0) {
                    httpFrames = new HttpFrame[1];
                    httpFrames[0] = httpHeadersFrame;
                } else {
                    HttpFrame[] copy = new HttpFrame[httpFrames.length + 1];
                    for (int i = 0; i < httpFrames.length; i++) {
                        copy[i] = httpFrames[i];
                    }
                    copy[httpFrames.length] = httpHeadersFrame;
                    httpFrames = copy;
                }
            }
        }

        ChannelPromise frameFuture = getFrameFuture(ctx, future, httpFrames);

        // Trigger a write
        frameFuture.setSuccess();
    }