mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-03-10 05:39:19 +01:00
Fix gzip support for Jetty
This commit is contained in:
parent
019a3353ca
commit
6f6b4f149f
@ -66,6 +66,11 @@ public class ResponseBuilder {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected ResponseBuilder removeHeader(String header) {
|
||||||
|
response.headers.remove(header);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility method for building redirects.
|
* Utility method for building redirects.
|
||||||
*
|
*
|
||||||
@ -103,7 +108,8 @@ public class ResponseBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return setContent(content.getBytes(charset));
|
return setContent(content.getBytes(charset))
|
||||||
|
.removeHeader("Accept-Ranges"); // Can compress
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -16,13 +16,16 @@
|
|||||||
*/
|
*/
|
||||||
package com.djrapitops.plan.delivery.webserver.http;
|
package com.djrapitops.plan.delivery.webserver.http;
|
||||||
|
|
||||||
|
import com.djrapitops.plan.delivery.web.resolver.MimeType;
|
||||||
import com.djrapitops.plan.delivery.web.resolver.Response;
|
import com.djrapitops.plan.delivery.web.resolver.Response;
|
||||||
import com.djrapitops.plan.delivery.webserver.Addresses;
|
import com.djrapitops.plan.delivery.webserver.Addresses;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.eclipse.jetty.http.HttpHeader;
|
import org.eclipse.jetty.http.HttpHeader;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -43,16 +46,23 @@ public class JettyResponseSender {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void send() throws IOException {
|
public void send() throws IOException {
|
||||||
setResponseHeaders();
|
|
||||||
if ("HEAD".equals(servletRequest.getMethod()) || response.getCode() == 204) {
|
if ("HEAD".equals(servletRequest.getMethod()) || response.getCode() == 204) {
|
||||||
|
setResponseHeaders();
|
||||||
sendHeadResponse();
|
sendHeadResponse();
|
||||||
} else if ("bytes".equalsIgnoreCase(response.getHeaders().get(HttpHeader.ACCEPT_RANGES.asString()))) {
|
} else if (canGzip()) {
|
||||||
sendRawBytes();
|
|
||||||
} else {
|
|
||||||
sendCompressed();
|
sendCompressed();
|
||||||
|
} else {
|
||||||
|
setResponseHeaders();
|
||||||
|
sendRawBytes();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean canGzip() {
|
||||||
|
String method = servletRequest.getMethod();
|
||||||
|
String mimeType = response.getHeaders().get(HttpHeader.CONTENT_TYPE.asString());
|
||||||
|
return "GET".equals(method) && StringUtils.containsAny(mimeType, MimeType.HTML, MimeType.CSS, MimeType.JS, MimeType.JSON, "text/plain");
|
||||||
|
}
|
||||||
|
|
||||||
public void sendHeadResponse() throws IOException {
|
public void sendHeadResponse() throws IOException {
|
||||||
try {
|
try {
|
||||||
response.getHeaders().remove(HttpHeader.CONTENT_LENGTH.asString());
|
response.getHeaders().remove(HttpHeader.CONTENT_LENGTH.asString());
|
||||||
@ -72,22 +82,40 @@ public class JettyResponseSender {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void correctRedirect(Map<String, String> responseHeaders) {
|
private void correctRedirect(Map<String, String> responseHeaders) {
|
||||||
String redirect = responseHeaders.get("Location");
|
String redirect = responseHeaders.get(HttpHeader.LOCATION.asString());
|
||||||
if (redirect != null) {
|
if (redirect != null) {
|
||||||
if (redirect.startsWith("http") || !redirect.startsWith("/")) return;
|
if (redirect.startsWith("http") || !redirect.startsWith("/")) return;
|
||||||
addresses.getAccessAddress().ifPresent(address -> responseHeaders.put("Location", address + redirect));
|
addresses.getAccessAddress().ifPresent(address -> responseHeaders.put(HttpHeader.LOCATION.asString(), address + redirect));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendCompressed() throws IOException {
|
private void sendCompressed() throws IOException {
|
||||||
servletResponse.setHeader(HttpHeader.CONTENT_ENCODING.asString(), "gzip");
|
response.getHeaders().remove(HttpHeader.ACCEPT_RANGES.asString());
|
||||||
beginSend();
|
response.getHeaders().put(HttpHeader.CONTENT_ENCODING.asString(), "gzip");
|
||||||
try (OutputStream out = new GZIPOutputStream(servletResponse.getOutputStream())) {
|
|
||||||
send(out);
|
byte[] gzipped = gzip();
|
||||||
|
try (OutputStream out = servletResponse.getOutputStream()) {
|
||||||
|
response.getHeaders().put(HttpHeader.CONTENT_LENGTH.asString(), String.valueOf(gzipped.length));
|
||||||
|
setResponseHeaders();
|
||||||
|
|
||||||
|
servletResponse.setStatus(response.getCode());
|
||||||
|
|
||||||
|
send(out, gzipped);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void beginSend() throws IOException {
|
private byte[] gzip() throws IOException {
|
||||||
|
try (ByteArrayOutputStream bufferStream = new ByteArrayOutputStream();
|
||||||
|
GZIPOutputStream gzipStream = new GZIPOutputStream(bufferStream)
|
||||||
|
) {
|
||||||
|
gzipStream.write(response.getBytes());
|
||||||
|
gzipStream.finish();
|
||||||
|
gzipStream.flush();
|
||||||
|
return bufferStream.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void beginSend() {
|
||||||
String length = response.getHeaders().get(HttpHeader.CONTENT_LENGTH.asString());
|
String length = response.getHeaders().get(HttpHeader.CONTENT_LENGTH.asString());
|
||||||
if (length == null || "0".equals(length) || response.getCode() == 204 || "HEAD".equals(servletRequest.getMethod())) {
|
if (length == null || "0".equals(length) || response.getCode() == 204 || "HEAD".equals(servletRequest.getMethod())) {
|
||||||
servletResponse.setHeader(HttpHeader.CONTENT_LENGTH.asString(), null);
|
servletResponse.setHeader(HttpHeader.CONTENT_LENGTH.asString(), null);
|
||||||
@ -105,8 +133,12 @@ public class JettyResponseSender {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void send(OutputStream out) throws IOException {
|
private void send(OutputStream out) throws IOException {
|
||||||
|
send(out, response.getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void send(OutputStream out, byte[] bytes) throws IOException {
|
||||||
try (
|
try (
|
||||||
ByteArrayInputStream bis = new ByteArrayInputStream(response.getBytes())
|
ByteArrayInputStream bis = new ByteArrayInputStream(bytes)
|
||||||
) {
|
) {
|
||||||
byte[] buffer = new byte[2048];
|
byte[] buffer = new byte[2048];
|
||||||
int count;
|
int count;
|
||||||
|
Loading…
Reference in New Issue
Block a user