Compare commits
3 commits
master
...
fix-4xx-ca
Author | SHA1 | Date | |
---|---|---|---|
80402f3c52 | |||
0caa1f00a6 | |||
3558b5ad50 |
|
@ -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.isImageMimetype().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.isImageMimetype() = 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.isImageMimetype()) {
|
||||||
|
LOGGER.trace { "Upstream query for $sanitizedUri returned bad mimetype $contentType" }
|
||||||
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
|
||||||
|
|
Loading…
Reference in a new issue