This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-fileupload.git
The following commit(s) were added to refs/heads/master by this push: new ce16e69 Replace LimitedInputStream with BoundedInputStream ce16e69 is described below commit ce16e698cb1672394ea0dc974ceb683a5de8b031 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Thu May 18 17:52:29 2023 -0400 Replace LimitedInputStream with BoundedInputStream --- .../fileupload2/impl/FileItemIteratorImpl.java | 6 +- .../fileupload2/impl/FileItemStreamImpl.java | 6 +- .../fileupload2/util/LimitedInputStream.java | 117 --------------------- src/changes/changes.xml | 1 + 4 files changed, 7 insertions(+), 123 deletions(-) diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/impl/FileItemIteratorImpl.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/impl/FileItemIteratorImpl.java index 74ae1c0..e703e44 100644 --- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/impl/FileItemIteratorImpl.java +++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/impl/FileItemIteratorImpl.java @@ -35,8 +35,8 @@ import org.apache.commons.fileupload2.ProgressListener; import org.apache.commons.fileupload2.RequestContext; import org.apache.commons.fileupload2.pub.FileUploadContentTypeException; import org.apache.commons.fileupload2.pub.FileUploadSizeException; -import org.apache.commons.fileupload2.util.LimitedInputStream; import org.apache.commons.io.IOUtils; +import org.apache.commons.io.input.BoundedInputStream; /** * The iterator, which is returned by {@link AbstractFileUpload#getItemIterator(RequestContext)}. @@ -269,9 +269,9 @@ public class FileItemIteratorImpl implements FileItemIterator { requestSize); } // N.B. this is eventually closed in MultipartStream processing - input = new LimitedInputStream(ctx.getInputStream(), sizeMax) { + input = new BoundedInputStream(ctx.getInputStream(), sizeMax) { @Override - protected void raiseError(final long maxLen, final long count) throws IOException { + protected void onMaxLength(final long maxLen, final long count) throws IOException { throw new FileUploadSizeException( String.format("The request was rejected because its size (%s) exceeds the configured maximum (%s)", count, maxLen), maxLen, count); } diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/impl/FileItemStreamImpl.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/impl/FileItemStreamImpl.java index 1c59aef..db29c1b 100644 --- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/impl/FileItemStreamImpl.java +++ b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/impl/FileItemStreamImpl.java @@ -26,7 +26,7 @@ import org.apache.commons.fileupload2.InvalidFileNameException; import org.apache.commons.fileupload2.MultipartStream.ItemInputStream; import org.apache.commons.fileupload2.disk.DiskFileItem; import org.apache.commons.fileupload2.pub.FileUploadByteCountLimitException; -import org.apache.commons.fileupload2.util.LimitedInputStream; +import org.apache.commons.io.input.BoundedInputStream; /** * Default implementation of {@link FileItemStream}. @@ -103,9 +103,9 @@ public class FileItemStreamImpl implements FileItemStream { final ItemInputStream itemInputStream = fileItemIteratorImpl.getMultiPartStream().newInputStream(); InputStream istream = itemInputStream; if (fileSizeMax != -1) { - istream = new LimitedInputStream(istream, fileSizeMax) { + istream = new BoundedInputStream(istream, fileSizeMax) { @Override - protected void raiseError(final long sizeMax, final long count) throws IOException { + protected void onMaxLength(final long sizeMax, final long count) throws IOException { itemInputStream.close(true); throw new FileUploadByteCountLimitException( String.format("The field %s exceeds its maximum permitted size of %s bytes.", fieldName, sizeMax), count, sizeMax, fileName, diff --git a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/util/LimitedInputStream.java b/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/util/LimitedInputStream.java deleted file mode 100644 index be98950..0000000 --- a/commons-fileupload2-core/src/main/java/org/apache/commons/fileupload2/util/LimitedInputStream.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.commons.fileupload2.util; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * An input stream, which limits its data size. This stream is used, if the content length is unknown. - */ -public abstract class LimitedInputStream extends FilterInputStream { - - /** - * The maximum size of an item, in bytes. - */ - private final long sizeMax; - - /** - * The current number of bytes. - */ - private long count; - - /** - * Creates a new instance. - * - * @param inputStream The input stream, which shall be limited. - * @param sizeMax The limit; no more than this number of bytes shall be returned by the source stream. - */ - public LimitedInputStream(final InputStream inputStream, final long sizeMax) { - super(inputStream); - this.sizeMax = sizeMax; - } - - /** - * Called to check, whether the input streams limit is reached. - * - * @throws IOException The given limit is exceeded. - */ - private void checkLimit() throws IOException { - if (count > sizeMax) { - raiseError(sizeMax, count); - } - } - - /** - * Called to indicate, that the input streams limit has been exceeded. - * - * @param sizeMax The input streams limit, in bytes. - * @param count The actual number of bytes. - * @throws IOException The called method is expected to raise an IOException. - */ - protected abstract void raiseError(long sizeMax, long count) throws IOException; - - /** - * Reads the next byte of data from this input stream. The value byte is returned as an {@code int} in the range {@code 0} to {@code 255}. If no byte is - * available because the end of the stream has been reached, the value {@code -1} is returned. This method blocks until input data is available, the end of - * the stream is detected, or an exception is thrown. - * <p> - * This method simply performs {@code in.read()} and returns the result. - * </p> - * - * @return the next byte of data, or {@code -1} if the end of the stream is reached. - * @throws IOException if an I/O error occurs. - * @see java.io.FilterInputStream#in - */ - @Override - public int read() throws IOException { - final int res = super.read(); - if (res != -1) { - count++; - checkLimit(); - } - return res; - } - - /** - * Reads up to {@code len} bytes of data from this input stream into an array of bytes. If {@code len} is not zero, the method blocks until some input is - * available; otherwise, no bytes are read and {@code 0} is returned. - * <p> - * This method simply performs {@code in.read(b, off, len)} and returns the result. - * </p> - * - * @param b the buffer into which the data is read. - * @param off The start offset in the destination array {@code b}. - * @param len the maximum number of bytes read. - * @return the total number of bytes read into the buffer, or {@code -1} if there is no more data because the end of the stream has been reached. - * @throws NullPointerException If {@code b} is {@code null}. - * @throws IndexOutOfBoundsException If {@code off} is negative, {@code len} is negative, or {@code len} is greater than {@code b.length - off} - * @throws IOException if an I/O error occurs. - * @see java.io.FilterInputStream#in - */ - @Override - public int read(final byte[] b, final int off, final int len) throws IOException { - final int res = super.read(b, off, len); - if (res > 0) { - count += res; - checkLimit(); - } - return res; - } - -} diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 7ebdc1a..55c6abf 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -73,6 +73,7 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="remove" due-to="Gary Gregory">Remove deprecated FileUploadBase.getHeader(Map, String).</action> <action dev="ggregory" type="remove" due-to="Gary Gregory">Remove deprecated FileUploadBase.parseHeaders(String).</action> <action dev="ggregory" type="remove" due-to="Gary Gregory">Replace org.apache.commons.fileupload2.util.mime.Base64Decoder with java.util.Base64.</action> + <action dev="ggregory" type="remove" due-to="Gary Gregory">Replace LimitedInputStream with BoundedInputStream.</action> <!-- UPDATE --> <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">Bump actions/cache from 2.1.6 to 3.0.8 #128, #140.</action> <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">Bump actions/checkout from 2.3.4 to 3.0.2 #125.</action>