Example usage for io.netty.handler.codec.http HttpHeaders setContentLength

List of usage examples for io.netty.handler.codec.http HttpHeaders setContentLength

Introduction

In this page you can find the example usage for io.netty.handler.codec.http HttpHeaders setContentLength.

Prototype

@Deprecated
public static void setContentLength(HttpMessage message, long length) 

Source Link

Usage

From source file:Netty4.book.http.file.HttpStaticFileServerHandler.java

License:Apache License

@Override
public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) throws Exception {
    if (!request.decoderResult().isSuccess()) {
        sendError(ctx, BAD_REQUEST);// ww w .  j  a v  a  2s.  c o  m
        return;
    }

    if (request.method() != GET) {
        sendError(ctx, METHOD_NOT_ALLOWED);
        return;
    }

    final String uri = request.uri();
    final String path = sanitizeUri(uri);
    if (path == null) {
        sendError(ctx, FORBIDDEN);
        return;
    }

    File file = new File(path);
    if (file.isHidden() || !file.exists()) {
        sendError(ctx, NOT_FOUND);
        return;
    }

    if (file.isDirectory()) {
        if (uri.endsWith("/")) {
            sendListing(ctx, file);
        } else {
            sendRedirect(ctx, uri + '/');
        }
        return;
    }

    if (!file.isFile()) {
        sendError(ctx, FORBIDDEN);
        return;
    }

    // Cache Validation
    String ifModifiedSince = request.headers().get(HttpHeaderNames.IF_MODIFIED_SINCE);
    if (ifModifiedSince != null && !ifModifiedSince.isEmpty()) {
        SimpleDateFormat dateFormatter = new SimpleDateFormat(HTTP_DATE_FORMAT, Locale.US);
        Date ifModifiedSinceDate = dateFormatter.parse(ifModifiedSince);

        // Only compare up to the second because the datetime format we send to the client
        // does not have milliseconds
        long ifModifiedSinceDateSeconds = ifModifiedSinceDate.getTime() / 1000;
        long fileLastModifiedSeconds = file.lastModified() / 1000;
        if (ifModifiedSinceDateSeconds == fileLastModifiedSeconds) {
            sendNotModified(ctx);
            return;
        }
    }

    RandomAccessFile raf;
    try {
        raf = new RandomAccessFile(file, "r");
    } catch (FileNotFoundException ignore) {
        sendError(ctx, NOT_FOUND);
        return;
    }
    long fileLength = raf.length();

    HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
    HttpHeaders.setContentLength(response, fileLength);
    setContentTypeHeader(response, file);
    setDateAndCacheHeaders(response, file);
    if (HttpHeaders.isKeepAlive(request)) {
        response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
    }

    // Write the initial line and the header.
    ctx.write(response);

    // Write the content.
    ChannelFuture sendFileFuture;
    ChannelFuture lastContentFuture;
    if (ctx.pipeline().get(SslHandler.class) == null) {
        sendFileFuture = ctx.write(new DefaultFileRegion(raf.getChannel(), 0, fileLength),
                ctx.newProgressivePromise());
        // Write the end marker.
        lastContentFuture = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
    } else {
        sendFileFuture = ctx.writeAndFlush(new HttpChunkedInput(new ChunkedFile(raf, 0, fileLength, 8192)),
                ctx.newProgressivePromise());
        // HttpChunkedInput will write the end marker (LastHttpContent) for us.
        lastContentFuture = sendFileFuture;
    }

    sendFileFuture.addListener(new ChannelProgressiveFutureListener() {

        public void operationProgressed(ChannelProgressiveFuture future, long progress, long total)

        {
            if (total < 0) { // total unknown
                System.err.println(future.channel() + " Transfer progress: " + progress);
            } else {
                System.err.println(future.channel() + " Transfer progress: " + progress + " / " + total);
            }

        }

        public void operationComplete(ChannelProgressiveFuture future) throws Exception {
            System.err.println(future.channel() + " Transfer complete.");
        }

    }

    );

    // Decide whether to close the connection or not.
    if (!HttpUtil.isKeepAlive(request)) {
        // Close the connection when the whole content is written out.
        lastContentFuture.addListener(ChannelFutureListener.CLOSE);
    }
}

From source file:org.animotron.bridge.http.helper.HttpHelper.java

License:Open Source License

private static void setContentLength(FullHttpResponse response) {
    HttpHeaders.setContentLength(response, response.content().readableBytes());
}

From source file:org.animotron.bridge.http.helper.HttpHelper.java

License:Open Source License

