[F] Fix zlib compression happening after response commit

This commit is contained in:
Azalea
2024-03-28 00:58:55 -04:00
parent 3f01152a4a
commit c6190146aa
9 changed files with 64 additions and 200 deletions

View File

@@ -1,50 +0,0 @@
package icu.samnyan.aqua.sega.general.filter;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.WriteListener;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
public class CompressResponseWrapper extends HttpServletResponseWrapper {
private final ByteArrayOutputStream output;
private ServletOutputStream filterOutput;
public CompressResponseWrapper(HttpServletResponse response) {
super(response);
output = new ByteArrayOutputStream();
}
@Override
public ServletOutputStream getOutputStream() {
if (filterOutput == null) {
filterOutput = new ServletOutputStream() {
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
@Override
public void write(int b) {
output.write(b);
}
};
}
return filterOutput;
}
public byte[] toByteArray() {
return output.toByteArray();
}
}

View File

@@ -1,13 +1,16 @@
package icu.samnyan.aqua.sega.general.filter
import ext.logger
import icu.samnyan.aqua.sega.util.Compression
import icu.samnyan.aqua.sega.util.ZLib
import jakarta.servlet.FilterChain
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.eclipse.jetty.io.EofException
import org.springframework.stereotype.Component
import org.springframework.web.filter.OncePerRequestFilter
import org.springframework.web.util.ContentCachingResponseWrapper
import java.util.*
/**
* @author samnyan (privateamusement@protonmail.com)
@@ -16,27 +19,37 @@ import org.springframework.web.filter.OncePerRequestFilter
class CompressionFilter : OncePerRequestFilter() {
companion object {
val logger = logger()
val b64d = Base64.getMimeDecoder()
val b64e = Base64.getMimeEncoder()
}
override fun doFilterInternal(req: HttpServletRequest, resp: HttpServletResponse, chain: FilterChain) {
val isDeflate = req.getHeader("content-encoding") == "deflate"
val isDfi = req.getHeader("pragma") == "DFI"
// Decode input
val reqSrc = req.inputStream.readAllBytes().let {
if (req.getHeader("content-encoding") == "deflate") Compression.decompress(it)
if (isDeflate) ZLib.decompress(it)
else if (isDfi) ZLib.decompress(b64d.decode(it))
else it
}
val requestWrapper = CompressRequestWrapper(req, reqSrc)
val responseWrapper = CompressResponseWrapper(resp)
chain.doFilter(requestWrapper, responseWrapper)
val result = Compression.compress(responseWrapper.toByteArray())
// Handle request
val result = ContentCachingResponseWrapper(resp).run {
chain.doFilter(CompressRequestWrapper(req, reqSrc), this)
ZLib.compress(contentAsByteArray).let { if (isDfi) b64e.encode(it) else it }
}
// Write response
resp.setContentLength(result.size)
resp.contentType = "application/json; charset=utf-8"
resp.addHeader("Content-Encoding", "deflate")
if (isDfi) resp.setHeader("pragma", "DFI")
if (isDeflate) {
resp.contentType = "application/json; charset=utf-8"
resp.setHeader("content-encoding", "deflate")
}
try {
resp.outputStream.write(result)
resp.outputStream.use { it.write(result); it.flush() }
} catch (e: EofException) {
logger.warn("- EOF: Client closed connection when writing result")
}
@@ -46,6 +59,5 @@ class CompressionFilter : OncePerRequestFilter() {
* Filter games that are not diva
*/
override fun shouldNotFilter(req: HttpServletRequest) =
!(req.servletPath.startsWith("/g/") && !req.servletPath.startsWith("/g/diva")
&& !req.servletPath.startsWith("/g/wacca"))
!(req.servletPath.startsWith("/g/") && !req.servletPath.startsWith("/g/wacca"))
}