Jetty HTTP Client - setMaxRequestHeadersSize resulting in java.lang.OutOfMemoryError (original) (raw)

Jetty version(s)

12.1.5

HTTP version

I believe this trace implies HTTP/1.1?

at org.eclipse.jetty.client.transport.internal.HttpChannelOverHTTP.send(HttpChannelOverHTTP.java:86)

Java version/vendor (use: java -version)

21

OS type/version

Linux

Description

I am seeing this exception when attempting to establish a WebSocket connnection.

2147483647 looks like Integer max?

Caused by: org.eclipse.jetty.websocket.api.exceptions.UpgradeException: org.eclipse.jetty.websocket.core.exception.UpgradeException: java.lang.OutOfMemoryError: Cannot reserve 2147483647 bytes of direct buffer memory (allocated: 1146600, limit: 1801453568)
    at org.eclipse.jetty.websocket.common.JettyWebSocketFrameHandler.convertCause(JettyWebSocketFrameHandler.java:443)
    at org.eclipse.jetty.websocket.client.WebSocketClient.lambda$connect$0(WebSocketClient.java:205)
    at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(Unknown Source)
    at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(Unknown Source)
    at java.base/java.util.concurrent.CompletableFuture.postComplete(Unknown Source)
    at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(Unknown Source)
    at org.eclipse.jetty.websocket.core.client.CoreClientUpgradeRequest.handleException(CoreClientUpgradeRequest.java:300)
    at org.eclipse.jetty.websocket.core.client.CoreClientUpgradeRequest.onComplete(CoreClientUpgradeRequest.java:294)
    at org.eclipse.jetty.client.transport.ResponseListeners.notifyComplete(ResponseListeners.java:354)
    at org.eclipse.jetty.client.transport.ResponseListeners.notifyComplete(ResponseListeners.java:346)
    at org.eclipse.jetty.client.transport.HttpReceiver.terminateResponse(HttpReceiver.java:454)
    at org.eclipse.jetty.client.transport.HttpReceiver.terminateResponse(HttpReceiver.java:436)
    at org.eclipse.jetty.client.transport.HttpReceiver.lambda$abort$0(HttpReceiver.java:534)
    at org.eclipse.jetty.util.thread.SerializedInvoker$Link.run(SerializedInvoker.java:274)
    at org.eclipse.jetty.util.thread.SerializedInvoker.run(SerializedInvoker.java:174)
    at org.eclipse.jetty.client.transport.HttpReceiver.abort(HttpReceiver.java:508)
    at org.eclipse.jetty.client.transport.HttpChannel.abortResponse(HttpChannel.java:174)
    at org.eclipse.jetty.client.transport.HttpSender.terminateRequest(HttpSender.java:270)
    at org.eclipse.jetty.client.transport.HttpSender.abortRequest(HttpSender.java:252)
    at org.eclipse.jetty.client.transport.HttpSender.internalAbort(HttpSender.java:401)
    at org.eclipse.jetty.client.transport.HttpSender$ContentSender.onFailure(HttpSender.java:633)
    at org.eclipse.jetty.util.ExceptionUtil.callAndThen(ExceptionUtil.java:452)
    at org.eclipse.jetty.util.IteratingCallback.doOnFailureOnCompleted(IteratingCallback.java:286)
    at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:503)
    at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:354)
    at org.eclipse.jetty.client.transport.HttpSender.send(HttpSender.java:86)
    at org.eclipse.jetty.client.transport.internal.HttpChannelOverHTTP.send(HttpChannelOverHTTP.java:86)
    at org.eclipse.jetty.client.transport.HttpChannel.send(HttpChannel.java:143)

How to reproduce?

I'm not fully sure yet, but I will update the issue as I gather more information...

My configuration looks like this, with no changes to the default buffer sizes.

    config.setMaxFrameSize(32 * 1024);  // 32 KiB
    config.setAutoFragment(true);
    config.setMaxBinaryMessageSize(Long.MAX_VALUE);
    config.setMaxTextMessageSize(Long.MAX_VALUE);

Updated:

Appears to be caused by my attempt to disable request header size restrictions

httpClient.setMaxRequestHeadersSize(Integer.MAX_VALUE);