public static void sendFile(final ChannelHandlerContext ctx, final FullHttpRequest request, final File file,
        String mime, String cache) throws Throwable {
    final RandomAccessFile raf = new RandomAccessFile(file, "r");
    FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK);
    long modified = file.lastModified();
    Date since = parseDate(getHeader(request, IF_MODIFIED_SINCE));
    if (since != null && since.getTime() >= modified) {
        sendStatus(ctx, NOT_MODIFIED);//from w  w w . j  a va  2 s  . c o  m
    } else {
        final long length = raf.length();
        setDate(response);
        setLastModified(response, modified);
        HttpHeaders.setContentLength(response, length);
        HttpHeaders.setHeader(response, CONTENT_TYPE, MimeHelper.check(mime));
        setHeader(response, CACHE_CONTROL, cache);
        if (isKeepAlive(request)) {
            setHeader(response, CONNECTION, KEEP_ALIVE);
        }
        ctx.write(response);
        ChannelFuture writeFuture = ctx.write(new ChunkedFile(raf, 0, length, 8192));
        if (!isKeepAlive(request)) {
            writeFuture.addListener(CLOSE);
        }
    }
}

From source file:org.apache.flink.runtime.webmonitor.files.StaticFileServerHandler.java

License:Apache License

/**
 * Response when running with leading JobManager.
 */// w  ww .j av  a2  s . co m
private void respondAsLeader(ChannelHandlerContext ctx, HttpRequest request, String requestPath)
        throws IOException, ParseException, URISyntaxException {

    // convert to absolute path
    final File file = new File(rootPath, requestPath);

    if (!file.exists()) {
        // file does not exist. Try to load it with the classloader
        ClassLoader cl = StaticFileServerHandler.class.getClassLoader();

        try (InputStream resourceStream = cl.getResourceAsStream("web" + requestPath)) {
            boolean success = false;
            try {
                if (resourceStream != null) {
                    URL root = cl.getResource("web");
                    URL requested = cl.getResource("web" + requestPath);

                    if (root != null && requested != null) {
                        URI rootURI = new URI(root.getPath()).normalize();
                        URI requestedURI = new URI(requested.getPath()).normalize();

                        // Check that we don't load anything from outside of the
                        // expected scope.
                        if (!rootURI.relativize(requestedURI).equals(requestedURI)) {
                            logger.debug("Loading missing file from classloader: {}", requestPath);
                            // ensure that directory to file exists.
                            file.getParentFile().mkdirs();
                            Files.copy(resourceStream, file.toPath());

                            success = true;
                        }
                    }
                }
            } catch (Throwable t) {
                logger.error("error while responding", t);
            } finally {
                if (!success) {
                    logger.debug("Unable to load requested file {} from classloader", requestPath);
                    sendError(ctx, NOT_FOUND);
                    return;
                }
            }
        }
    }

    if (!file.exists() || file.isHidden() || file.isDirectory() || !file.isFile()) {
        sendError(ctx, NOT_FOUND);
        return;
    }

    if (!file.getCanonicalFile().toPath().startsWith(rootPath.toPath())) {
        sendError(ctx, NOT_FOUND);
        return;
    }

    // cache validation
    final String ifModifiedSince = request.headers().get(IF_MODIFIED_SINCE);
    if (ifModifiedSince != null && !ifModifiedSince.isEmpty()) {
        SimpleDateFormat dateFormatter = new SimpleDateFormat(HTTP_DATE_FORMAT, Locale.US);
        Date ifModifiedSinceDate = dateFormatter.parse(ifModifiedSince);

        // Only compare up to the second because the datetime format we send to the client
        // does not have milliseconds
        long ifModifiedSinceDateSeconds = ifModifiedSinceDate.getTime() / 1000;
        long fileLastModifiedSeconds = file.lastModified() / 1000;
        if (ifModifiedSinceDateSeconds == fileLastModifiedSeconds) {
            if (logger.isDebugEnabled()) {
                logger.debug("Responding 'NOT MODIFIED' for file '" + file.getAbsolutePath() + '\'');
            }

            sendNotModified(ctx);
            return;
        }
    }

    if (logger.isDebugEnabled()) {
        logger.debug("Responding with file '" + file.getAbsolutePath() + '\'');
    }

    // Don't need to close this manually. Netty's DefaultFileRegion will take care of it.
    final RandomAccessFile raf;
    try {
        raf = new RandomAccessFile(file, "r");
    } catch (FileNotFoundException e) {
        sendError(ctx, NOT_FOUND);
        return;
    }
    long fileLength = raf.length();

    HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
    setContentTypeHeader(response, file);

    // since the log and out files are rapidly changing, we don't want to browser to cache them
    if (!(requestPath.contains("log") || requestPath.contains("out"))) {
        setDateAndCacheHeaders(response, file);
    }
    if (HttpHeaders.isKeepAlive(request)) {
        response.headers().set(CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
    }
    HttpHeaders.setContentLength(response, fileLength);

    // write the initial line and the header.
    ctx.write(response);

    // write the content.
    ctx.write(new DefaultFileRegion(raf.getChannel(), 0, fileLength), ctx.newProgressivePromise());
    ChannelFuture lastContentFuture = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);

    // close the connection, if no keep-alive is needed
    if (!HttpHeaders.isKeepAlive(request)) {
        lastContentFuture.addListener(ChannelFutureListener.CLOSE);
    }
}

