Add a status check for 404 in the skin download.

Should not load from the cache if the skin was deleted.
This commit is contained in:
Matthew Messinger 2016-12-30 00:06:39 -05:00
parent e016f420a7
commit a194aed282

View file

@ -11,6 +11,7 @@ import org.apache.commons.io.FileUtils;
import org.apache.http.Header; import org.apache.http.Header;
import org.apache.http.HttpHeaders; import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse; import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient; import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClientBuilder;
@ -27,14 +28,17 @@ import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public class ThreadDownloadImageETag extends SimpleTexture { public class ThreadDownloadImageETag extends SimpleTexture {
private static final Logger LOGGER = LogManager.getLogger(); private static final Logger LOGGER = LogManager.getLogger();
private static final AtomicInteger THREAD_ID = new AtomicInteger(0); private static final AtomicInteger THREAD_ID = new AtomicInteger(0);
@Nonnull @Nonnull
private final File cacheFile; private final File cacheFile;
private final File eTagFile; private final File eTagFile;
private final String imageUrl; private final String imageUrl;
@Nullable @Nullable
private final IImageBuffer imageBuffer; private final IImageBuffer imageBuffer;
@Nullable @Nullable
private BufferedImage bufferedImage; private BufferedImage bufferedImage;
@Nullable @Nullable
@ -67,7 +71,7 @@ public class ThreadDownloadImageETag extends SimpleTexture {
return super.getGlTextureId(); return super.getGlTextureId();
} }
private void setBufferedImage(BufferedImage bufferedImageIn) { private void setBufferedImage(@Nonnull BufferedImage bufferedImageIn) {
this.bufferedImage = bufferedImageIn; this.bufferedImage = bufferedImageIn;
if (this.imageBuffer != null) { if (this.imageBuffer != null) {
@ -86,54 +90,53 @@ public class ThreadDownloadImageETag extends SimpleTexture {
} }
if (this.imageThread == null) { if (this.imageThread == null) {
loadTexture(); this.imageThread = new Thread(this::loadTexture, "Texture Downloader #" + THREAD_ID.incrementAndGet());
this.imageThread.setDaemon(true);
this.imageThread.start();
} }
} }
private void loadTexture() { private void loadTexture() {
this.imageThread = new Thread("Texture Downloader #" + THREAD_ID.incrementAndGet()) { HttpResponse response = null;
@Override try {
public void run() { HttpClient client = HttpClientBuilder.create().build();
HttpResponse response = null; response = client.execute(new HttpGet(imageUrl));
int status = response.getStatusLine().getStatusCode();
if (status == HttpStatus.SC_NOT_FOUND)
return;
if (checkEtag(response)) {
LOGGER.debug("Loading http texture from local cache ({})", cacheFile);
try { try {
HttpClient client = HttpClientBuilder.create().build(); bufferedImage = ImageIO.read(cacheFile);
response = client.execute(new HttpGet(ThreadDownloadImageETag.this.imageUrl));
if (checkEtag(response)) {
LOGGER.debug("Loading http texture from local cache ({})", cacheFile);
try { if (imageBuffer != null) {
bufferedImage = ImageIO.read(cacheFile); setBufferedImage(imageBuffer.parseUserSkin(bufferedImage));
if (imageBuffer != null) {
setBufferedImage(imageBuffer.parseUserSkin(bufferedImage));
}
} catch (IOException ioexception) {
LOGGER.error("Couldn't load skin {}", cacheFile, ioexception);
loadTextureFromServer(response);
}
} else {
loadTextureFromServer(response);
} }
} catch (IOException e) { } catch (IOException ioexception) {
LOGGER.error("Couldn't load skin {} ", imageUrl, e); LOGGER.error("Couldn't load skin {}", cacheFile, ioexception);
} finally { loadTextureFromServer(response);
if (response != null)
EntityUtils.consumeQuietly(response.getEntity());
} }
} else {
loadTextureFromServer(response);
} }
};
this.imageThread.setDaemon(true);
this.imageThread.start();
} catch (IOException e) {
LOGGER.error("Couldn't load skin {} ", imageUrl, e);
} finally {
if (response != null)
EntityUtils.consumeQuietly(response.getEntity());
}
} }
private boolean checkEtag(HttpResponse response) { private boolean checkEtag(HttpResponse response) {
try { try {
if (cacheFile.isFile()) { if (cacheFile.isFile()) {
String localEtag = Files.readFirstLine(eTagFile, Charsets.UTF_8); String localETag = Files.readFirstLine(eTagFile, Charsets.UTF_8);
Header remoteEtag = response.getFirstHeader(HttpHeaders.ETAG); Header remoteETag = response.getFirstHeader(HttpHeaders.ETAG);
// true if no remote etag or does match // true if no remote etag or does match
return remoteEtag == null || localEtag.equals(remoteEtag.getValue()); return remoteETag == null || localETag.equals(remoteETag.getValue());
} }
return false; return false;
} catch (IOException e) { } catch (IOException e) {
@ -142,7 +145,7 @@ public class ThreadDownloadImageETag extends SimpleTexture {
} }
} }
protected void loadTextureFromServer(HttpResponse response) { private void loadTextureFromServer(HttpResponse response) {
LOGGER.debug("Downloading http texture from {} to {}", imageUrl, cacheFile); LOGGER.debug("Downloading http texture from {} to {}", imageUrl, cacheFile);
try { try {
@ -153,9 +156,9 @@ public class ThreadDownloadImageETag extends SimpleTexture {
FileUtils.copyInputStreamToFile(response.getEntity().getContent(), cacheFile); FileUtils.copyInputStreamToFile(response.getEntity().getContent(), cacheFile);
bufferedimage = ImageIO.read(cacheFile); bufferedimage = ImageIO.read(cacheFile);
Header etag = response.getFirstHeader(HttpHeaders.ETAG); Header eTag = response.getFirstHeader(HttpHeaders.ETAG);
if (etag != null) { if (eTag != null) {
FileUtils.write(eTagFile, etag.getValue(), Charsets.UTF_8); FileUtils.write(eTagFile, eTag.getValue(), Charsets.UTF_8);
} }
if (imageBuffer != null) { if (imageBuffer != null) {
bufferedimage = imageBuffer.parseUserSkin(bufferedimage); bufferedimage = imageBuffer.parseUserSkin(bufferedimage);