final HttpServletRequest servletReq = tile.servletReq;
final CacheResult cacheResult = tile.getCacheResult();
int httpCode = HttpServletResponse.SC_OK;
String mimeType = tile.getMimeType().getMimeType();
Resource blob = tile.getBlob();
servletResp.setHeader("geowebcache-cache-result", String.valueOf(cacheResult));
servletResp.setHeader("geowebcache-tile-index", Arrays.toString(tile.getTileIndex()));
long[] tileIndex = tile.getTileIndex();
TileLayer layer = tile.getLayer();
GridSubset gridSubset = layer.getGridSubset(tile.getGridSetId());
BoundingBox tileBounds = gridSubset.boundsFromIndex(tileIndex);
servletResp.setHeader("geowebcache-tile-bounds", tileBounds.toString());
servletResp.setHeader("geowebcache-gridset", gridSubset.getName());
servletResp.setHeader("geowebcache-crs", gridSubset.getSRS().toString());
final long tileTimeStamp = tile.getTSCreated();
final String ifModSinceHeader = servletReq.getHeader("If-Modified-Since");
// commons-httpclient's DateUtil can encode and decode timestamps formatted as per RFC-1123,
// which is one of the three formats allowed for Last-Modified and If-Modified-Since headers
// (e.g. 'Sun, 06 Nov 1994 08:49:37 GMT'). See
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
final String lastModified = org.apache.commons.httpclient.util.DateUtil
.formatDate(new Date(tileTimeStamp));
servletResp.setHeader("Last-Modified", lastModified);
final Date ifModifiedSince;
if (ifModSinceHeader != null && ifModSinceHeader.length() > 0) {
try {
ifModifiedSince = DateUtil.parseDate(ifModSinceHeader);
// the HTTP header has second precision
long ifModSinceSeconds = 1000 * (ifModifiedSince.getTime() / 1000);
long tileTimeStampSeconds = 1000 * (tileTimeStamp / 1000);
if (ifModSinceSeconds >= tileTimeStampSeconds) {
httpCode = HttpServletResponse.SC_NOT_MODIFIED;
blob = null;
}
} catch (DateParseException e) {
if (log.isDebugEnabled()) {
log.debug("Can't parse client's If-Modified-Since header: '" + ifModSinceHeader
+ "'");
}
}
}
if (httpCode == HttpServletResponse.SC_OK && tile.getLayer().useETags()) {
String ifNoneMatch = servletReq.getHeader("If-None-Match");
String hexTag = Long.toHexString(tileTimeStamp);
if (ifNoneMatch != null) {
if (ifNoneMatch.equals(hexTag)) {
httpCode = HttpServletResponse.SC_NOT_MODIFIED;
blob = null;
}
}
// If we get here, we want ETags but the client did not have the tile.
servletResp.setHeader("ETag", hexTag);
}
int contentLength = (int) (blob == null ? -1 : blob.getSize());
writeFixedResponse(servletResp, httpCode, mimeType, blob, cacheResult, contentLength);
}