mirror of
https://github.com/webbukkit/dynmap.git
synced 2025-02-26 00:31:44 +01:00
Improve ETag caching support for image tiles
This commit is contained in:
parent
b24f92cdd0
commit
505e6b3b90
@ -28,6 +28,7 @@ public class MapStorageResourceHandler extends AbstractHandler {
|
|||||||
|
|
||||||
private DynmapCore core;
|
private DynmapCore core;
|
||||||
private byte[] blankpng;
|
private byte[] blankpng;
|
||||||
|
private long blankpnghash = 0x12345678;
|
||||||
|
|
||||||
public MapStorageResourceHandler() {
|
public MapStorageResourceHandler() {
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
@ -91,8 +92,23 @@ public class MapStorageResourceHandler extends AbstractHandler {
|
|||||||
tr = tile.read();
|
tr = tile.read();
|
||||||
tile.releaseReadLock();
|
tile.releaseReadLock();
|
||||||
}
|
}
|
||||||
|
response.setHeader("Cache-Control", "max-age=0,must-revalidate");
|
||||||
|
String etag;
|
||||||
|
if (tr == null) {
|
||||||
|
etag = "\"" + blankpnghash + "\"";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
etag = "\"" + tr.hashCode + "\"";
|
||||||
|
}
|
||||||
|
response.setHeader("ETag", etag);
|
||||||
|
String ifnullmatch = request.getHeader("If-None-Match");
|
||||||
|
if ((ifnullmatch != null) && ifnullmatch.equals(etag)) {
|
||||||
|
response.sendError(HttpStatus.NOT_MODIFIED_304);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (tr == null) {
|
if (tr == null) {
|
||||||
response.setContentType("image/png");
|
response.setContentType("image/png");
|
||||||
|
response.setIntHeader("Content-Length", blankpng.length);
|
||||||
OutputStream os = response.getOutputStream();
|
OutputStream os = response.getOutputStream();
|
||||||
os.write(blankpng);
|
os.write(blankpng);
|
||||||
return;
|
return;
|
||||||
@ -100,7 +116,6 @@ public class MapStorageResourceHandler extends AbstractHandler {
|
|||||||
// Got tile, package up for response
|
// Got tile, package up for response
|
||||||
response.setDateHeader("Last-Modified", tr.lastModified);
|
response.setDateHeader("Last-Modified", tr.lastModified);
|
||||||
response.setIntHeader("Content-Length", tr.image.length());
|
response.setIntHeader("Content-Length", tr.image.length());
|
||||||
response.setHeader("ETag", "\"" + tr.hashCode + "\"");
|
|
||||||
if (tr.format == ImageEncoding.PNG) {
|
if (tr.format == ImageEncoding.PNG) {
|
||||||
response.setContentType("image/png");
|
response.setContentType("image/png");
|
||||||
}
|
}
|
||||||
|
@ -740,20 +740,27 @@ DynMap.prototype = {
|
|||||||
|
|
||||||
if(tile == null) {
|
if(tile == null) {
|
||||||
var url = me.options.url.tiles;
|
var url = me.options.url.tiles;
|
||||||
if(url.indexOf('?') > 0)
|
tile = this.registeredTiles[tileName] = url + escape(me.world.name + '/' + tileName);
|
||||||
tile = this.registeredTiles[tileName] = url + escape(me.world.name + '/' + tileName) + '&ts=' + me.inittime;
|
|
||||||
else
|
|
||||||
tile = this.registeredTiles[tileName] = url + me.world.name + '/' + tileName + '?' + me.inittime;
|
|
||||||
}
|
}
|
||||||
return tile;
|
return tile;
|
||||||
},
|
},
|
||||||
onTileUpdated: function(tileName,timestamp) {
|
onTileUpdated: function(tileName,timestamp) {
|
||||||
var me = this;
|
var me = this;
|
||||||
|
var prev = this.registeredTiles[tileName];
|
||||||
|
var a_b = true;
|
||||||
|
if (prev && (prev.indexOf('upd=0') > 0))
|
||||||
|
a_b = false;
|
||||||
var url = me.options.url.tiles;
|
var url = me.options.url.tiles;
|
||||||
if(url.indexOf('?') > 0)
|
if (a_b) {
|
||||||
this.registeredTiles[tileName] = url + escape(me.world.name + '/' + tileName) + '&ts=' + timestamp;
|
if (url.indexOf('?') > 0) {
|
||||||
|
this.registeredTiles[tileName] = url + escape(me.world.name + '/' + tileName) + '&upd=0';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.registeredTiles[tileName] = url + escape(me.world.name + '/' + tileName) + '?upd=0';
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
this.registeredTiles[tileName] = url + me.world.name + '/' + tileName + '?' + timestamp;
|
this.registeredTiles[tileName] = url + me.world.name + '/' + tileName;
|
||||||
me.maptype.updateNamedTile(tileName);
|
me.maptype.updateNamedTile(tileName);
|
||||||
},
|
},
|
||||||
addPlayer: function(update) {
|
addPlayer: function(update) {
|
||||||
|
Loading…
Reference in New Issue
Block a user