From 83b02de9c5fa27cd6bd3f0a34b0091e87f23499a Mon Sep 17 00:00:00 2001 From: Dmitry Kaukov Date: Tue, 16 Apr 2024 09:55:05 +1000 Subject: [PATCH 1/3] Customizable error page buffer size --- .../org/eclipse/jetty/server/handler/ErrorHandler.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java index ee0432b31166..522cad09b830 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java @@ -196,8 +196,7 @@ else if (charsets.contains(StandardCharsets.ISO_8859_1)) return false; } - int bufferSize = request.getConnectionMetaData().getHttpConfiguration().getOutputBufferSize(); - bufferSize = Math.min(8192, bufferSize); // TODO ? + int bufferSize = getBufferSize(request); RetainableByteBuffer buffer = request.getComponents().getByteBufferPool().acquire(bufferSize, false); try @@ -262,6 +261,13 @@ else if (charsets.contains(StandardCharsets.ISO_8859_1)) } } + protected int getBufferSize(Request request) + { + int bufferSize = request.getConnectionMetaData().getHttpConfiguration().getOutputBufferSize(); + bufferSize = Math.min(8192, bufferSize); // TODO ? + return bufferSize; + } + protected void writeErrorHtml(Request request, Writer writer, Charset charset, int code, String message, Throwable cause, boolean showStacks) throws IOException { if (message == null) From 852b5b160691bbf84183e91e0520749c0d1cfe6d Mon Sep 17 00:00:00 2001 From: Dmitry Kaukov Date: Thu, 23 May 2024 13:47:54 +1000 Subject: [PATCH 2/3] PR feedback --- .../jetty/server/handler/ErrorHandler.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java index 522cad09b830..e9ce6c136d04 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java @@ -73,6 +73,7 @@ public class ErrorHandler implements Request.Handler boolean _showStacks = false; boolean _showCauses = false; boolean _showMessageInTitle = true; + int _bufferSize = -1; String _defaultResponseMimeType = Type.TEXT_HTML.asString(); HttpField _cacheControl = new PreEncodedHttpField(HttpHeader.CACHE_CONTROL, "must-revalidate,no-cache,no-store"); @@ -196,7 +197,7 @@ else if (charsets.contains(StandardCharsets.ISO_8859_1)) return false; } - int bufferSize = getBufferSize(request); + int bufferSize = getBufferSize() <= 0 ? computeBufferSize(request) : getBufferSize(); RetainableByteBuffer buffer = request.getComponents().getByteBufferPool().acquire(bufferSize, false); try @@ -261,10 +262,10 @@ else if (charsets.contains(StandardCharsets.ISO_8859_1)) } } - protected int getBufferSize(Request request) + protected int computeBufferSize(Request request) { int bufferSize = request.getConnectionMetaData().getHttpConfiguration().getOutputBufferSize(); - bufferSize = Math.min(8192, bufferSize); // TODO ? + bufferSize = Math.min(8192, bufferSize); return bufferSize; } @@ -532,6 +533,25 @@ public static Request.Handler getErrorHandler(Server server, ContextHandler cont return errorHandler; } + /** + * @return Buffer size for entire error response. If error page is bigger than buffer size, it will be truncated. + * With a -1 meaning that a heuristic will be used (e.g. min(8K, httpConfig.bufferSize)) + */ + @ManagedAttribute("Buffer size for entire error response") + public int getBufferSize() + { + return _bufferSize; + } + + /** + * @param bufferSize Buffer size for entire error response. If error page is bigger than buffer size, it will be truncated. + * With a -1 meaning that a heuristic will be used (e.g. min(8K, httpConfig.bufferSize)) + */ + public void setBufferSize(int bufferSize) + { + this._bufferSize = bufferSize; + } + public static class ErrorRequest extends Request.AttributesWrapper { private static final Set ATTRIBUTES = Set.of(ERROR_MESSAGE, ERROR_EXCEPTION, ERROR_STATUS); From 008ae3c4a8528adc651616dcd6b235b748d7d00d Mon Sep 17 00:00:00 2001 From: Greg Wilkins Date: Thu, 29 Aug 2024 18:15:58 +1000 Subject: [PATCH 3/3] Update ErrorHandler.java --- .../java/org/eclipse/jetty/server/handler/ErrorHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java index 7351bd1e89cd..bb2ea6b6a935 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ErrorHandler.java @@ -200,7 +200,8 @@ else if (charsets.contains(StandardCharsets.ISO_8859_1)) } int bufferSize = getBufferSize() <= 0 ? computeBufferSize(request) : getBufferSize(); - RetainableByteBuffer buffer = request.getComponents().getByteBufferPool().acquire(bufferSize, false); + ByteBufferPool byteBufferPool = request.getComponents().getByteBufferPool(); + RetainableByteBuffer buffer = byteBufferPool.acquire(bufferSize, false); try {