Fixes caching HTML from 404s

This commit is contained in:
AviKav 2020-07-14 03:50:42 -04:00
parent bba979c212
commit 3558b5ad50
No known key found for this signature in database
GPG key ID: 7BC4B96BC8A7167D

View file

@ -133,13 +133,25 @@ class ImageServer(
} }
val imageId = printHexString(rc4Bytes) val imageId = printHexString(rc4Bytes)
val snapshot = cache.getUnsafe(imageId.toCacheId()) // These shouldn't be var but I don't want to touch the original conditional logic
val imageDatum = synchronized(database) { var snapshot = cache.getUnsafe(imageId.toCacheId())
var imageDatum = synchronized(database) {
transaction(database) { transaction(database) {
ImageDatum.findById(imageId) ImageDatum.findById(imageId)
} }
} }
// TODO: Cleanup messy conditionals
// Ensure that cached file isn't a non-image from the Great Cache Propagation
val flaresFault = imageDatum != null && imageDatum.contentType.isImage().not()
if (flaresFault) {
snapshot?.close(); snapshot = null
cache.removeUnsafe(imageId.toCacheId()); imageDatum = null
LOGGER.warn { "Removing cache file for $sanitizedUri left over the Great Cache Propagation" }
}
if (snapshot != null && imageDatum != null) { if (snapshot != null && imageDatum != null) {
request.handleCacheHit(sanitizedUri, getRc4(rc4Bytes), snapshot, imageDatum) request.handleCacheHit(sanitizedUri, getRc4(rc4Bytes), snapshot, imageDatum)
} else { } else {
@ -169,6 +181,8 @@ class ImageServer(
} }
} }
private fun String.isImage() = this.toLowerCase().startsWith("image/")
private fun Request.handleCacheHit(sanitizedUri: String, cipher: Cipher, snapshot: DiskLruCache.Snapshot, imageDatum: ImageDatum): Response { private fun Request.handleCacheHit(sanitizedUri: String, cipher: Cipher, snapshot: DiskLruCache.Snapshot, imageDatum: ImageDatum): Response {
// our files never change, so it's safe to use the browser cache // our files never change, so it's safe to use the browser cache
return if (this.header("If-Modified-Since") != null) { return if (this.header("If-Modified-Since") != null) {
@ -207,19 +221,26 @@ class ImageServer(
val mdResponse = client(Request(Method.GET, "${serverSettings.imageServer}$sanitizedUri")) val mdResponse = client(Request(Method.GET, "${serverSettings.imageServer}$sanitizedUri"))
val contentType = mdResponse.header("Content-Type")
val contentLength = mdResponse.header("Content-Length")
val lastModified = mdResponse.header("Last-Modified")
if (mdResponse.status != Status.OK) { if (mdResponse.status != Status.OK) {
LOGGER.trace { "Upstream query for $sanitizedUri errored with status ${mdResponse.status}" } LOGGER.trace { "Upstream query for $sanitizedUri errored with status ${mdResponse.status}" }
mdResponse.close()
return Response(mdResponse.status)
}
contentType!!
if (!contentType.isImage()) {
LOGGER.trace { "Upstream query for $sanitizedUri returned bad mime-type" }
mdResponse.close() mdResponse.close()
return Response(mdResponse.status) return Response(mdResponse.status)
} }
LOGGER.trace { "Upstream query for $sanitizedUri succeeded" } LOGGER.trace { "Upstream query for $sanitizedUri succeeded" }
val contentType = mdResponse.header("Content-Type")!!
val contentLength = mdResponse.header("Content-Length")
val lastModified = mdResponse.header("Last-Modified")
val editor = cache.editUnsafe(imageId.toCacheId()) val editor = cache.editUnsafe(imageId.toCacheId())
// A null editor means that this file is being written to // A null editor means that this file is being written to