use of io.micronaut.http.netty.NettyMutableHttpResponse in project micronaut-core by micronaut-projects.
the class NettySystemFileCustomizableResponseType method write.
@Override
public void write(HttpRequest<?> request, MutableHttpResponse<?> response, ChannelHandlerContext context) {
if (response instanceof NettyMutableHttpResponse) {
NettyMutableHttpResponse nettyResponse = ((NettyMutableHttpResponse) response);
// Write the request data
final DefaultHttpResponse finalResponse = new DefaultHttpResponse(nettyResponse.getNettyHttpVersion(), nettyResponse.getNettyHttpStatus(), nettyResponse.getNettyHeaders());
if (request instanceof NettyHttpRequest) {
((NettyHttpRequest<?>) request).prepareHttp2ResponseIfNecessary(finalResponse);
}
context.write(finalResponse, context.voidPromise());
FileHolder file = new FileHolder(getFile());
// Write the content.
if (context.pipeline().get(SslHandler.class) == null && context.pipeline().get(SmartHttpContentCompressor.class).shouldSkip(finalResponse)) {
// SSL not enabled - can use zero-copy file transfer.
context.write(new DefaultFileRegion(file.raf.getChannel(), 0, getLength()), context.newProgressivePromise()).addListener(file);
context.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
} else {
// SSL enabled - cannot use zero-copy file transfer.
try {
// HttpChunkedInput will write the end marker (LastHttpContent) for us.
final HttpChunkedInput chunkedInput = new HttpChunkedInput(new ChunkedFile(file.raf, 0, getLength(), LENGTH_8K));
context.writeAndFlush(chunkedInput, context.newProgressivePromise()).addListener(file);
} catch (IOException e) {
throw new CustomizableResponseTypeException("Could not read file", e);
}
}
} else {
throw new IllegalArgumentException("Unsupported response type. Not a Netty response: " + response);
}
}
Aggregations