From source file:org.apache.flink.runtime.webmonitor.handlers.TaskManagerLogHandler.java

License:Apache License

/**
 * Response when running with leading JobManager.
 *//*  w w  w.j  a v  a 2  s  .co  m*/
@Override
protected void respondAsLeader(final ChannelHandlerContext ctx, final Routed routed,
        final ActorGateway jobManager) {
    if (cache == null) {
        Future<Object> portFuture = jobManager.ask(JobManagerMessages.getRequestBlobManagerPort(), timeout);
        cache = portFuture.map(new Mapper<Object, BlobCache>() {
            @Override
            public BlobCache apply(Object result) {
                Option<String> hostOption = jobManager.actor().path().address().host();
                String host = hostOption.isDefined() ? hostOption.get() : "localhost";
                int port = (int) result;
                return new BlobCache(new InetSocketAddress(host, port), config);
            }
        }, executor);
    }

    final String taskManagerID = routed.pathParams().get(TaskManagersHandler.TASK_MANAGER_ID_KEY);
    final HttpRequest request = routed.request();

    //fetch TaskManager logs if no other process is currently doing it
    if (lastRequestPending.putIfAbsent(taskManagerID, true) == null) {
        try {
            InstanceID instanceID = new InstanceID(StringUtils.hexStringToByte(taskManagerID));
            Future<Object> taskManagerFuture = jobManager
                    .ask(new JobManagerMessages.RequestTaskManagerInstance(instanceID), timeout);

            Future<Object> blobKeyFuture = taskManagerFuture.flatMap(new Mapper<Object, Future<Object>>() {
                @Override
                public Future<Object> apply(Object instance) {
                    Instance taskManager = ((JobManagerMessages.TaskManagerInstance) instance).instance().get();
                    return taskManager.getActorGateway()
                            .ask(serveLogFile ? TaskManagerMessages.getRequestTaskManagerLog()
                                    : TaskManagerMessages.getRequestTaskManagerStdout(), timeout);
                }
            }, executor);

            Future<Object> logPathFuture = cache.zip(blobKeyFuture)
                    .map(new Mapper<Tuple2<BlobCache, Object>, Object>() {
                        @Override
                        public Object checkedApply(Tuple2<BlobCache, Object> instance) throws Exception {
                            BlobCache cache = instance._1();
                            if (instance._2() instanceof Exception) {
                                throw (Exception) instance._2();
                            }
                            BlobKey blobKey = (BlobKey) instance._2();

                            //delete previous log file, if it is different than the current one
                            HashMap<String, BlobKey> lastSubmittedFile = serveLogFile ? lastSubmittedLog
                                    : lastSubmittedStdout;
                            if (lastSubmittedFile.containsKey(taskManagerID)) {
                                if (!blobKey.equals(lastSubmittedFile.get(taskManagerID))) {
                                    cache.deleteGlobal(lastSubmittedFile.get(taskManagerID));
                                    lastSubmittedFile.put(taskManagerID, blobKey);
                                }
                            } else {
                                lastSubmittedFile.put(taskManagerID, blobKey);
                            }
                            return cache.getURL(blobKey).getFile();
                        }
                    }, executor);

            logPathFuture.onFailure(new OnFailure() {
                @Override
                public void onFailure(Throwable failure) throws Throwable {
                    display(ctx, request, "Fetching TaskManager log failed.");
                    LOG.error("Fetching TaskManager log failed.", failure);
                    lastRequestPending.remove(taskManagerID);
                }
            }, executor);

            logPathFuture.onSuccess(new OnSuccess<Object>() {
                @Override
                public void onSuccess(Object filePathOption) throws Throwable {
                    String filePath = (String) filePathOption;

                    File file = new File(filePath);
                    final RandomAccessFile raf;
                    try {
                        raf = new RandomAccessFile(file, "r");
                    } catch (FileNotFoundException e) {
                        display(ctx, request, "Displaying TaskManager log failed.");
                        LOG.error("Displaying TaskManager log failed.", e);
                        return;
                    }
                    long fileLength = raf.length();
                    final FileChannel fc = raf.getChannel();

                    HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
                    response.headers().set(CONTENT_TYPE, "text/plain");

                    if (HttpHeaders.isKeepAlive(request)) {
                        response.headers().set(CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
                    }
                    HttpHeaders.setContentLength(response, fileLength);

                    // write the initial line and the header.
                    ctx.write(response);

                    // write the content.
                    ctx.write(new DefaultFileRegion(fc, 0, fileLength), ctx.newProgressivePromise())
                            .addListener(
                                    new GenericFutureListener<io.netty.util.concurrent.Future<? super Void>>() {
                                        @Override
                                        public void operationComplete(
                                                io.netty.util.concurrent.Future<? super Void> future)
                                                throws Exception {
                                            lastRequestPending.remove(taskManagerID);
                                            fc.close();
                                            raf.close();
                                        }
                                    });
                    ChannelFuture lastContentFuture = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);

                    // close the connection, if no keep-alive is needed
                    if (!HttpHeaders.isKeepAlive(request)) {
                        lastContentFuture.addListener(ChannelFutureListener.CLOSE);
                    }
                }
            }, executor);
        } catch (Exception e) {
            display(ctx, request, "Error: " + e.getMessage());
            LOG.error("Fetching TaskManager log failed.", e);
            lastRequestPending.remove(taskManagerID);
        }
    } else {
        display(ctx, request, "loading...");
    }
}

