HttpObjectDecoder configurable initial buffer size
Motivation: The initial buffer size used to decode HTTP objects is currently fixed at 128. This may be too small for some use cases and create a high amount of overhead associated with resizing/copying. The user should be able to configure the initial size as they please. Modifications: - Make HttpObjectDecoder's AppendableCharSequence initial size configurable Result: Users can more finely tune initial buffer size for increased performance or to save memory. Fixes https://github.com/netty/netty/issues/4807
This commit is contained in:
parent
f59392d9f5
commit
a15ff32608
@ -88,6 +88,17 @@ public final class HttpClientCodec extends CombinedChannelDuplexHandler<HttpResp
|
|||||||
this.failOnMissingResponse = failOnMissingResponse;
|
this.failOnMissingResponse = failOnMissingResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance with the specified decoder options.
|
||||||
|
*/
|
||||||
|
public HttpClientCodec(
|
||||||
|
int maxInitialLineLength, int maxHeaderSize, int maxChunkSize, boolean failOnMissingResponse,
|
||||||
|
boolean validateHeaders, int initialBufferSize) {
|
||||||
|
init(new Decoder(maxInitialLineLength, maxHeaderSize, maxChunkSize, validateHeaders, initialBufferSize),
|
||||||
|
new Encoder());
|
||||||
|
this.failOnMissingResponse = failOnMissingResponse;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepares to upgrade to another protocol from HTTP. Disables the {@link Encoder}.
|
* Prepares to upgrade to another protocol from HTTP. Disables the {@link Encoder}.
|
||||||
*/
|
*/
|
||||||
@ -148,6 +159,11 @@ public final class HttpClientCodec extends CombinedChannelDuplexHandler<HttpResp
|
|||||||
super(maxInitialLineLength, maxHeaderSize, maxChunkSize, validateHeaders);
|
super(maxInitialLineLength, maxHeaderSize, maxChunkSize, validateHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Decoder(int maxInitialLineLength, int maxHeaderSize, int maxChunkSize, boolean validateHeaders,
|
||||||
|
int initialBufferSize) {
|
||||||
|
super(maxInitialLineLength, maxHeaderSize, maxChunkSize, validateHeaders, initialBufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void decode(
|
protected void decode(
|
||||||
ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {
|
ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception {
|
||||||
|
@ -162,7 +162,12 @@ public abstract class HttpObjectDecoder extends ByteToMessageDecoder {
|
|||||||
protected HttpObjectDecoder(
|
protected HttpObjectDecoder(
|
||||||
int maxInitialLineLength, int maxHeaderSize, int maxChunkSize,
|
int maxInitialLineLength, int maxHeaderSize, int maxChunkSize,
|
||||||
boolean chunkedSupported, boolean validateHeaders) {
|
boolean chunkedSupported, boolean validateHeaders) {
|
||||||
|
this(maxInitialLineLength, maxHeaderSize, maxChunkSize, chunkedSupported, validateHeaders, 128);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HttpObjectDecoder(
|
||||||
|
int maxInitialLineLength, int maxHeaderSize, int maxChunkSize,
|
||||||
|
boolean chunkedSupported, boolean validateHeaders, int initialBufferSize) {
|
||||||
if (maxInitialLineLength <= 0) {
|
if (maxInitialLineLength <= 0) {
|
||||||
throw new IllegalArgumentException(
|
throw new IllegalArgumentException(
|
||||||
"maxInitialLineLength must be a positive integer: " +
|
"maxInitialLineLength must be a positive integer: " +
|
||||||
@ -178,12 +183,12 @@ public abstract class HttpObjectDecoder extends ByteToMessageDecoder {
|
|||||||
"maxChunkSize must be a positive integer: " +
|
"maxChunkSize must be a positive integer: " +
|
||||||
maxChunkSize);
|
maxChunkSize);
|
||||||
}
|
}
|
||||||
|
AppendableCharSequence seq = new AppendableCharSequence(initialBufferSize);
|
||||||
|
lineParser = new LineParser(seq, maxInitialLineLength);
|
||||||
|
headerParser = new HeaderParser(seq, maxHeaderSize);
|
||||||
this.maxChunkSize = maxChunkSize;
|
this.maxChunkSize = maxChunkSize;
|
||||||
this.chunkedSupported = chunkedSupported;
|
this.chunkedSupported = chunkedSupported;
|
||||||
this.validateHeaders = validateHeaders;
|
this.validateHeaders = validateHeaders;
|
||||||
AppendableCharSequence seq = new AppendableCharSequence(128);
|
|
||||||
lineParser = new LineParser(seq, maxInitialLineLength);
|
|
||||||
headerParser = new HeaderParser(seq, maxHeaderSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -75,6 +75,12 @@ public class HttpRequestDecoder extends HttpObjectDecoder {
|
|||||||
super(maxInitialLineLength, maxHeaderSize, maxChunkSize, true, validateHeaders);
|
super(maxInitialLineLength, maxHeaderSize, maxChunkSize, true, validateHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HttpRequestDecoder(
|
||||||
|
int maxInitialLineLength, int maxHeaderSize, int maxChunkSize, boolean validateHeaders,
|
||||||
|
int initialBufferSize) {
|
||||||
|
super(maxInitialLineLength, maxHeaderSize, maxChunkSize, true, validateHeaders, initialBufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected HttpMessage createMessage(String[] initialLine) throws Exception {
|
protected HttpMessage createMessage(String[] initialLine) throws Exception {
|
||||||
return new DefaultHttpRequest(
|
return new DefaultHttpRequest(
|
||||||
|
@ -106,6 +106,12 @@ public class HttpResponseDecoder extends HttpObjectDecoder {
|
|||||||
super(maxInitialLineLength, maxHeaderSize, maxChunkSize, true, validateHeaders);
|
super(maxInitialLineLength, maxHeaderSize, maxChunkSize, true, validateHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public HttpResponseDecoder(
|
||||||
|
int maxInitialLineLength, int maxHeaderSize, int maxChunkSize, boolean validateHeaders,
|
||||||
|
int initialBufferSize) {
|
||||||
|
super(maxInitialLineLength, maxHeaderSize, maxChunkSize, true, validateHeaders, initialBufferSize);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected HttpMessage createMessage(String[] initialLine) {
|
protected HttpMessage createMessage(String[] initialLine) {
|
||||||
return new DefaultHttpResponse(
|
return new DefaultHttpResponse(
|
||||||
|
@ -51,6 +51,16 @@ public final class HttpServerCodec extends CombinedChannelDuplexHandler<HttpRequ
|
|||||||
new HttpResponseEncoder());
|
new HttpResponseEncoder());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance with the specified decoder options.
|
||||||
|
*/
|
||||||
|
public HttpServerCodec(int maxInitialLineLength, int maxHeaderSize, int maxChunkSize, boolean validateHeaders,
|
||||||
|
int initialBufferSize) {
|
||||||
|
super(
|
||||||
|
new HttpRequestDecoder(maxInitialLineLength, maxHeaderSize, maxChunkSize, validateHeaders, initialBufferSize),
|
||||||
|
new HttpResponseEncoder());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Upgrades to another protocol from HTTP. Removes the {@link HttpRequestDecoder} and
|
* Upgrades to another protocol from HTTP. Removes the {@link HttpRequestDecoder} and
|
||||||
* {@link HttpResponseEncoder} from the pipeline.
|
* {@link HttpResponseEncoder} from the pipeline.
|
||||||
|
Loading…
Reference in New Issue
Block a user