All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.vertx.ext.web.handler.impl.FaviconHandlerImpl Maven / Gradle / Ivy

There is a newer version: 4.5.10
Show newest version
/*
 * Copyright 2014 Red Hat, Inc.
 *
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *  The Eclipse Public License is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  The Apache License v2.0 is available at
 *  http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 */

package io.vertx.ext.web.handler.impl;

import io.vertx.core.MultiMap;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.http.CaseInsensitiveHeaders;
import io.vertx.ext.web.handler.FaviconHandler;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.impl.Utils;

import static io.vertx.core.http.HttpHeaders.*;

/**
 * @author Paulo Lopes
 * @author Tim Fox
 */
public class FaviconHandlerImpl implements FaviconHandler {

  /**
   * ## Icon
   *
   * Represents a favicon.ico file and related headers
   */
  private class Icon {
    /**
     * Headers for the icon resource
     */
    private final MultiMap headers;

    /**
     * Binary content of the icon file
     */
    private final Buffer body;

    /**
     * Instantiate a new Icon
     *
     * @param buffer buffer containing the image data for this icon.
     */
    private Icon(Buffer buffer) {
      headers = new CaseInsensitiveHeaders();
      body = buffer;

      headers.add(CONTENT_TYPE, "image/x-icon");
      headers.add(CONTENT_LENGTH, Integer.toString(buffer.length()));
      headers.add(CACHE_CONTROL, "public, max-age=" + maxAgeSeconds);
    }
  }

  /**
   * favicon cache
   */
  private Icon icon;

  /**
   * Location of the icon in the file system
   */
  private final String path;

  /**
   * Cache control for the resource
   */
  private final long maxAgeSeconds;

  /**
   * Create a new Favicon instance using a file in the file system and customizable cache period
   *
   * 
   * Yoke yoke = new Yoke(...);
   * yoke.use(new Favicon("/icons/icon.ico", 1000));
   * 
* * @param path file path to icon * @param maxAgeSeconds max allowed time to be cached in seconds */ public FaviconHandlerImpl(String path, long maxAgeSeconds) { this.path = path; this.maxAgeSeconds = maxAgeSeconds; if (maxAgeSeconds < 0) { throw new IllegalArgumentException("maxAgeSeconds must be > 0"); } } /** * Create a new Favicon instance from the classpath and customizable cache period * *
   * Yoke yoke = new Yoke(...);
   * yoke.use(new Favicon("/icons/icon.ico", 1000));
   * 
* * @param maxAgeSeconds max allowed time to be cached in seconds */ public FaviconHandlerImpl(long maxAgeSeconds) { this(null, maxAgeSeconds); } /** * Create a new Favicon instance using a file in the file system and cache for 1 day. * *
   * Yoke yoke = new Yoke(...);
   * yoke.use(new Favicon("/icons/icon.ico"));
   * 
* * @param path file path to icon */ public FaviconHandlerImpl(String path) { this(path, DEFAULT_MAX_AGE_SECONDS); } /** * Create a new Favicon instance using a the default icon and cache for 1 day. * *
   * Yoke yoke = new Yoke(...);
   * yoke.use(new Favicon());
   * 
*/ public FaviconHandlerImpl() { this(null); } private void init(Vertx vertx) { try { if (path == null) { icon = new Icon(Utils.readResourceToBuffer("favicon.ico")); } else { icon = new Icon(vertx.fileSystem().readFileBlocking(path)); } } catch (Exception e) { throw new RuntimeException(e); } } @Override public void handle(RoutingContext ctx) { if (icon == null) { init(ctx.vertx()); } if ("/favicon.ico".equals(ctx.request().path())) { ctx.response().headers().addAll(icon.headers); ctx.response().end(icon.body); } else { ctx.next(); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy