Skip to content

Commit

Permalink
fix bz #69316 with test case.
Browse files Browse the repository at this point in the history
check whether cached date and current date are in same second.
  • Loading branch information
Chenjp authored and markt-asf committed Sep 20, 2024
1 parent db91aa4 commit d1e2cb5
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 6 deletions.
12 changes: 6 additions & 6 deletions java/org/apache/tomcat/util/http/FastHttpDateFormat.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;


/**
Expand Down Expand Up @@ -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;
}
Expand Down
65 changes: 65 additions & 0 deletions test/org/apache/tomcat/util/http/TestFastHttpDateFormat.java
Original file line number Diff line number Diff line change
@@ -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));
}
}
11 changes: 11 additions & 0 deletions webapps/docs/changelog.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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 10.1.30 (schultz)" rtext="2024-09-17">
<subsection name="Coyote">
Expand Down

0 comments on commit d1e2cb5

Please sign in to comment.