summaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java')
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java27
1 files changed, 22 insertions, 5 deletions
diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java
index 0c498822ea9..5a90987ed32 100644
--- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java
+++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/ServletRequestReader.java
@@ -4,6 +4,8 @@ package com.yahoo.jdisc.http.server.jetty;
import com.yahoo.jdisc.Response;
import com.yahoo.jdisc.handler.CompletionHandler;
import com.yahoo.jdisc.handler.ContentChannel;
+import com.yahoo.jdisc.http.ConnectorConfig;
+import com.yahoo.text.Text;
import jakarta.servlet.ReadListener;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
@@ -105,14 +107,28 @@ class ServletRequestReader {
Janitor janitor,
RequestMetricReporter metricReporter) {
this.req = Objects.requireNonNull(req);
- long maxContentSize = RequestUtils.getConnector(req).connectorConfig().maxContentSize();
+ var cfg = RequestUtils.getConnector(req).connectorConfig();
+ long maxContentSize = resolveMaxContentSize(cfg);
+ var msgTemplate = resolveMaxContentSizeErrorMessage(cfg);
this.requestContentChannel = maxContentSize >= 0
- ? new ByteLimitedContentChannel(Objects.requireNonNull(requestContentChannel), maxContentSize)
+ ? new ByteLimitedContentChannel(Objects.requireNonNull(requestContentChannel), maxContentSize, msgTemplate)
: Objects.requireNonNull(requestContentChannel);
this.janitor = Objects.requireNonNull(janitor);
this.metricReporter = Objects.requireNonNull(metricReporter);
}
+ private static String resolveMaxContentSizeErrorMessage(ConnectorConfig cfg) {
+ return cfg.maxContentSizeErrorMessageTemplate().strip();
+ }
+
+ private static long resolveMaxContentSize(ConnectorConfig cfg) {
+ // Scale based on max heap size if 0
+ long maxContentSize = cfg.maxContentSize() != 0
+ ? cfg.maxContentSize() : Math.min(Runtime.getRuntime().maxMemory() / 2, Integer.MAX_VALUE);
+ log.fine(() -> Text.format("maxContentSize=%d", maxContentSize));
+ return maxContentSize;
+ }
+
/** Register read listener to start reading request data */
void start() {
try {
@@ -268,12 +284,14 @@ class ServletRequestReader {
private static class ByteLimitedContentChannel implements ContentChannel {
private final long maxContentSize;
+ private final String messageTemplate;
private final AtomicLong bytesWritten = new AtomicLong();
private final ContentChannel delegate;
- ByteLimitedContentChannel(ContentChannel delegate, long maxContentSize) {
+ ByteLimitedContentChannel(ContentChannel delegate, long maxContentSize, String messageTemplate) {
this.delegate = delegate;
this.maxContentSize = maxContentSize;
+ this.messageTemplate = messageTemplate;
}
@Override
@@ -281,8 +299,7 @@ class ServletRequestReader {
long written = bytesWritten.addAndGet(buf.remaining());
if (written > maxContentSize) {
handler.failed(new RequestException(
- Response.Status.REQUEST_TOO_LONG,
- "Request content length %d exceeds limit of %d bytes".formatted(written, maxContentSize)));
+ Response.Status.REQUEST_TOO_LONG, messageTemplate.formatted(written, maxContentSize)));
return;
}
delegate.write(buf, handler);