Search in sources :

Example 1 with SystemFile

use of io.micronaut.http.server.types.files.SystemFile in project micronaut-core by micronaut-projects.

the class FileTypeHandler method handle.

@SuppressWarnings("MagicNumber")
@Override
public void handle(Object obj, HttpRequest<?> request, MutableHttpResponse<?> response, ChannelHandlerContext context) {
    NettyFileCustomizableResponseType type;
    if (obj instanceof File) {
        type = new NettySystemFileCustomizableResponseType((File) obj);
    } else if (obj instanceof NettyFileCustomizableResponseType) {
        type = (NettyFileCustomizableResponseType) obj;
    } else if (obj instanceof StreamedFile) {
        type = new NettyStreamedFileCustomizableResponseType((StreamedFile) obj);
    } else if (obj instanceof SystemFile) {
        type = new NettySystemFileCustomizableResponseType((SystemFile) obj);
    } else {
        throw new CustomizableResponseTypeException("FileTypeHandler only supports File or FileCustomizableResponseType types");
    }
    long lastModified = type.getLastModified();
    // Cache Validation
    ZonedDateTime ifModifiedSince = request.getHeaders().getDate(HttpHeaders.IF_MODIFIED_SINCE);
    if (ifModifiedSince != null) {
        // Only compare up to the second because the datetime format we send to the client
        // does not have milliseconds
        long ifModifiedSinceDateSeconds = ifModifiedSince.toEpochSecond();
        long fileLastModifiedSeconds = lastModified / 1000;
        if (ifModifiedSinceDateSeconds == fileLastModifiedSeconds) {
            FullHttpResponse nettyResponse = notModified(response);
            if (request instanceof NettyHttpRequest) {
                ((NettyHttpRequest<?>) request).prepareHttp2ResponseIfNecessary(nettyResponse);
            }
            context.writeAndFlush(nettyResponse);
            return;
        }
    }
    if (!response.getHeaders().contains(HttpHeaders.CONTENT_TYPE)) {
        response.header(HttpHeaders.CONTENT_TYPE, type.getMediaType().toString());
    }
    setDateAndCacheHeaders(response, lastModified);
    type.process(response);
    type.write(request, response, context);
    context.read();
}
Also used : NettyFileCustomizableResponseType(io.micronaut.http.server.netty.types.NettyFileCustomizableResponseType) ZonedDateTime(java.time.ZonedDateTime) SystemFile(io.micronaut.http.server.types.files.SystemFile) StreamedFile(io.micronaut.http.server.types.files.StreamedFile) FullHttpResponse(io.netty.handler.codec.http.FullHttpResponse) NettyHttpRequest(io.micronaut.http.server.netty.NettyHttpRequest) StreamedFile(io.micronaut.http.server.types.files.StreamedFile) SystemFile(io.micronaut.http.server.types.files.SystemFile) File(java.io.File) CustomizableResponseTypeException(io.micronaut.http.server.types.CustomizableResponseTypeException)

Aggregations

NettyHttpRequest (io.micronaut.http.server.netty.NettyHttpRequest)1 NettyFileCustomizableResponseType (io.micronaut.http.server.netty.types.NettyFileCustomizableResponseType)1 CustomizableResponseTypeException (io.micronaut.http.server.types.CustomizableResponseTypeException)1 StreamedFile (io.micronaut.http.server.types.files.StreamedFile)1 SystemFile (io.micronaut.http.server.types.files.SystemFile)1 FullHttpResponse (io.netty.handler.codec.http.FullHttpResponse)1 File (java.io.File)1 ZonedDateTime (java.time.ZonedDateTime)1