You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Igor Vaynberg <ig...@gmail.com> on 2010/09/11 16:00:52 UTC

Re: svn commit: r996115 - /wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java

once again, why not Duration instead of long?

-igor

On Sat, Sep 11, 2010 at 3:32 AM,  <pe...@apache.org> wrote:
> Author: pete
> Date: Sat Sep 11 10:32:04 2010
> New Revision: 996115
>
> URL: http://svn.apache.org/viewvc?rev=996115&view=rev
> Log:
> helper method to utilize caching easier
>
> Modified:
>    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
>
> Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
> URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java?rev=996115&r1=996114&r2=996115&view=diff
> ==============================================================================
> --- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java (original)
> +++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java Sat Sep 11 10:32:04 2010
> @@ -28,6 +28,7 @@ import org.apache.wicket.request.UrlDeco
>  import org.apache.wicket.request.cycle.RequestCycle;
>  import org.apache.wicket.request.http.WebResponse;
>  import org.apache.wicket.request.mapper.parameter.PageParameters;
> +import org.apache.wicket.util.lang.Args;
>  import org.apache.wicket.util.string.Strings;
>
>  /**
> @@ -35,6 +36,8 @@ import org.apache.wicket.util.string.Str
>  */
>  public final class RequestUtils
>  {
> +       public static final long MAX_CACHE_DURATION = 60 * 60 * 24 * 365; // one year, maximum recommended cache duration
> +
>        /**
>         * Decode the provided queryString as a series of key/ value pairs and set them in the provided
>         * value map.
> @@ -260,9 +263,76 @@ public final class RequestUtils
>         */
>        public static void disableCaching(WebResponse response)
>        {
> +               Args.notNull(response, "response");
>                response.setDateHeader("Date", System.currentTimeMillis());
>                response.setDateHeader("Expires", 0);
>                response.setHeader("Pragma", "no-cache");
>                response.setHeader("Cache-Control", "no-cache");
>        }
> +
> +       /**
> +        * enable caching for the given response
> +        * <p/>
> +        * The [duration] is the maximum time in seconds until the response is invalidated from the cache. The
> +        * maximum duration should not exceed one year, based on
> +        * <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html">RFC-2616</a>.
> +        * <p/>
> +        * The [cachePublic] flag will let you control if the response may be cached
> +        * by public caches or just by the client itself. This sets the http response header
> +        *
> +        * <ul>
> +        * <li><code>[Cache-Control: public]</code> if <code>cachePublic = true</code></li>
> +        * <li><code>[Cache-Control: private]</code> if <code>cachePublic = false</code></li>
> +        * </ul>
> +        * <p/>
> +        * Details on <code>Cache-Control</code> header can be found
> +        *  <a href="http://palisade.plynt.com/issues/2008Jul/cache-control-attributes">here</a>
> +        * or in <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html">RFC-2616</a>.
> +        * <p/>
> +        * Choose <code>cachePublic = false</code> wisely since setting <code>Cache-Control: private</code>
> +        * may cause trouble with some versions of Firefox which will not cache SSL content at all. More details
> +        * on this Firefox issue can be found <a href="http://blog.pluron.com/2008/07/why-you-should.html">here</a>.
> +        * <p/>
> +        * Never set <code>cachePublic=true</code> when the response is confidential or client-specific. You
> +        * don't want to see your sensitive private data on some public proxy.
> +        * <p/>
> +        * Unless the response really is confidential / top-secret or client-specific the general advice is
> +        * to always prefer <code>cachePublic=true</code> for best network performance.
> +        *
> +        * @param response
> +        *            response that should be cacheable
> +        * @param duration
> +        *            duration in seconds that the response may be cached
> +        * @param cachePublic
> +        *            If <code>true</code> all caches are allowed to cache the response.
> +        *            If <code>false</code> only the client may cache the response (if at all).
> +        *
> +        * @see RequestUtils#MAX_CACHE_DURATION
> +        */
> +       public static void enableCaching(WebResponse response, long duration, boolean cachePublic)
> +       {
> +               Args.notNull(response, "response");
> +
> +               if(duration < 0)
> +                       throw new IllegalArgumentException("duration must be a positive value");
> +
> +               // Get current time
> +               long now = System.currentTimeMillis();
> +
> +               // Time of message generation
> +               response.setDateHeader("Date", now);
> +
> +               // Time for cache expiry = now + duration
> +               response.setDateHeader("Expires", now + (duration * 1000L));
> +
> +               // Set caching scope
> +               String scope = cachePublic ? "public" : "private";
> +
> +               // Enable caching and set max age
> +               response.setHeader("Cache-Control", scope + ", max-age=" + duration);
> +
> +               // Let caches distinguish between compressed and uncompressed
> +               // versions of the resource so they can serve them properly
> +               response.setHeader("Vary", "Accept-Encoding");
> +       }
>  }
>
>
>