From source file:org.apache.flink.runtime.webmonitor.handlers.TaskManagerLogHandler.java

License:Apache License

private void display(ChannelHandlerContext ctx, HttpRequest request, String message) {
    HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
    response.headers().set(CONTENT_TYPE, "text/plain");

    if (HttpHeaders.isKeepAlive(request)) {
        response.headers().set(CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
    }/*from w  ww . j av  a 2s. c  o  m*/

    byte[] buf = message.getBytes();

    ByteBuf b = Unpooled.copiedBuffer(buf);

    HttpHeaders.setContentLength(response, buf.length);

    // write the initial line and the header.
    ctx.write(response);

    ctx.write(b);

    ChannelFuture lastContentFuture = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);

    // close the connection, if no keep-alive is needed
    if (!HttpHeaders.isKeepAlive(request)) {
        lastContentFuture.addListener(ChannelFutureListener.CLOSE);
    }
}

From source file:org.apache.tajo.HttpFileServerHandler.java

License:Apache License

@Override
public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) throws Exception {

    if (request.getMethod() != HttpMethod.GET) {
        sendError(ctx, HttpResponseStatus.METHOD_NOT_ALLOWED);
        return;/*from  w w w  .  j av  a2s  .co  m*/
    }

    final String path = sanitizeUri(request.getUri());
    if (path == null) {
        sendError(ctx, HttpResponseStatus.FORBIDDEN);
        return;
    }

    File file = new File(path);
    if (file.isHidden() || !file.exists()) {
        sendError(ctx, HttpResponseStatus.NOT_FOUND);
        return;
    }
    if (!file.isFile()) {
        sendError(ctx, HttpResponseStatus.FORBIDDEN);
        return;
    }

    RandomAccessFile raf;
    try {
        raf = new RandomAccessFile(file, "r");
    } catch (FileNotFoundException fnfe) {
        sendError(ctx, HttpResponseStatus.NOT_FOUND);
        return;
    }
    long fileLength = raf.length();

    HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
    HttpHeaders.setContentLength(response, fileLength);
    setContentTypeHeader(response);

    // Write the initial line and the header.
    ctx.write(response);

    // Write the content.
    ChannelFuture writeFuture;
    ChannelFuture lastContentFuture;
    if (ctx.pipeline().get(SslHandler.class) != null) {
        // Cannot use zero-copy with HTTPS.
        lastContentFuture = ctx.writeAndFlush(new HttpChunkedInput(new ChunkedFile(raf, 0, fileLength, 8192)));
    } else {
        // No encryption - use zero-copy.
        final FileRegion region = new DefaultFileRegion(raf.getChannel(), 0, fileLength);
        writeFuture = ctx.write(region);
        lastContentFuture = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
        writeFuture.addListener(new ChannelProgressiveFutureListener() {
            @Override
            public void operationProgressed(ChannelProgressiveFuture future, long progress, long total)
                    throws Exception {
                LOG.trace(String.format("%s: %d / %d", path, progress, total));
            }

            @Override
            public void operationComplete(ChannelProgressiveFuture future) throws Exception {
                region.release();
            }
        });
    }

    // Decide whether to close the connection or not.
    if (!HttpHeaders.isKeepAlive(request)) {
        // Close the connection when the whole content is written out.
        lastContentFuture.addListener(ChannelFutureListener.CLOSE);
    }
}

From source file:org.apache.tajo.pullserver.HttpDataServerHandler.java

License:Apache License

@Override
public void channelRead0(ChannelHandlerContext ctx, FullHttpRequest request) throws Exception {

    if (request.getMethod() != HttpMethod.GET) {
        sendError(ctx, HttpResponseStatus.METHOD_NOT_ALLOWED);
        return;/*from  w  w  w .  java 2s  .c o m*/
    }

    String base = ContainerLocalizer.USERCACHE + "/" + userName + "/" + ContainerLocalizer.APPCACHE + "/"
            + appId + "/output" + "/";

    final Map<String, List<String>> params = new QueryStringDecoder(request.getUri()).parameters();

    List<FileChunk> chunks = Lists.newArrayList();
    List<String> taskIds = splitMaps(params.get("ta"));
    int sid = Integer.valueOf(params.get("sid").get(0));
    int partitionId = Integer.valueOf(params.get("p").get(0));
    for (String ta : taskIds) {

        File file = new File(base + "/" + sid + "/" + ta + "/output/" + partitionId);
        FileChunk chunk = new FileChunk(file, 0, file.length());
        chunks.add(chunk);
    }

    FileChunk[] file = chunks.toArray(new FileChunk[chunks.size()]);

    // Write the content.
    if (file == null) {
        HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.NO_CONTENT);
        if (!HttpHeaders.isKeepAlive(request)) {
            ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
        } else {
            response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
            ctx.writeAndFlush(response);
        }
    } else {
        HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
        ChannelFuture writeFuture = null;
        long totalSize = 0;
        for (FileChunk chunk : file) {
            totalSize += chunk.length();
        }
        HttpHeaders.setContentLength(response, totalSize);

        if (HttpHeaders.isKeepAlive(request)) {
            response.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE);
        }
        // Write the initial line and the header.
        writeFuture = ctx.write(response);

        for (FileChunk chunk : file) {
            writeFuture = sendFile(ctx, chunk);
            if (writeFuture == null) {
                sendError(ctx, HttpResponseStatus.NOT_FOUND);
                return;
            }
        }
        if (ctx.pipeline().get(SslHandler.class) == null) {
            writeFuture = ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
        } else {
            ctx.flush();
        }

        // Decide whether to close the connection or not.
        if (!HttpHeaders.isKeepAlive(request)) {
            // Close the connection when the whole content is written out.
            writeFuture.addListener(ChannelFutureListener.CLOSE);
        }
    }

}

From source file:org.apache.tajo.storage.http.ExampleHttpServerHandler.java

License:Apache License

private void processHead(ChannelHandlerContext context, FullHttpRequest request) {
    HttpHeaders headers = request.headers();
    FullHttpResponse response = null;/*  w  w w  . j a  v a  2  s  .  co m*/

    if (headers.contains(Names.CONTENT_LENGTH)) {

        try {
            File file = getRequestedFile(request.getUri());

            response = new DefaultFullHttpResponse(HTTP_1_1,
                    request.getDecoderResult().isSuccess() ? OK : BAD_REQUEST);

            HttpHeaders.setContentLength(response, file.length());

        } catch (FileNotFoundException | URISyntaxException e) {
            response = getBadRequest(e.getMessage());
        }
    }

    context.writeAndFlush(response);
}

From source file:org.apache.tajo.storage.http.ExampleHttpServerHandler.java

License:Apache License

private void processGet(ChannelHandlerContext context, FullHttpRequest request) {
    try {/*from w  ww.  j  a  va 2s.c  o m*/
        File file = getRequestedFile(request.getUri());

        RandomAccessFile raf = new RandomAccessFile(file, "r");
        long fileLength = raf.length();

        HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
        HttpHeaders.setContentLength(response, fileLength);
        setContentTypeHeader(response, file);

        context.write(response);

        context.write(new DefaultFileRegion(raf.getChannel(), 0, fileLength));

        // Write the end marker.
        ChannelFuture future = context.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
        future.addListener(ChannelFutureListener.CLOSE);

    } catch (IOException | URISyntaxException e) {
        context.writeAndFlush(getBadRequest(e.getMessage()));
    }
}