This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push: new dcbbfe5d29 fix bz #69316 with test case. dcbbfe5d29 is described below commit dcbbfe5d29a92fd1a7ffca0a179c9d9df7b4651c Author: Chenjp <ch...@msn.com> AuthorDate: Wed Sep 11 16:48:43 2024 +0800 fix bz #69316 with test case. check whether cached date and current date are in same second. --- .../tomcat/util/http/FastHttpDateFormat.java | 12 ++-- .../tomcat/util/http/TestFastHttpDateFormat.java | 65 ++++++++++++++++++++++ 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/java/org/apache/tomcat/util/http/FastHttpDateFormat.java b/java/org/apache/tomcat/util/http/FastHttpDateFormat.java index f48913bad8..80e6e572e3 100644 --- a/java/org/apache/tomcat/util/http/FastHttpDateFormat.java +++ b/java/org/apache/tomcat/util/http/FastHttpDateFormat.java @@ -64,7 +64,7 @@ public final class FastHttpDateFormat { /** * Instant on which the currentDate object was generated. */ - private static volatile long currentDateGenerated = 0L; + private static volatile long currentDateGeneratedInSeconds = 0L; /** @@ -94,11 +94,11 @@ public final class FastHttpDateFormat { * @return the HTTP date */ public static String getCurrentDate() { - long now = System.currentTimeMillis(); - // Handle case where time moves backwards (e.g. system time corrected) - if (Math.abs(now - currentDateGenerated) > 1000) { - currentDate = FORMAT_RFC5322.format(new Date(now)); - currentDateGenerated = now; + // according rfc5322, date/time data is accurate to the second. + long nowInSeconds = System.currentTimeMillis() / 1000L; + if (nowInSeconds != currentDateGeneratedInSeconds) { + currentDate = FORMAT_RFC5322.format(new Date(nowInSeconds * 1000L)); + currentDateGeneratedInSeconds = nowInSeconds; } return currentDate; } diff --git a/test/org/apache/tomcat/util/http/TestFastHttpDateFormat.java b/test/org/apache/tomcat/util/http/TestFastHttpDateFormat.java new file mode 100644 index 0000000000..fca12e21b6 --- /dev/null +++ b/test/org/apache/tomcat/util/http/TestFastHttpDateFormat.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomcat.util.http; + +import org.junit.Assert; +import org.junit.Test; + +public class TestFastHttpDateFormat { + + @Test + public void testGetCurrentDateInSameSecond() { + long now = System.currentTimeMillis(); + try { + Thread.sleep(1000L - now % 1000); + } catch (InterruptedException e) { + // Ignore + } + now = System.currentTimeMillis(); + String s1 = FastHttpDateFormat.getCurrentDate(); + long lastMillisInSameSecond = now - now % 1000 + 900L; + try { + Thread.sleep(lastMillisInSameSecond - now); + } catch (InterruptedException e) { + // Ignore + } + String s2 = FastHttpDateFormat.getCurrentDate(); + Assert.assertEquals("Two same RFC5322 format dates are expected.", s1, s2); + } + + @Test + public void testGetCurrentDateNextToAnotherSecond() { + long now = System.currentTimeMillis(); + + try { + Thread.sleep(2000L - now % 1000 + 500L); + } catch (InterruptedException e) { + // Ignore + } + now = System.currentTimeMillis(); + String s1 = FastHttpDateFormat.getCurrentDate(); + long firstMillisOfNextSecond = now - now % 1000 + 1100L; + try { + Thread.sleep(firstMillisOfNextSecond - now); + } catch (InterruptedException e) { + // Ignore + } + + String s2 = FastHttpDateFormat.getCurrentDate(); + Assert.assertFalse("Two different RFC5322 format dates are expected.", s1.equals(s2)); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org