You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2013/04/02 16:05:12 UTC
svn commit: r1463551 - in
/httpcomponents/httpclient/trunk/httpclient-cache/src:
main/java/org/apache/http/client/cache/
main/java/org/apache/http/impl/client/cache/
test/java/org/apache/http/client/cache/
test/java/org/apache/http/impl/client/cache/
Author: olegk
Date: Tue Apr 2 14:05:12 2013
New Revision: 1463551
URL: http://svn.apache.org/r1463551
Log:
HTTPCLIENT-1213: Avoid parsing HttpCacheEntry date attribute multiple times.
Contributed by Sam Perman <sam at permans.com>
Modified:
httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java
httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheValidityPolicy.java
httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java
httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheValidityPolicy.java
Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java?rev=1463551&r1=1463550&r2=1463551&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/client/cache/HttpCacheEntry.java Tue Apr 2 14:05:12 2013
@@ -37,7 +37,10 @@ import org.apache.http.HttpResponse;
import org.apache.http.ProtocolVersion;
import org.apache.http.StatusLine;
import org.apache.http.annotation.Immutable;
+import org.apache.http.impl.cookie.DateParseException;
+import org.apache.http.impl.cookie.DateUtils;
import org.apache.http.message.HeaderGroup;
+import org.apache.http.protocol.HTTP;
import org.apache.http.util.Args;
/**
@@ -60,6 +63,7 @@ public class HttpCacheEntry implements S
private final HeaderGroup responseHeaders;
private final Resource resource;
private final Map<String,String> variantMap;
+ private final Date date;
/**
* Create a new {@link HttpCacheEntry} with variants.
@@ -100,6 +104,7 @@ public class HttpCacheEntry implements S
this.variantMap = variantMap != null
? new HashMap<String,String>(variantMap)
: null;
+ this.date = parseDate();
}
/**
@@ -124,6 +129,22 @@ public class HttpCacheEntry implements S
}
/**
+ * Find the "Date" response header and parse it into a java.util.Date
+ * @return the Date value of the header or null if the header is not present
+ */
+ private Date parseDate() {
+ final Header dateHdr = getFirstHeader(HTTP.DATE_HEADER);
+ if (dateHdr == null)
+ return null;
+ try {
+ return DateUtils.parseDate(dateHdr.getValue());
+ } catch (final DateParseException dpe) {
+ // ignore malformed date
+ }
+ return null;
+ }
+
+ /**
* Returns the {@link StatusLine} from the origin {@link HttpResponse}.
*/
public StatusLine getStatusLine() {
@@ -193,6 +214,16 @@ public class HttpCacheEntry implements S
}
/**
+ * Gets the Date value of the "Date" header or null if the header is missing or cannot be
+ * parsed.
+ *
+ * @since 4.3
+ */
+ public Date getDate() {
+ return date;
+ }
+
+ /**
* Returns the {@link Resource} containing the origin response body.
*/
public Resource getResource() {
@@ -231,4 +262,5 @@ public class HttpCacheEntry implements S
return "[request date=" + this.requestDate + "; response date=" + this.responseDate
+ "; statusLine=" + this.statusLine + "]";
}
+
}
Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheValidityPolicy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheValidityPolicy.java?rev=1463551&r1=1463550&r2=1463551&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheValidityPolicy.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheValidityPolicy.java Tue Apr 2 14:05:12 2013
@@ -60,7 +60,7 @@ class CacheValidityPolicy {
return maxage;
}
- final Date dateValue = getDateValue(entry);
+ final Date dateValue = entry.getDate();
if (dateValue == null) {
return 0L;
}
@@ -97,7 +97,7 @@ class CacheValidityPolicy {
public long getHeuristicFreshnessLifetimeSecs(final HttpCacheEntry entry,
final float coefficient, final long defaultLifetime) {
- final Date dateValue = getDateValue(entry);
+ final Date dateValue = entry.getDate();
final Date lastModifiedValue = getLastModifiedValue(entry);
if (dateValue != null && lastModifiedValue != null) {
@@ -172,17 +172,14 @@ class CacheValidityPolicy {
return result;
}
+ /**
+ * @deprecated (4.3) use {@link HttpCacheEntry#getDate()}.
+ * @param entry
+ * @return
+ */
+ @Deprecated
protected Date getDateValue(final HttpCacheEntry entry) {
- final Header dateHdr = entry.getFirstHeader(HTTP.DATE_HEADER);
- if (dateHdr == null) {
- return null;
- }
- try {
- return DateUtils.parseDate(dateHdr.getValue());
- } catch (final DateParseException dpe) {
- // ignore malformed date
- }
- return null;
+ return entry.getDate();
}
protected Date getLastModifiedValue(final HttpCacheEntry entry) {
@@ -227,7 +224,7 @@ class CacheValidityPolicy {
}
protected long getApparentAgeSecs(final HttpCacheEntry entry) {
- final Date dateValue = getDateValue(entry);
+ final Date dateValue = entry.getDate();
if (dateValue == null) {
return MAX_AGE;
}
Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java?rev=1463551&r1=1463550&r2=1463551&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/client/cache/TestHttpCacheEntry.java Tue Apr 2 14:05:12 2013
@@ -30,6 +30,7 @@ import static org.easymock.classextensio
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -304,4 +305,34 @@ public class TestHttpCacheEntry {
assertNotNull(entry.toString());
assertFalse("".equals(entry.toString()));
}
+
+ @Test
+ public void testMissingDateHeaderIsIgnored() {
+ final Header[] headers = new Header[] {};
+ entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
+ headers, mockResource);
+ assertNull(entry.getDate());
+ }
+
+ @Test
+ public void testMalformedDateHeaderIsIgnored() {
+ final Header[] headers = new Header[] { new BasicHeader("Date", "asdf") };
+ entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
+ headers, mockResource);
+ assertNull(entry.getDate());
+ }
+
+ @Test
+ public void testValidDateHeaderIsParsed() {
+ final long now = System.currentTimeMillis();
+ // round down to nearest second to make comparison easier
+ final Date date = new Date(now - (now % 1000L));
+ final Header[] headers = new Header[] { new BasicHeader("Date", DateUtils.formatDate(date)) };
+ entry = new HttpCacheEntry(new Date(), new Date(), statusLine,
+ headers, mockResource);
+ final Date dateHeaderValue = entry.getDate();
+ assertNotNull(dateHeaderValue);
+ assertEquals(date.getTime(), dateHeaderValue.getTime());
+ }
+
}
Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheValidityPolicy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheValidityPolicy.java?rev=1463551&r1=1463550&r2=1463551&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheValidityPolicy.java (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheValidityPolicy.java Tue Apr 2 14:05:12 2013
@@ -356,13 +356,6 @@ public class TestCacheValidityPolicy {
}
@Test
- public void testMalformedDateHeaderIsIgnored() {
- final Header[] headers = new Header[] { new BasicHeader("Date", "asdf") };
- final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(headers);
- assertNull(impl.getDateValue(entry));
- }
-
- @Test
public void testMalformedContentLengthReturnsNegativeOne() {
final Header[] headers = new Header[] { new BasicHeader("Content-Length", "asdf") };
final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(headers);