Skip to content

Commit 042e2a3

Browse files
committed
Fixes #12436 - Allow headers size extend to maxRequestHeadersSize in http client.
Reworked contribution by @shaoxt in light of the work done in #12351. Signed-off-by: Simone Bordet <[email protected]>
1 parent 294f33b commit 042e2a3

File tree

8 files changed

+77
-245
lines changed

8 files changed

+77
-245
lines changed

jetty-core/jetty-client/src/main/java/org/eclipse/jetty/client/HttpClient.java

+19
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ public class HttpClient extends ContainerLifeCycle implements AutoCloseable
135135
private String defaultRequestContentType = "application/octet-stream";
136136
private boolean useInputDirectByteBuffers = true;
137137
private boolean useOutputDirectByteBuffers = true;
138+
private int maxRequestHeadersSize = 8192;
138139
private int maxResponseHeadersSize = -1;
139140
private Sweeper destinationSweeper;
140141

@@ -1071,6 +1072,24 @@ public void setUseInputDirectByteBuffers(boolean useInputDirectByteBuffers)
10711072
this.useInputDirectByteBuffers = useInputDirectByteBuffers;
10721073
}
10731074

1075+
/**
1076+
* @return the max size in bytes of the request headers
1077+
*/
1078+
@ManagedAttribute("The max size in bytes of the request headers")
1079+
public int getMaxRequestHeadersSize()
1080+
{
1081+
return maxRequestHeadersSize;
1082+
}
1083+
1084+
/**
1085+
* Set the max size in bytes of the request headers.
1086+
* @param maxRequestHeadersSize the max size in bytes of the request headers
1087+
*/
1088+
public void setMaxRequestHeadersSize(int maxRequestHeadersSize)
1089+
{
1090+
this.maxRequestHeadersSize = maxRequestHeadersSize;
1091+
}
1092+
10741093
/**
10751094
* @return whether to use direct ByteBuffers for writing
10761095
*/

jetty-core/jetty-client/src/main/java/org/eclipse/jetty/client/transport/HttpClientTransportOverHTTP.java

-16
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ public class HttpClientTransportOverHTTP extends AbstractConnectorHttpClientTran
3939
private int headerCacheSize = 1024;
4040
private boolean headerCacheCaseSensitive;
4141

42-
private int maxRequestHeadersSize = 32 * 1024;
43-
4442
public HttpClientTransportOverHTTP()
4543
{
4644
this(1);
@@ -129,18 +127,4 @@ public void setInitializeConnections(boolean initialize)
129127
{
130128
factory.setInitializeConnections(initialize);
131129
}
132-
133-
/**
134-
* @return The maximum allowed size in bytes for the HTTP request headers
135-
*/
136-
@ManagedAttribute("The maximum allowed size in bytes for the HTTP request headers")
137-
public int getMaxRequestHeadersSize()
138-
{
139-
return maxRequestHeadersSize;
140-
}
141-
142-
public void setMaxRequestHeadersSize(int maxRequestHeadersSize)
143-
{
144-
this.maxRequestHeadersSize = maxRequestHeadersSize;
145-
}
146130
}

jetty-core/jetty-client/src/main/java/org/eclipse/jetty/client/transport/internal/HttpSenderOverHTTP.java

+10-20
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
import java.nio.ByteBuffer;
1717

1818
import org.eclipse.jetty.client.HttpClient;
19-
import org.eclipse.jetty.client.HttpClientTransport;
2019
import org.eclipse.jetty.client.HttpRequestException;
21-
import org.eclipse.jetty.client.transport.HttpClientTransportOverHTTP;
2220
import org.eclipse.jetty.client.transport.HttpExchange;
2321
import org.eclipse.jetty.client.transport.HttpRequest;
2422
import org.eclipse.jetty.client.transport.HttpSender;
@@ -52,6 +50,7 @@ public class HttpSenderOverHTTP extends HttpSender
5250
public HttpSenderOverHTTP(HttpChannelOverHTTP channel)
5351
{
5452
super(channel);
53+
generator.setMaxHeaderBytes(channel.getHttpDestination().getHttpClient().getMaxRequestHeadersSize());
5554
}
5655

5756
@Override
@@ -160,6 +159,7 @@ protected Action process() throws Exception
160159
HttpClient httpClient = getHttpChannel().getHttpDestination().getHttpClient();
161160
HttpExchange exchange = getHttpExchange();
162161
ByteBufferPool bufferPool = httpClient.getByteBufferPool();
162+
int requestHeadersSize = httpClient.getRequestBufferSize();
163163
boolean useDirectByteBuffers = httpClient.isUseOutputDirectByteBuffers();
164164
while (true)
165165
{
@@ -176,33 +176,23 @@ protected Action process() throws Exception
176176
{
177177
case NEED_HEADER:
178178
{
179-
headerBuffer = bufferPool.acquire(httpClient.getRequestBufferSize(), useDirectByteBuffers);
179+
headerBuffer = bufferPool.acquire(requestHeadersSize, useDirectByteBuffers);
180180
break;
181181
}
182182
case HEADER_OVERFLOW:
183183
{
184-
int maxRequestHeadersSize = -1;
185-
//For HTTP1.1 only
186-
HttpClientTransport transport = httpClient.getTransport();
187-
if (transport instanceof HttpClientTransportOverHTTP httpTransport)
184+
int maxRequestHeadersSize = httpClient.getMaxRequestHeadersSize();
185+
if (maxRequestHeadersSize > requestHeadersSize)
188186
{
189-
maxRequestHeadersSize = httpTransport.getMaxRequestHeadersSize();
190-
}
191-
if (headerBuffer.capacity() < maxRequestHeadersSize)
192-
{
193-
RetainableByteBuffer newHeaderBuffer = bufferPool.acquire(maxRequestHeadersSize, useDirectByteBuffers);
194-
headerBuffer.getByteBuffer().flip();
195-
newHeaderBuffer.getByteBuffer().put(headerBuffer.getByteBuffer());
196-
RetainableByteBuffer toRelease = headerBuffer;
197-
headerBuffer = newHeaderBuffer;
198-
toRelease.release();
187+
generator.reset();
188+
headerBuffer.release();
189+
headerBuffer = bufferPool.acquire(maxRequestHeadersSize, useDirectByteBuffers);
190+
requestHeadersSize = maxRequestHeadersSize;
199191
break;
200192
}
201193
else
202194
{
203-
headerBuffer.release();
204-
headerBuffer = null;
205-
throw new IllegalArgumentException("Request header too large");
195+
throw new IllegalArgumentException("Request headers too large");
206196
}
207197
}
208198
case NEED_CHUNK:

0 commit comments

Comments
 (0)