This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 11.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/11.0.x by this push: new 08cbb69919 fix bz #69316 with test case. 08cbb69919 is described below commit 08cbb69919bbea8b4245ba1e1d07d046585e14c5 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 ++++++++++++++++++++++ webapps/docs/changelog.xml | 11 ++++ 3 files changed, 82 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)); + } +} diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 5718f5898d..2f12a45e50 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -140,6 +140,17 @@ </fix> </changelog> </subsection> + <subsection name="Coyote"> + <changelog> + <fix> + <bug>69316</bug>: Ensure that + <code>FastHttpDateFormat#getCurrentDate()</code> (used to generate Date + headers for HTTP responses) generates the correct string for the given + input. Prior to this change, the output may have wrong by one second in + some cases. Pull request <pr>751</pr> provided by Chenjp. (markt) + </fix> + </changelog> + </subsection> </section> <section name="Tomcat 11.0.0-M26 (markt)" rtext="release in progress"> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org