diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index 9671ac8b..69c97184 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -6,6 +6,8 @@ import io.ktor.client.engine.cio.* import io.ktor.client.plugins.contentnegotiation.* import io.ktor.serialization.kotlinx.json.* import jakarta.persistence.Query +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.apache.tika.Tika @@ -44,6 +46,19 @@ typealias JavaSerializable = java.io.Serializable typealias JDict = Map typealias MutJDict = MutableMap +fun HttpServletRequest.details() = mapOf( + "method" to method, + "uri" to requestURI, + "query" to queryString, + "remote" to remoteAddr, + "headers" to headerNames.asSequence().associateWith { getHeader(it) } +) + +fun HttpServletResponse.details() = mapOf( + "status" to status, + "headers" to headerNames.asSequence().associateWith { getHeader(it) }, +) + @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.PROPERTY_GETTER) @Retention(AnnotationRetention.RUNTIME) annotation class Doc( diff --git a/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt b/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt index 4bae4d60..b71967e8 100644 --- a/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt +++ b/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.kt @@ -1,6 +1,8 @@ package icu.samnyan.aqua.sega.general.filter +import ext.details import ext.logger +import ext.toJson import icu.samnyan.aqua.sega.util.ZLib import jakarta.servlet.FilterChain import jakarta.servlet.http.HttpServletRequest @@ -35,9 +37,21 @@ class CompressionFilter : OncePerRequestFilter() { } // Handle request - val result = ContentCachingResponseWrapper(resp).run { - chain.doFilter(CompressRequestWrapper(req, reqSrc), this) - ZLib.compress(contentAsByteArray).let { if (isDfi) b64e.encode(it) else it } + val respW = ContentCachingResponseWrapper(resp) + val result = try { + chain.doFilter(CompressRequestWrapper(req, reqSrc), respW) + ZLib.compress(respW.contentAsByteArray).let { if (isDfi) b64e.encode(it) else it } + } finally { + if (respW.status != 200) { + val details = mapOf( + "req" to req.details(), + "resp" to respW.details(), + "body" to reqSrc.toString(Charsets.UTF_8), + "result" to respW.contentAsByteArray.toString(Charsets.UTF_8) + ).toJson() + + log.error("HTTP ${respW.status}: $details") + } } // Write response