forked from pool/netty3
229 lines
9.6 KiB
Diff
229 lines
9.6 KiB
Diff
--- a/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostMultipartRequestDecoder.java 2016-06-29 14:41:47.000000000 +0200
|
|
+++ b/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostMultipartRequestDecoder.java 2024-07-04 12:42:30.682137342 +0200
|
|
@@ -53,6 +53,16 @@
|
|
private final HttpRequest request;
|
|
|
|
/**
|
|
+ * The maximum number of fields allows by the form
|
|
+ */
|
|
+ private final int maxFields;
|
|
+
|
|
+ /**
|
|
+ * The maximum number of accumulated bytes when decoding a field
|
|
+ */
|
|
+ private final int maxBufferedBytes;
|
|
+
|
|
+ /**
|
|
* Default charset to use
|
|
*/
|
|
private Charset charset;
|
|
@@ -147,6 +157,23 @@
|
|
*/
|
|
public HttpPostMultipartRequestDecoder(HttpDataFactory factory, HttpRequest request,
|
|
Charset charset) throws ErrorDataDecoderException {
|
|
+ this(factory, request, charset, HttpPostRequestDecoder.DEFAULT_MAX_FIELDS, HttpPostRequestDecoder.DEFAULT_MAX_BUFFERED_BYTES);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ *
|
|
+ * @param factory the factory used to create InterfaceHttpData
|
|
+ * @param request the request to decode
|
|
+ * @param charset the charset to use as default
|
|
+ * @param maxFields
|
|
+ * the maximum number of fields the form can have, {@code -1} to disable
|
|
+ * @param maxBufferedBytes
|
|
+ * the maximum number of bytes the decoder can buffer when decoding a field, {@code -1} to disable
|
|
+ * @throws NullPointerException for request or charset or factory
|
|
+ * @throws ErrorDataDecoderException if the default charset was wrong when decoding or other errors
|
|
+ */
|
|
+ public HttpPostMultipartRequestDecoder(HttpDataFactory factory, HttpRequest request,
|
|
+ Charset charset, int maxFields, int maxBufferedBytes) throws ErrorDataDecoderException {
|
|
if (factory == null) {
|
|
throw new NullPointerException("factory");
|
|
}
|
|
@@ -159,6 +186,8 @@
|
|
this.request = request;
|
|
this.charset = charset;
|
|
this.factory = factory;
|
|
+ this.maxFields = maxFields;
|
|
+ this.maxBufferedBytes = maxBufferedBytes;
|
|
// Fill default values
|
|
setMultipart(this.request.headers().get(HttpHeaders.Names.CONTENT_TYPE));
|
|
if (!this.request.isChunked()) {
|
|
@@ -230,6 +259,9 @@
|
|
isLastChunk = true;
|
|
}
|
|
parseBody();
|
|
+ if (maxBufferedBytes > 0 && undecodedChunk != null && undecodedChunk.readableBytes() > maxBufferedBytes) {
|
|
+ throw new ErrorDataDecoderException();
|
|
+ }
|
|
}
|
|
|
|
public boolean hasNext() throws EndOfDataDecoderException {
|
|
@@ -268,10 +300,13 @@
|
|
/**
|
|
* Utility function to add a new decoded data
|
|
*/
|
|
- private void addHttpData(InterfaceHttpData data) {
|
|
+ private void addHttpData(InterfaceHttpData data) throws ErrorDataDecoderException {
|
|
if (data == null) {
|
|
return;
|
|
}
|
|
+ if (maxFields > 0 && bodyListHttpData.size() >= maxFields) {
|
|
+ throw new ErrorDataDecoderException();
|
|
+ }
|
|
List<InterfaceHttpData> datas = bodyMapHttpData.get(data.getName());
|
|
if (datas == null) {
|
|
datas = new ArrayList<InterfaceHttpData>(1);
|
|
--- a/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostRequestDecoder.java 2016-06-29 14:41:47.000000000 +0200
|
|
+++ b/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostRequestDecoder.java 2024-07-04 12:27:23.372964684 +0200
|
|
@@ -28,6 +28,11 @@
|
|
* This decoder will decode Body and can handle POST BODY (both multipart and standard).
|
|
*/
|
|
public class HttpPostRequestDecoder implements InterfaceHttpPostRequestDecoder {
|
|
+
|
|
+ static final int DEFAULT_MAX_FIELDS = 128;
|
|
+
|
|
+ static final int DEFAULT_MAX_BUFFERED_BYTES = 1024;
|
|
+
|
|
/**
|
|
* Does this request is a Multipart request
|
|
*/
|
|
@@ -58,6 +63,25 @@
|
|
|
|
/**
|
|
*
|
|
+ * @param request
|
|
+ * the request to decode
|
|
+ * @param maxFields
|
|
+ * the maximum number of fields the form can have, {@code -1} to disable
|
|
+ * @param maxBufferedBytes
|
|
+ * the maximum number of bytes the decoder can buffer when decoding a field, {@code -1} to disable
|
|
+ * @throws NullPointerException
|
|
+ * for request
|
|
+ * @throws ErrorDataDecoderException
|
|
+ * if the default charset was wrong when decoding or other
|
|
+ * errors
|
|
+ */
|
|
+ public HttpPostRequestDecoder(HttpRequest request, int maxFields, int maxBufferedBytes) throws ErrorDataDecoderException {
|
|
+ this(new DefaultHttpDataFactory(DefaultHttpDataFactory.MINSIZE), request, HttpConstants.DEFAULT_CHARSET,
|
|
+ maxFields, maxBufferedBytes);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ *
|
|
* @param factory the factory used to create InterfaceHttpData
|
|
* @param request the request to decode
|
|
* @param charset the charset to use as default
|
|
@@ -66,6 +90,23 @@
|
|
*/
|
|
public HttpPostRequestDecoder(HttpDataFactory factory, HttpRequest request,
|
|
Charset charset) throws ErrorDataDecoderException {
|
|
+ this(factory, request, charset, HttpPostRequestDecoder.DEFAULT_MAX_FIELDS,
|
|
+ HttpPostRequestDecoder.DEFAULT_MAX_BUFFERED_BYTES);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ *
|
|
+ * @param factory the factory used to create InterfaceHttpData
|
|
+ * @param request the request to decode
|
|
+ * @param charset the charset to use as default
|
|
+ * @param maxFields the maximum number of fields the form can have, {@code -1} to disable
|
|
+ * @param maxBufferedBytes
|
|
+ * the maximum number of bytes the decoder can buffer when decoding a field, {@code -1} to disable
|
|
+ * @throws NullPointerException for request or charset or factory
|
|
+ * @throws ErrorDataDecoderException if the default charset was wrong when decoding or other errors
|
|
+ */
|
|
+ public HttpPostRequestDecoder(HttpDataFactory factory, HttpRequest request, Charset charset,
|
|
+ int maxFields, int maxBufferedBytes) throws ErrorDataDecoderException {
|
|
if (factory == null) {
|
|
throw new NullPointerException("factory");
|
|
}
|
|
@@ -77,9 +118,9 @@
|
|
}
|
|
// Fill default values
|
|
if (isMultipart(request)) {
|
|
- decoder = new HttpPostMultipartRequestDecoder(factory, request, charset);
|
|
+ decoder = new HttpPostMultipartRequestDecoder(factory, request, charset, maxFields, maxBufferedBytes);
|
|
} else {
|
|
- decoder = new HttpPostStandardRequestDecoder(factory, request, charset);
|
|
+ decoder = new HttpPostStandardRequestDecoder(factory, request, charset, maxFields, maxBufferedBytes);
|
|
}
|
|
}
|
|
|
|
--- a/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostStandardRequestDecoder.java 2016-06-29 14:41:47.000000000 +0200
|
|
+++ b/src/main/java/org/jboss/netty/handler/codec/http/multipart/HttpPostStandardRequestDecoder.java 2024-07-04 12:39:27.134939191 +0200
|
|
@@ -57,6 +57,16 @@
|
|
private final Charset charset;
|
|
|
|
/**
|
|
+ * The maximum number of fields allows by the form
|
|
+ */
|
|
+ private final int maxFields;
|
|
+
|
|
+ /**
|
|
+ * The maximum number of accumulated bytes when decoding a field
|
|
+ */
|
|
+ private final int maxBufferedBytes;
|
|
+
|
|
+ /**
|
|
* Does the last chunk already received
|
|
*/
|
|
private boolean isLastChunk;
|
|
@@ -125,6 +135,21 @@
|
|
*/
|
|
public HttpPostStandardRequestDecoder(HttpDataFactory factory, HttpRequest request,
|
|
Charset charset) throws ErrorDataDecoderException {
|
|
+ this(factory, request, charset, HttpPostRequestDecoder.DEFAULT_MAX_FIELDS, HttpPostRequestDecoder.DEFAULT_MAX_BUFFERED_BYTES);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ *
|
|
+ * @param factory the factory used to create InterfaceHttpData
|
|
+ * @param request the request to decode
|
|
+ * @param charset the charset to use as default
|
|
+ * @param maxFields the maximum number of fields the form can have, {@code -1} to disable
|
|
+ * @param maxBufferedBytes the maximum number of bytes the decoder can buffer when decoding a field, {@code -1} to disable
|
|
+ * @throws NullPointerException for request or charset or factory
|
|
+ * @throws ErrorDataDecoderException if the default charset was wrong when decoding or other errors
|
|
+ */
|
|
+ public HttpPostStandardRequestDecoder(HttpDataFactory factory, HttpRequest request,
|
|
+ Charset charset, int maxFields, int maxBufferedBytes) throws ErrorDataDecoderException {
|
|
if (factory == null) {
|
|
throw new NullPointerException("factory");
|
|
}
|
|
@@ -137,6 +162,8 @@
|
|
this.request = request;
|
|
this.charset = charset;
|
|
this.factory = factory;
|
|
+ this.maxFields = maxFields;
|
|
+ this.maxBufferedBytes = maxBufferedBytes;
|
|
if (!this.request.isChunked()) {
|
|
undecodedChunk = this.request.getContent();
|
|
isLastChunk = true;
|
|
@@ -190,6 +217,9 @@
|
|
isLastChunk = true;
|
|
}
|
|
parseBody();
|
|
+ if (maxBufferedBytes > 0 && undecodedChunk != null && undecodedChunk.readableBytes() > maxBufferedBytes) {
|
|
+ throw new ErrorDataDecoderException();
|
|
+ }
|
|
}
|
|
|
|
public boolean hasNext() throws EndOfDataDecoderException {
|
|
@@ -228,10 +258,13 @@
|
|
/**
|
|
* Utility function to add a new decoded data
|
|
*/
|
|
- private void addHttpData(InterfaceHttpData data) {
|
|
+ private void addHttpData(InterfaceHttpData data) throws ErrorDataDecoderException {
|
|
if (data == null) {
|
|
return;
|
|
}
|
|
+ if (maxFields > 0 && bodyListHttpData.size() >= maxFields) {
|
|
+ throw new ErrorDataDecoderException();
|
|
+ }
|
|
List<InterfaceHttpData> datas = bodyMapHttpData.get(data.getName());
|
|
if (datas == null) {
|
|
datas = new ArrayList<InterfaceHttpData>(1);
|