forked from Cookies_Github_mirror/AquaDX
[F] Fix zlib compression happening after response commit
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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"))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user