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();
}