| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. |
| // ------------------------------------------------------------------------ |
| // 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 org.eclipse.jetty.http; |
| |
| import java.util.Calendar; |
| import java.util.GregorianCalendar; |
| import java.util.TimeZone; |
| |
| import org.eclipse.jetty.util.StringUtil; |
| |
| /** |
| * ThreadLocal Date formatters for HTTP style dates. |
| */ |
| public class DateGenerator |
| { |
| private static final TimeZone __GMT = TimeZone.getTimeZone("GMT"); |
| static |
| { |
| __GMT.setID("GMT"); |
| } |
| |
| static final String[] DAYS = |
| { "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; |
| static final String[] MONTHS = |
| { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Jan"}; |
| |
| |
| private static final ThreadLocal<DateGenerator> __dateGenerator =new ThreadLocal<DateGenerator>() |
| { |
| @Override |
| protected DateGenerator initialValue() |
| { |
| return new DateGenerator(); |
| } |
| }; |
| |
| |
| public final static String __01Jan1970=DateGenerator.formatDate(0); |
| |
| /** |
| * Format HTTP date "EEE, dd MMM yyyy HH:mm:ss 'GMT'" |
| * @param date the date in milliseconds |
| * @return the formatted date |
| */ |
| public static String formatDate(long date) |
| { |
| return __dateGenerator.get().doFormatDate(date); |
| } |
| |
| /** |
| * Format "EEE, dd-MMM-yyyy HH:mm:ss 'GMT'" for cookies |
| * @param buf the buffer to put the formatted date into |
| * @param date the date in milliseconds |
| */ |
| public static void formatCookieDate(StringBuilder buf, long date) |
| { |
| __dateGenerator.get().doFormatCookieDate(buf,date); |
| } |
| |
| /** |
| * Format "EEE, dd-MMM-yyyy HH:mm:ss 'GMT'" for cookies |
| * @param date the date in milliseconds |
| * @return the formatted date |
| */ |
| public static String formatCookieDate(long date) |
| { |
| StringBuilder buf = new StringBuilder(28); |
| formatCookieDate(buf, date); |
| return buf.toString(); |
| } |
| |
| private final StringBuilder buf = new StringBuilder(32); |
| private final GregorianCalendar gc = new GregorianCalendar(__GMT); |
| |
| /** |
| * Format HTTP date "EEE, dd MMM yyyy HH:mm:ss 'GMT'" |
| * @param date the date in milliseconds |
| * @return the formatted date |
| */ |
| public String doFormatDate(long date) |
| { |
| buf.setLength(0); |
| gc.setTimeInMillis(date); |
| |
| int day_of_week = gc.get(Calendar.DAY_OF_WEEK); |
| int day_of_month = gc.get(Calendar.DAY_OF_MONTH); |
| int month = gc.get(Calendar.MONTH); |
| int year = gc.get(Calendar.YEAR); |
| int century = year / 100; |
| year = year % 100; |
| |
| int hours = gc.get(Calendar.HOUR_OF_DAY); |
| int minutes = gc.get(Calendar.MINUTE); |
| int seconds = gc.get(Calendar.SECOND); |
| |
| buf.append(DAYS[day_of_week]); |
| buf.append(','); |
| buf.append(' '); |
| StringUtil.append2digits(buf, day_of_month); |
| |
| buf.append(' '); |
| buf.append(MONTHS[month]); |
| buf.append(' '); |
| StringUtil.append2digits(buf, century); |
| StringUtil.append2digits(buf, year); |
| |
| buf.append(' '); |
| StringUtil.append2digits(buf, hours); |
| buf.append(':'); |
| StringUtil.append2digits(buf, minutes); |
| buf.append(':'); |
| StringUtil.append2digits(buf, seconds); |
| buf.append(" GMT"); |
| return buf.toString(); |
| } |
| |
| /** |
| * Format "EEE, dd-MMM-yy HH:mm:ss 'GMT'" for cookies |
| * @param buf the buffer to format the date into |
| * @param date the date in milliseconds |
| */ |
| public void doFormatCookieDate(StringBuilder buf, long date) |
| { |
| gc.setTimeInMillis(date); |
| |
| int day_of_week = gc.get(Calendar.DAY_OF_WEEK); |
| int day_of_month = gc.get(Calendar.DAY_OF_MONTH); |
| int month = gc.get(Calendar.MONTH); |
| int year = gc.get(Calendar.YEAR); |
| year = year % 10000; |
| |
| int epoch = (int) ((date / 1000) % (60 * 60 * 24)); |
| int seconds = epoch % 60; |
| epoch = epoch / 60; |
| int minutes = epoch % 60; |
| int hours = epoch / 60; |
| |
| buf.append(DAYS[day_of_week]); |
| buf.append(','); |
| buf.append(' '); |
| StringUtil.append2digits(buf, day_of_month); |
| |
| buf.append('-'); |
| buf.append(MONTHS[month]); |
| buf.append('-'); |
| StringUtil.append2digits(buf, year/100); |
| StringUtil.append2digits(buf, year%100); |
| |
| buf.append(' '); |
| StringUtil.append2digits(buf, hours); |
| buf.append(':'); |
| StringUtil.append2digits(buf, minutes); |
| buf.append(':'); |
| StringUtil.append2digits(buf, seconds); |
| buf.append(" GMT"); |
| } |
| } |