Modified: websites/production/commons/content/proper/commons-fileupload/commons-fileupload2-core/apidocs/src-html/org/apache/commons/fileupload2/core/MultipartInput.FileUploadBoundaryException.html ============================================================================== --- websites/production/commons/content/proper/commons-fileupload/commons-fileupload2-core/apidocs/src-html/org/apache/commons/fileupload2/core/MultipartInput.FileUploadBoundaryException.html (original) +++ websites/production/commons/content/proper/commons-fileupload/commons-fileupload2-core/apidocs/src-html/org/apache/commons/fileupload2/core/MultipartInput.FileUploadBoundaryException.html Mon Jun 16 14:44:13 2025 @@ -123,875 +123,916 @@ <span class="source-line-no">110</span><span id="line-110"> */</span> <span class="source-line-no">111</span><span id="line-111"> private ProgressNotifier progressNotifier;</span> <span class="source-line-no">112</span><span id="line-112"></span> -<span class="source-line-no">113</span><span id="line-113"> /**</span> -<span class="source-line-no">114</span><span id="line-114"> * Constructs a new instance.</span> -<span class="source-line-no">115</span><span id="line-115"> */</span> -<span class="source-line-no">116</span><span id="line-116"> public Builder() {</span> -<span class="source-line-no">117</span><span id="line-117"> setBufferSizeDefault(DEFAULT_BUFSIZE);</span> -<span class="source-line-no">118</span><span id="line-118"> }</span> -<span class="source-line-no">119</span><span id="line-119"></span> -<span class="source-line-no">120</span><span id="line-120"> /**</span> -<span class="source-line-no">121</span><span id="line-121"> * Constructs a new instance.</span> -<span class="source-line-no">122</span><span id="line-122"> * <p></span> -<span class="source-line-no">123</span><span id="line-123"> * This builder uses the InputStream, buffer size, boundary and progress notifier aspects.</span> -<span class="source-line-no">124</span><span id="line-124"> * </p></span> -<span class="source-line-no">125</span><span id="line-125"> * <p></span> -<span class="source-line-no">126</span><span id="line-126"> * You must provide an origin that can be converted to a Reader by this builder, otherwise, this call will throw an</span> -<span class="source-line-no">127</span><span id="line-127"> * {@link UnsupportedOperationException}.</span> +<span class="source-line-no">113</span><span id="line-113"> /** The per part size limit for headers.</span> +<span class="source-line-no">114</span><span id="line-114"> */</span> +<span class="source-line-no">115</span><span id="line-115"> private int partHeaderSizeMax = DEFAULT_PART_HEADER_SIZE_MAX;</span> +<span class="source-line-no">116</span><span id="line-116"></span> +<span class="source-line-no">117</span><span id="line-117"> /**</span> +<span class="source-line-no">118</span><span id="line-118"> * Constructs a new instance.</span> +<span class="source-line-no">119</span><span id="line-119"> */</span> +<span class="source-line-no">120</span><span id="line-120"> public Builder() {</span> +<span class="source-line-no">121</span><span id="line-121"> setBufferSizeDefault(DEFAULT_BUFSIZE);</span> +<span class="source-line-no">122</span><span id="line-122"> }</span> +<span class="source-line-no">123</span><span id="line-123"></span> +<span class="source-line-no">124</span><span id="line-124"> /**</span> +<span class="source-line-no">125</span><span id="line-125"> * Constructs a new instance.</span> +<span class="source-line-no">126</span><span id="line-126"> * <p></span> +<span class="source-line-no">127</span><span id="line-127"> * This builder uses the InputStream, buffer size, boundary and progress notifier aspects.</span> <span class="source-line-no">128</span><span id="line-128"> * </p></span> -<span class="source-line-no">129</span><span id="line-129"> *</span> -<span class="source-line-no">130</span><span id="line-130"> * @return a new instance.</span> -<span class="source-line-no">131</span><span id="line-131"> * @throws IOException if an I/O error occurs.</span> -<span class="source-line-no">132</span><span id="line-132"> * @throws UnsupportedOperationException if the origin cannot provide a Path.</span> -<span class="source-line-no">133</span><span id="line-133"> * @see AbstractOrigin#getReader(Charset)</span> -<span class="source-line-no">134</span><span id="line-134"> */</span> -<span class="source-line-no">135</span><span id="line-135"> @Override</span> -<span class="source-line-no">136</span><span id="line-136"> public MultipartInput get() throws IOException {</span> -<span class="source-line-no">137</span><span id="line-137"> return new MultipartInput(getInputStream(), boundary, getBufferSize(), progressNotifier);</span> -<span class="source-line-no">138</span><span id="line-138"> }</span> -<span class="source-line-no">139</span><span id="line-139"></span> -<span class="source-line-no">140</span><span id="line-140"> /**</span> -<span class="source-line-no">141</span><span id="line-141"> * Sets the boundary.</span> -<span class="source-line-no">142</span><span id="line-142"> *</span> -<span class="source-line-no">143</span><span id="line-143"> * @param boundary the boundary.</span> -<span class="source-line-no">144</span><span id="line-144"> * @return {@code this} instance.</span> -<span class="source-line-no">145</span><span id="line-145"> */</span> -<span class="source-line-no">146</span><span id="line-146"> public Builder setBoundary(final byte[] boundary) {</span> -<span class="source-line-no">147</span><span id="line-147"> this.boundary = boundary;</span> -<span class="source-line-no">148</span><span id="line-148"> return this;</span> -<span class="source-line-no">149</span><span id="line-149"> }</span> -<span class="source-line-no">150</span><span id="line-150"></span> -<span class="source-line-no">151</span><span id="line-151"> /**</span> -<span class="source-line-no">152</span><span id="line-152"> * Sets the progress notifier.</span> -<span class="source-line-no">153</span><span id="line-153"> *</span> -<span class="source-line-no">154</span><span id="line-154"> * @param progressNotifier progress notifier.</span> -<span class="source-line-no">155</span><span id="line-155"> * @return {@code this} instance.</span> -<span class="source-line-no">156</span><span id="line-156"> */</span> -<span class="source-line-no">157</span><span id="line-157"> public Builder setProgressNotifier(final ProgressNotifier progressNotifier) {</span> -<span class="source-line-no">158</span><span id="line-158"> this.progressNotifier = progressNotifier;</span> -<span class="source-line-no">159</span><span id="line-159"> return this;</span> -<span class="source-line-no">160</span><span id="line-160"> }</span> -<span class="source-line-no">161</span><span id="line-161"></span> -<span class="source-line-no">162</span><span id="line-162"> }</span> -<span class="source-line-no">163</span><span id="line-163"></span> -<span class="source-line-no">164</span><span id="line-164"> /**</span> -<span class="source-line-no">165</span><span id="line-165"> * Signals an attempt to set an invalid boundary token.</span> -<span class="source-line-no">166</span><span id="line-166"> */</span> -<span class="source-line-no">167</span><span id="line-167"> public static class FileUploadBoundaryException extends FileUploadException {</span> -<span class="source-line-no">168</span><span id="line-168"></span> -<span class="source-line-no">169</span><span id="line-169"> /**</span> -<span class="source-line-no">170</span><span id="line-170"> * The UID to use when serializing this instance.</span> -<span class="source-line-no">171</span><span id="line-171"> */</span> -<span class="source-line-no">172</span><span id="line-172"> private static final long serialVersionUID = 2;</span> -<span class="source-line-no">173</span><span id="line-173"></span> -<span class="source-line-no">174</span><span id="line-174"> /**</span> -<span class="source-line-no">175</span><span id="line-175"> * Constructs an instance with the specified detail message.</span> -<span class="source-line-no">176</span><span id="line-176"> *</span> -<span class="source-line-no">177</span><span id="line-177"> * @param message The detail message (which is saved for later retrieval by the {@link #getMessage()} method)</span> -<span class="source-line-no">178</span><span id="line-178"> */</span> -<span class="source-line-no">179</span><span id="line-179"> public FileUploadBoundaryException(final String message) {</span> -<span class="source-line-no">180</span><span id="line-180"> super(message);</span> -<span class="source-line-no">181</span><span id="line-181"> }</span> -<span class="source-line-no">182</span><span id="line-182"></span> -<span class="source-line-no">183</span><span id="line-183"> }</span> -<span class="source-line-no">184</span><span id="line-184"></span> -<span class="source-line-no">185</span><span id="line-185"> /**</span> -<span class="source-line-no">186</span><span id="line-186"> * An {@link InputStream} for reading an items contents.</span> -<span class="source-line-no">187</span><span id="line-187"> */</span> -<span class="source-line-no">188</span><span id="line-188"> public class ItemInputStream extends InputStream {</span> -<span class="source-line-no">189</span><span id="line-189"></span> -<span class="source-line-no">190</span><span id="line-190"> /**</span> -<span class="source-line-no">191</span><span id="line-191"> * Offset when converting negative bytes to integers.</span> -<span class="source-line-no">192</span><span id="line-192"> */</span> -<span class="source-line-no">193</span><span id="line-193"> private static final int BYTE_POSITIVE_OFFSET = 256;</span> -<span class="source-line-no">194</span><span id="line-194"></span> -<span class="source-line-no">195</span><span id="line-195"> /**</span> -<span class="source-line-no">196</span><span id="line-196"> * The number of bytes, which have been read so far.</span> -<span class="source-line-no">197</span><span id="line-197"> */</span> -<span class="source-line-no">198</span><span id="line-198"> private long total;</span> -<span class="source-line-no">199</span><span id="line-199"></span> -<span class="source-line-no">200</span><span id="line-200"> /**</span> -<span class="source-line-no">201</span><span id="line-201"> * The number of bytes, which must be hold, because they might be a part of the boundary.</span> -<span class="source-line-no">202</span><span id="line-202"> */</span> -<span class="source-line-no">203</span><span id="line-203"> private int pad;</span> +<span class="source-line-no">129</span><span id="line-129"> * <p></span> +<span class="source-line-no">130</span><span id="line-130"> * You must provide an origin that can be converted to a Reader by this builder, otherwise, this call will throw an</span> +<span class="source-line-no">131</span><span id="line-131"> * {@link UnsupportedOperationException}.</span> +<span class="source-line-no">132</span><span id="line-132"> * </p></span> +<span class="source-line-no">133</span><span id="line-133"> *</span> +<span class="source-line-no">134</span><span id="line-134"> * @return a new instance.</span> +<span class="source-line-no">135</span><span id="line-135"> * @throws IOException if an I/O error occurs.</span> +<span class="source-line-no">136</span><span id="line-136"> * @throws UnsupportedOperationException if the origin cannot provide a Path.</span> +<span class="source-line-no">137</span><span id="line-137"> * @see AbstractOrigin#getReader(Charset)</span> +<span class="source-line-no">138</span><span id="line-138"> */</span> +<span class="source-line-no">139</span><span id="line-139"> @Override</span> +<span class="source-line-no">140</span><span id="line-140"> public MultipartInput get() throws IOException {</span> +<span class="source-line-no">141</span><span id="line-141"> return new MultipartInput(getInputStream(), boundary, getBufferSize(), getPartHeaderSizeMax(), progressNotifier);</span> +<span class="source-line-no">142</span><span id="line-142"> }</span> +<span class="source-line-no">143</span><span id="line-143"></span> +<span class="source-line-no">144</span><span id="line-144"> /** Returns the per part size limit for headers.</span> +<span class="source-line-no">145</span><span id="line-145"> * @return The maximum size of the headers in bytes.</span> +<span class="source-line-no">146</span><span id="line-146"> * @since 2.0.0-M4</span> +<span class="source-line-no">147</span><span id="line-147"> */</span> +<span class="source-line-no">148</span><span id="line-148"> public int getPartHeaderSizeMax() {</span> +<span class="source-line-no">149</span><span id="line-149"> return partHeaderSizeMax;</span> +<span class="source-line-no">150</span><span id="line-150"> }</span> +<span class="source-line-no">151</span><span id="line-151"></span> +<span class="source-line-no">152</span><span id="line-152"> /**</span> +<span class="source-line-no">153</span><span id="line-153"> * Sets the boundary.</span> +<span class="source-line-no">154</span><span id="line-154"> *</span> +<span class="source-line-no">155</span><span id="line-155"> * @param boundary the boundary.</span> +<span class="source-line-no">156</span><span id="line-156"> * @return {@code this} instance.</span> +<span class="source-line-no">157</span><span id="line-157"> */</span> +<span class="source-line-no">158</span><span id="line-158"> public Builder setBoundary(final byte[] boundary) {</span> +<span class="source-line-no">159</span><span id="line-159"> this.boundary = boundary;</span> +<span class="source-line-no">160</span><span id="line-160"> return this;</span> +<span class="source-line-no">161</span><span id="line-161"> }</span> +<span class="source-line-no">162</span><span id="line-162"></span> +<span class="source-line-no">163</span><span id="line-163"> /** Sets the per part size limit for headers.</span> +<span class="source-line-no">164</span><span id="line-164"> * @param partHeaderSizeMax The maximum size of the headers in bytes.</span> +<span class="source-line-no">165</span><span id="line-165"> * @return This builder.</span> +<span class="source-line-no">166</span><span id="line-166"> * @since 2.0.0-M4</span> +<span class="source-line-no">167</span><span id="line-167"> */</span> +<span class="source-line-no">168</span><span id="line-168"> public Builder setPartHeaderSizeMax(final int partHeaderSizeMax) {</span> +<span class="source-line-no">169</span><span id="line-169"> this.partHeaderSizeMax = partHeaderSizeMax;</span> +<span class="source-line-no">170</span><span id="line-170"> return this;</span> +<span class="source-line-no">171</span><span id="line-171"> }</span> +<span class="source-line-no">172</span><span id="line-172"></span> +<span class="source-line-no">173</span><span id="line-173"> /**</span> +<span class="source-line-no">174</span><span id="line-174"> * Sets the progress notifier.</span> +<span class="source-line-no">175</span><span id="line-175"> *</span> +<span class="source-line-no">176</span><span id="line-176"> * @param progressNotifier progress notifier.</span> +<span class="source-line-no">177</span><span id="line-177"> * @return {@code this} instance.</span> +<span class="source-line-no">178</span><span id="line-178"> */</span> +<span class="source-line-no">179</span><span id="line-179"> public Builder setProgressNotifier(final ProgressNotifier progressNotifier) {</span> +<span class="source-line-no">180</span><span id="line-180"> this.progressNotifier = progressNotifier;</span> +<span class="source-line-no">181</span><span id="line-181"> return this;</span> +<span class="source-line-no">182</span><span id="line-182"> }</span> +<span class="source-line-no">183</span><span id="line-183"></span> +<span class="source-line-no">184</span><span id="line-184"> }</span> +<span class="source-line-no">185</span><span id="line-185"></span> +<span class="source-line-no">186</span><span id="line-186"> /**</span> +<span class="source-line-no">187</span><span id="line-187"> * Signals an attempt to set an invalid boundary token.</span> +<span class="source-line-no">188</span><span id="line-188"> */</span> +<span class="source-line-no">189</span><span id="line-189"> public static class FileUploadBoundaryException extends FileUploadException {</span> +<span class="source-line-no">190</span><span id="line-190"></span> +<span class="source-line-no">191</span><span id="line-191"> /**</span> +<span class="source-line-no">192</span><span id="line-192"> * The UID to use when serializing this instance.</span> +<span class="source-line-no">193</span><span id="line-193"> */</span> +<span class="source-line-no">194</span><span id="line-194"> private static final long serialVersionUID = 2;</span> +<span class="source-line-no">195</span><span id="line-195"></span> +<span class="source-line-no">196</span><span id="line-196"> /**</span> +<span class="source-line-no">197</span><span id="line-197"> * Constructs an instance with the specified detail message.</span> +<span class="source-line-no">198</span><span id="line-198"> *</span> +<span class="source-line-no">199</span><span id="line-199"> * @param message The detail message (which is saved for later retrieval by the {@link #getMessage()} method)</span> +<span class="source-line-no">200</span><span id="line-200"> */</span> +<span class="source-line-no">201</span><span id="line-201"> public FileUploadBoundaryException(final String message) {</span> +<span class="source-line-no">202</span><span id="line-202"> super(message);</span> +<span class="source-line-no">203</span><span id="line-203"> }</span> <span class="source-line-no">204</span><span id="line-204"></span> -<span class="source-line-no">205</span><span id="line-205"> /**</span> -<span class="source-line-no">206</span><span id="line-206"> * The current offset in the buffer.</span> -<span class="source-line-no">207</span><span id="line-207"> */</span> -<span class="source-line-no">208</span><span id="line-208"> private int pos;</span> -<span class="source-line-no">209</span><span id="line-209"></span> -<span class="source-line-no">210</span><span id="line-210"> /**</span> -<span class="source-line-no">211</span><span id="line-211"> * Whether the stream is already closed.</span> -<span class="source-line-no">212</span><span id="line-212"> */</span> -<span class="source-line-no">213</span><span id="line-213"> private boolean closed;</span> -<span class="source-line-no">214</span><span id="line-214"></span> -<span class="source-line-no">215</span><span id="line-215"> /**</span> -<span class="source-line-no">216</span><span id="line-216"> * Creates a new instance.</span> -<span class="source-line-no">217</span><span id="line-217"> */</span> -<span class="source-line-no">218</span><span id="line-218"> ItemInputStream() {</span> -<span class="source-line-no">219</span><span id="line-219"> findSeparator();</span> -<span class="source-line-no">220</span><span id="line-220"> }</span> +<span class="source-line-no">205</span><span id="line-205"> }</span> +<span class="source-line-no">206</span><span id="line-206"></span> +<span class="source-line-no">207</span><span id="line-207"> /**</span> +<span class="source-line-no">208</span><span id="line-208"> * An {@link InputStream} for reading an items contents.</span> +<span class="source-line-no">209</span><span id="line-209"> */</span> +<span class="source-line-no">210</span><span id="line-210"> public class ItemInputStream extends InputStream {</span> +<span class="source-line-no">211</span><span id="line-211"></span> +<span class="source-line-no">212</span><span id="line-212"> /**</span> +<span class="source-line-no">213</span><span id="line-213"> * Offset when converting negative bytes to integers.</span> +<span class="source-line-no">214</span><span id="line-214"> */</span> +<span class="source-line-no">215</span><span id="line-215"> private static final int BYTE_POSITIVE_OFFSET = 256;</span> +<span class="source-line-no">216</span><span id="line-216"></span> +<span class="source-line-no">217</span><span id="line-217"> /**</span> +<span class="source-line-no">218</span><span id="line-218"> * The number of bytes, which have been read so far.</span> +<span class="source-line-no">219</span><span id="line-219"> */</span> +<span class="source-line-no">220</span><span id="line-220"> private long total;</span> <span class="source-line-no">221</span><span id="line-221"></span> <span class="source-line-no">222</span><span id="line-222"> /**</span> -<span class="source-line-no">223</span><span id="line-223"> * Returns the number of bytes, which are currently available, without blocking.</span> -<span class="source-line-no">224</span><span id="line-224"> *</span> -<span class="source-line-no">225</span><span id="line-225"> * @throws IOException An I/O error occurs.</span> -<span class="source-line-no">226</span><span id="line-226"> * @return Number of bytes in the buffer.</span> -<span class="source-line-no">227</span><span id="line-227"> */</span> -<span class="source-line-no">228</span><span id="line-228"> @Override</span> -<span class="source-line-no">229</span><span id="line-229"> public int available() throws IOException {</span> -<span class="source-line-no">230</span><span id="line-230"> if (pos == -1) {</span> -<span class="source-line-no">231</span><span id="line-231"> return tail - head - pad;</span> -<span class="source-line-no">232</span><span id="line-232"> }</span> -<span class="source-line-no">233</span><span id="line-233"> return pos - head;</span> -<span class="source-line-no">234</span><span id="line-234"> }</span> -<span class="source-line-no">235</span><span id="line-235"></span> -<span class="source-line-no">236</span><span id="line-236"> private void checkOpen() throws ItemSkippedException {</span> -<span class="source-line-no">237</span><span id="line-237"> if (closed) {</span> -<span class="source-line-no">238</span><span id="line-238"> throw new FileItemInput.ItemSkippedException("checkOpen()");</span> -<span class="source-line-no">239</span><span id="line-239"> }</span> -<span class="source-line-no">240</span><span id="line-240"> }</span> -<span class="source-line-no">241</span><span id="line-241"></span> -<span class="source-line-no">242</span><span id="line-242"> /**</span> -<span class="source-line-no">243</span><span id="line-243"> * Closes the input stream.</span> -<span class="source-line-no">244</span><span id="line-244"> *</span> -<span class="source-line-no">245</span><span id="line-245"> * @throws IOException An I/O error occurred.</span> -<span class="source-line-no">246</span><span id="line-246"> */</span> -<span class="source-line-no">247</span><span id="line-247"> @Override</span> -<span class="source-line-no">248</span><span id="line-248"> public void close() throws IOException {</span> -<span class="source-line-no">249</span><span id="line-249"> close(false);</span> -<span class="source-line-no">250</span><span id="line-250"> }</span> -<span class="source-line-no">251</span><span id="line-251"></span> -<span class="source-line-no">252</span><span id="line-252"> /**</span> -<span class="source-line-no">253</span><span id="line-253"> * Closes the input stream.</span> -<span class="source-line-no">254</span><span id="line-254"> *</span> -<span class="source-line-no">255</span><span id="line-255"> * @param closeUnderlying Whether to close the underlying stream (hard close)</span> -<span class="source-line-no">256</span><span id="line-256"> * @throws IOException An I/O error occurred.</span> -<span class="source-line-no">257</span><span id="line-257"> */</span> -<span class="source-line-no">258</span><span id="line-258"> public void close(final boolean closeUnderlying) throws IOException {</span> +<span class="source-line-no">223</span><span id="line-223"> * The number of bytes, which must be hold, because they might be a part of the boundary.</span> +<span class="source-line-no">224</span><span id="line-224"> */</span> +<span class="source-line-no">225</span><span id="line-225"> private int pad;</span> +<span class="source-line-no">226</span><span id="line-226"></span> +<span class="source-line-no">227</span><span id="line-227"> /**</span> +<span class="source-line-no">228</span><span id="line-228"> * The current offset in the buffer.</span> +<span class="source-line-no">229</span><span id="line-229"> */</span> +<span class="source-line-no">230</span><span id="line-230"> private int pos;</span> +<span class="source-line-no">231</span><span id="line-231"></span> +<span class="source-line-no">232</span><span id="line-232"> /**</span> +<span class="source-line-no">233</span><span id="line-233"> * Whether the stream is already closed.</span> +<span class="source-line-no">234</span><span id="line-234"> */</span> +<span class="source-line-no">235</span><span id="line-235"> private boolean closed;</span> +<span class="source-line-no">236</span><span id="line-236"></span> +<span class="source-line-no">237</span><span id="line-237"> /**</span> +<span class="source-line-no">238</span><span id="line-238"> * Creates a new instance.</span> +<span class="source-line-no">239</span><span id="line-239"> */</span> +<span class="source-line-no">240</span><span id="line-240"> ItemInputStream() {</span> +<span class="source-line-no">241</span><span id="line-241"> findSeparator();</span> +<span class="source-line-no">242</span><span id="line-242"> }</span> +<span class="source-line-no">243</span><span id="line-243"></span> +<span class="source-line-no">244</span><span id="line-244"> /**</span> +<span class="source-line-no">245</span><span id="line-245"> * Returns the number of bytes, which are currently available, without blocking.</span> +<span class="source-line-no">246</span><span id="line-246"> *</span> +<span class="source-line-no">247</span><span id="line-247"> * @throws IOException An I/O error occurs.</span> +<span class="source-line-no">248</span><span id="line-248"> * @return Number of bytes in the buffer.</span> +<span class="source-line-no">249</span><span id="line-249"> */</span> +<span class="source-line-no">250</span><span id="line-250"> @Override</span> +<span class="source-line-no">251</span><span id="line-251"> public int available() throws IOException {</span> +<span class="source-line-no">252</span><span id="line-252"> if (pos == -1) {</span> +<span class="source-line-no">253</span><span id="line-253"> return tail - head - pad;</span> +<span class="source-line-no">254</span><span id="line-254"> }</span> +<span class="source-line-no">255</span><span id="line-255"> return pos - head;</span> +<span class="source-line-no">256</span><span id="line-256"> }</span> +<span class="source-line-no">257</span><span id="line-257"></span> +<span class="source-line-no">258</span><span id="line-258"> private void checkOpen() throws ItemSkippedException {</span> <span class="source-line-no">259</span><span id="line-259"> if (closed) {</span> -<span class="source-line-no">260</span><span id="line-260"> return;</span> +<span class="source-line-no">260</span><span id="line-260"> throw new FileItemInput.ItemSkippedException("checkOpen()");</span> <span class="source-line-no">261</span><span id="line-261"> }</span> -<span class="source-line-no">262</span><span id="line-262"> if (closeUnderlying) {</span> -<span class="source-line-no">263</span><span id="line-263"> closed = true;</span> -<span class="source-line-no">264</span><span id="line-264"> input.close();</span> -<span class="source-line-no">265</span><span id="line-265"> } else {</span> -<span class="source-line-no">266</span><span id="line-266"> for (;;) {</span> -<span class="source-line-no">267</span><span id="line-267"> var avail = available();</span> -<span class="source-line-no">268</span><span id="line-268"> if (avail == 0) {</span> -<span class="source-line-no">269</span><span id="line-269"> avail = makeAvailable();</span> -<span class="source-line-no">270</span><span id="line-270"> if (avail == 0) {</span> -<span class="source-line-no">271</span><span id="line-271"> break;</span> -<span class="source-line-no">272</span><span id="line-272"> }</span> -<span class="source-line-no">273</span><span id="line-273"> }</span> -<span class="source-line-no">274</span><span id="line-274"> if (skip(avail) != avail) {</span> -<span class="source-line-no">275</span><span id="line-275"> // TODO What to do?</span> -<span class="source-line-no">276</span><span id="line-276"> }</span> -<span class="source-line-no">277</span><span id="line-277"> }</span> -<span class="source-line-no">278</span><span id="line-278"> }</span> -<span class="source-line-no">279</span><span id="line-279"> closed = true;</span> -<span class="source-line-no">280</span><span id="line-280"> }</span> -<span class="source-line-no">281</span><span id="line-281"></span> -<span class="source-line-no">282</span><span id="line-282"> /**</span> -<span class="source-line-no">283</span><span id="line-283"> * Called for finding the separator.</span> -<span class="source-line-no">284</span><span id="line-284"> */</span> -<span class="source-line-no">285</span><span id="line-285"> private void findSeparator() {</span> -<span class="source-line-no">286</span><span id="line-286"> pos = MultipartInput.this.findSeparator();</span> -<span class="source-line-no">287</span><span id="line-287"> if (pos == -1) {</span> -<span class="source-line-no">288</span><span id="line-288"> if (tail - head > keepRegion) {</span> -<span class="source-line-no">289</span><span id="line-289"> pad = keepRegion;</span> -<span class="source-line-no">290</span><span id="line-290"> } else {</span> -<span class="source-line-no">291</span><span id="line-291"> pad = tail - head;</span> -<span class="source-line-no">292</span><span id="line-292"> }</span> -<span class="source-line-no">293</span><span id="line-293"> }</span> -<span class="source-line-no">294</span><span id="line-294"> }</span> -<span class="source-line-no">295</span><span id="line-295"></span> -<span class="source-line-no">296</span><span id="line-296"> /**</span> -<span class="source-line-no">297</span><span id="line-297"> * Gets the number of bytes, which have been read by the stream.</span> -<span class="source-line-no">298</span><span id="line-298"> *</span> -<span class="source-line-no">299</span><span id="line-299"> * @return Number of bytes, which have been read so far.</span> -<span class="source-line-no">300</span><span id="line-300"> */</span> -<span class="source-line-no">301</span><span id="line-301"> public long getBytesRead() {</span> -<span class="source-line-no">302</span><span id="line-302"> return total;</span> -<span class="source-line-no">303</span><span id="line-303"> }</span> -<span class="source-line-no">304</span><span id="line-304"></span> -<span class="source-line-no">305</span><span id="line-305"> /**</span> -<span class="source-line-no">306</span><span id="line-306"> * Tests whether this instance is closed.</span> -<span class="source-line-no">307</span><span id="line-307"> *</span> -<span class="source-line-no">308</span><span id="line-308"> * @return whether this instance is closed.</span> -<span class="source-line-no">309</span><span id="line-309"> */</span> -<span class="source-line-no">310</span><span id="line-310"> public boolean isClosed() {</span> -<span class="source-line-no">311</span><span id="line-311"> return closed;</span> -<span class="source-line-no">312</span><span id="line-312"> }</span> -<span class="source-line-no">313</span><span id="line-313"></span> -<span class="source-line-no">314</span><span id="line-314"> /**</span> -<span class="source-line-no">315</span><span id="line-315"> * Attempts to read more data.</span> -<span class="source-line-no">316</span><span id="line-316"> *</span> -<span class="source-line-no">317</span><span id="line-317"> * @return Number of available bytes</span> -<span class="source-line-no">318</span><span id="line-318"> * @throws IOException An I/O error occurred.</span> -<span class="source-line-no">319</span><span id="line-319"> */</span> -<span class="source-line-no">320</span><span id="line-320"> private int makeAvailable() throws IOException {</span> -<span class="source-line-no">321</span><span id="line-321"> if (pos != -1) {</span> -<span class="source-line-no">322</span><span id="line-322"> return 0;</span> -<span class="source-line-no">323</span><span id="line-323"> }</span> -<span class="source-line-no">324</span><span id="line-324"></span> -<span class="source-line-no">325</span><span id="line-325"> // Move the data to the beginning of the buffer.</span> -<span class="source-line-no">326</span><span id="line-326"> total += tail - head - pad;</span> -<span class="source-line-no">327</span><span id="line-327"> System.arraycopy(buffer, tail - pad, buffer, 0, pad);</span> -<span class="source-line-no">328</span><span id="line-328"></span> -<span class="source-line-no">329</span><span id="line-329"> // Refill buffer with new data.</span> -<span class="source-line-no">330</span><span id="line-330"> head = 0;</span> -<span class="source-line-no">331</span><span id="line-331"> tail = pad;</span> -<span class="source-line-no">332</span><span id="line-332"></span> -<span class="source-line-no">333</span><span id="line-333"> for (;;) {</span> -<span class="source-line-no">334</span><span id="line-334"> final var bytesRead = input.read(buffer, tail, bufSize - tail);</span> -<span class="source-line-no">335</span><span id="line-335"> if (bytesRead == -1) {</span> -<span class="source-line-no">336</span><span id="line-336"> // The last pad amount is left in the buffer.</span> -<span class="source-line-no">337</span><span id="line-337"> // Boundary can't be in there so signal an error</span> -<span class="source-line-no">338</span><span id="line-338"> // condition.</span> -<span class="source-line-no">339</span><span id="line-339"> final var msg = "Stream ended unexpectedly";</span> -<span class="source-line-no">340</span><span id="line-340"> throw new MalformedStreamException(msg);</span> -<span class="source-line-no">341</span><span id="line-341"> }</span> -<span class="source-line-no">342</span><span id="line-342"> if (notifier != null) {</span> -<span class="source-line-no">343</span><span id="line-343"> notifier.noteBytesRead(bytesRead);</span> -<span class="source-line-no">344</span><span id="line-344"> }</span> -<span class="source-line-no">345</span><span id="line-345"> tail += bytesRead;</span> +<span class="source-line-no">262</span><span id="line-262"> }</span> +<span class="source-line-no">263</span><span id="line-263"></span> +<span class="source-line-no">264</span><span id="line-264"> /**</span> +<span class="source-line-no">265</span><span id="line-265"> * Closes the input stream.</span> +<span class="source-line-no">266</span><span id="line-266"> *</span> +<span class="source-line-no">267</span><span id="line-267"> * @throws IOException An I/O error occurred.</span> +<span class="source-line-no">268</span><span id="line-268"> */</span> +<span class="source-line-no">269</span><span id="line-269"> @Override</span> +<span class="source-line-no">270</span><span id="line-270"> public void close() throws IOException {</span> +<span class="source-line-no">271</span><span id="line-271"> close(false);</span> +<span class="source-line-no">272</span><span id="line-272"> }</span> +<span class="source-line-no">273</span><span id="line-273"></span> +<span class="source-line-no">274</span><span id="line-274"> /**</span> +<span class="source-line-no">275</span><span id="line-275"> * Closes the input stream.</span> +<span class="source-line-no">276</span><span id="line-276"> *</span> +<span class="source-line-no">277</span><span id="line-277"> * @param closeUnderlying Whether to close the underlying stream (hard close)</span> +<span class="source-line-no">278</span><span id="line-278"> * @throws IOException An I/O error occurred.</span> +<span class="source-line-no">279</span><span id="line-279"> */</span> +<span class="source-line-no">280</span><span id="line-280"> public void close(final boolean closeUnderlying) throws IOException {</span> +<span class="source-line-no">281</span><span id="line-281"> if (closed) {</span> +<span class="source-line-no">282</span><span id="line-282"> return;</span> +<span class="source-line-no">283</span><span id="line-283"> }</span> +<span class="source-line-no">284</span><span id="line-284"> if (closeUnderlying) {</span> +<span class="source-line-no">285</span><span id="line-285"> closed = true;</span> +<span class="source-line-no">286</span><span id="line-286"> input.close();</span> +<span class="source-line-no">287</span><span id="line-287"> } else {</span> +<span class="source-line-no">288</span><span id="line-288"> for (;;) {</span> +<span class="source-line-no">289</span><span id="line-289"> var avail = available();</span> +<span class="source-line-no">290</span><span id="line-290"> if (avail == 0) {</span> +<span class="source-line-no">291</span><span id="line-291"> avail = makeAvailable();</span> +<span class="source-line-no">292</span><span id="line-292"> if (avail == 0) {</span> +<span class="source-line-no">293</span><span id="line-293"> break;</span> +<span class="source-line-no">294</span><span id="line-294"> }</span> +<span class="source-line-no">295</span><span id="line-295"> }</span> +<span class="source-line-no">296</span><span id="line-296"> if (skip(avail) != avail) {</span> +<span class="source-line-no">297</span><span id="line-297"> // TODO What to do?</span> +<span class="source-line-no">298</span><span id="line-298"> }</span> +<span class="source-line-no">299</span><span id="line-299"> }</span> +<span class="source-line-no">300</span><span id="line-300"> }</span> +<span class="source-line-no">301</span><span id="line-301"> closed = true;</span> +<span class="source-line-no">302</span><span id="line-302"> }</span> +<span class="source-line-no">303</span><span id="line-303"></span> +<span class="source-line-no">304</span><span id="line-304"> /**</span> +<span class="source-line-no">305</span><span id="line-305"> * Called for finding the separator.</span> +<span class="source-line-no">306</span><span id="line-306"> */</span> +<span class="source-line-no">307</span><span id="line-307"> private void findSeparator() {</span> +<span class="source-line-no">308</span><span id="line-308"> pos = MultipartInput.this.findSeparator();</span> +<span class="source-line-no">309</span><span id="line-309"> if (pos == -1) {</span> +<span class="source-line-no">310</span><span id="line-310"> if (tail - head > keepRegion) {</span> +<span class="source-line-no">311</span><span id="line-311"> pad = keepRegion;</span> +<span class="source-line-no">312</span><span id="line-312"> } else {</span> +<span class="source-line-no">313</span><span id="line-313"> pad = tail - head;</span> +<span class="source-line-no">314</span><span id="line-314"> }</span> +<span class="source-line-no">315</span><span id="line-315"> }</span> +<span class="source-line-no">316</span><span id="line-316"> }</span> +<span class="source-line-no">317</span><span id="line-317"></span> +<span class="source-line-no">318</span><span id="line-318"> /**</span> +<span class="source-line-no">319</span><span id="line-319"> * Gets the number of bytes, which have been read by the stream.</span> +<span class="source-line-no">320</span><span id="line-320"> *</span> +<span class="source-line-no">321</span><span id="line-321"> * @return Number of bytes, which have been read so far.</span> +<span class="source-line-no">322</span><span id="line-322"> */</span> +<span class="source-line-no">323</span><span id="line-323"> public long getBytesRead() {</span> +<span class="source-line-no">324</span><span id="line-324"> return total;</span> +<span class="source-line-no">325</span><span id="line-325"> }</span> +<span class="source-line-no">326</span><span id="line-326"></span> +<span class="source-line-no">327</span><span id="line-327"> /**</span> +<span class="source-line-no">328</span><span id="line-328"> * Tests whether this instance is closed.</span> +<span class="source-line-no">329</span><span id="line-329"> *</span> +<span class="source-line-no">330</span><span id="line-330"> * @return whether this instance is closed.</span> +<span class="source-line-no">331</span><span id="line-331"> */</span> +<span class="source-line-no">332</span><span id="line-332"> public boolean isClosed() {</span> +<span class="source-line-no">333</span><span id="line-333"> return closed;</span> +<span class="source-line-no">334</span><span id="line-334"> }</span> +<span class="source-line-no">335</span><span id="line-335"></span> +<span class="source-line-no">336</span><span id="line-336"> /**</span> +<span class="source-line-no">337</span><span id="line-337"> * Attempts to read more data.</span> +<span class="source-line-no">338</span><span id="line-338"> *</span> +<span class="source-line-no">339</span><span id="line-339"> * @return Number of available bytes</span> +<span class="source-line-no">340</span><span id="line-340"> * @throws IOException An I/O error occurred.</span> +<span class="source-line-no">341</span><span id="line-341"> */</span> +<span class="source-line-no">342</span><span id="line-342"> private int makeAvailable() throws IOException {</span> +<span class="source-line-no">343</span><span id="line-343"> if (pos != -1) {</span> +<span class="source-line-no">344</span><span id="line-344"> return 0;</span> +<span class="source-line-no">345</span><span id="line-345"> }</span> <span class="source-line-no">346</span><span id="line-346"></span> -<span class="source-line-no">347</span><span id="line-347"> findSeparator();</span> -<span class="source-line-no">348</span><span id="line-348"> final var av = available();</span> -<span class="source-line-no">349</span><span id="line-349"></span> -<span class="source-line-no">350</span><span id="line-350"> if (av > 0 || pos != -1) {</span> -<span class="source-line-no">351</span><span id="line-351"> return av;</span> -<span class="source-line-no">352</span><span id="line-352"> }</span> -<span class="source-line-no">353</span><span id="line-353"> }</span> -<span class="source-line-no">354</span><span id="line-354"> }</span> -<span class="source-line-no">355</span><span id="line-355"></span> -<span class="source-line-no">356</span><span id="line-356"> /**</span> -<span class="source-line-no">357</span><span id="line-357"> * Reads the next byte in the stream.</span> -<span class="source-line-no">358</span><span id="line-358"> *</span> -<span class="source-line-no">359</span><span id="line-359"> * @return The next byte in the stream, as a non-negative integer, or -1 for EOF.</span> -<span class="source-line-no">360</span><span id="line-360"> * @throws IOException An I/O error occurred.</span> -<span class="source-line-no">361</span><span id="line-361"> */</span> -<span class="source-line-no">362</span><span id="line-362"> @Override</span> -<span class="source-line-no">363</span><span id="line-363"> public int read() throws IOException {</span> -<span class="source-line-no">364</span><span id="line-364"> checkOpen();</span> -<span class="source-line-no">365</span><span id="line-365"> if (available() == 0 && makeAvailable() == 0) {</span> -<span class="source-line-no">366</span><span id="line-366"> return -1;</span> -<span class="source-line-no">367</span><span id="line-367"> }</span> -<span class="source-line-no">368</span><span id="line-368"> ++total;</span> -<span class="source-line-no">369</span><span id="line-369"> final int b = buffer[head++];</span> -<span class="source-line-no">370</span><span id="line-370"> if (b >= 0) {</span> -<span class="source-line-no">371</span><span id="line-371"> return b;</span> -<span class="source-line-no">372</span><span id="line-372"> }</span> -<span class="source-line-no">373</span><span id="line-373"> return b + BYTE_POSITIVE_OFFSET;</span> -<span class="source-line-no">374</span><span id="line-374"> }</span> -<span class="source-line-no">375</span><span id="line-375"></span> -<span class="source-line-no">376</span><span id="line-376"> /**</span> -<span class="source-line-no">377</span><span id="line-377"> * Reads bytes into the given buffer.</span> -<span class="source-line-no">378</span><span id="line-378"> *</span> -<span class="source-line-no">379</span><span id="line-379"> * @param b The destination buffer, where to write to.</span> -<span class="source-line-no">380</span><span id="line-380"> * @param off Offset of the first byte in the buffer.</span> -<span class="source-line-no">381</span><span id="line-381"> * @param len Maximum number of bytes to read.</span> -<span class="source-line-no">382</span><span id="line-382"> * @return Number of bytes, which have been actually read, or -1 for EOF.</span> -<span class="source-line-no">383</span><span id="line-383"> * @throws IOException An I/O error occurred.</span> -<span class="source-line-no">384</span><span id="line-384"> */</span> -<span class="source-line-no">385</span><span id="line-385"> @Override</span> -<span class="source-line-no">386</span><span id="line-386"> public int read(final byte[] b, final int off, final int len) throws IOException {</span> -<span class="source-line-no">387</span><span id="line-387"> checkOpen();</span> -<span class="source-line-no">388</span><span id="line-388"> if (len == 0) {</span> -<span class="source-line-no">389</span><span id="line-389"> return 0;</span> -<span class="source-line-no">390</span><span id="line-390"> }</span> -<span class="source-line-no">391</span><span id="line-391"> var res = available();</span> -<span class="source-line-no">392</span><span id="line-392"> if (res == 0) {</span> -<span class="source-line-no">393</span><span id="line-393"> res = makeAvailable();</span> -<span class="source-line-no">394</span><span id="line-394"> if (res == 0) {</span> -<span class="source-line-no">395</span><span id="line-395"> return -1;</span> -<span class="source-line-no">396</span><span id="line-396"> }</span> -<span class="source-line-no">397</span><span id="line-397"> }</span> -<span class="source-line-no">398</span><span id="line-398"> res = Math.min(res, len);</span> -<span class="source-line-no">399</span><span id="line-399"> System.arraycopy(buffer, head, b, off, res);</span> -<span class="source-line-no">400</span><span id="line-400"> head += res;</span> -<span class="source-line-no">401</span><span id="line-401"> total += res;</span> -<span class="source-line-no">402</span><span id="line-402"> return res;</span> -<span class="source-line-no">403</span><span id="line-403"> }</span> -<span class="source-line-no">404</span><span id="line-404"></span> -<span class="source-line-no">405</span><span id="line-405"> /**</span> -<span class="source-line-no">406</span><span id="line-406"> * Skips the given number of bytes.</span> -<span class="source-line-no">407</span><span id="line-407"> *</span> -<span class="source-line-no">408</span><span id="line-408"> * @param bytes Number of bytes to skip.</span> -<span class="source-line-no">409</span><span id="line-409"> * @return The number of bytes, which have actually been skipped.</span> -<span class="source-line-no">410</span><span id="line-410"> * @throws IOException An I/O error occurred.</span> -<span class="source-line-no">411</span><span id="line-411"> */</span> -<span class="source-line-no">412</span><span id="line-412"> @Override</span> -<span class="source-line-no">413</span><span id="line-413"> public long skip(final long bytes) throws IOException {</span> -<span class="source-line-no">414</span><span id="line-414"> checkOpen();</span> -<span class="source-line-no">415</span><span id="line-415"> var available = available();</span> -<span class="source-line-no">416</span><span id="line-416"> if (available == 0) {</span> -<span class="source-line-no">417</span><span id="line-417"> available = makeAvailable();</span> -<span class="source-line-no">418</span><span id="line-418"> if (available == 0) {</span> -<span class="source-line-no">419</span><span id="line-419"> return 0;</span> -<span class="source-line-no">420</span><span id="line-420"> }</span> -<span class="source-line-no">421</span><span id="line-421"> }</span> -<span class="source-line-no">422</span><span id="line-422"> // Fix "Implicit narrowing conversion in compound assignment"</span> -<span class="source-line-no">423</span><span id="line-423"> // https://github.com/apache/commons-fileupload/security/code-scanning/118</span> -<span class="source-line-no">424</span><span id="line-424"> // Math.min always returns an int because available is an int.</span> -<span class="source-line-no">425</span><span id="line-425"> final var res = Math.toIntExact(Math.min(available, bytes));</span> -<span class="source-line-no">426</span><span id="line-426"> head += res;</span> -<span class="source-line-no">427</span><span id="line-427"> return res;</span> -<span class="source-line-no">428</span><span id="line-428"> }</span> -<span class="source-line-no">429</span><span id="line-429"></span> -<span class="source-line-no">430</span><span id="line-430"> }</span> -<span class="source-line-no">431</span><span id="line-431"></span> -<span class="source-line-no">432</span><span id="line-432"> /**</span> -<span class="source-line-no">433</span><span id="line-433"> * Signals that the input stream fails to follow the required syntax.</span> -<span class="source-line-no">434</span><span id="line-434"> */</span> -<span class="source-line-no">435</span><span id="line-435"> public static class MalformedStreamException extends FileUploadException {</span> -<span class="source-line-no">436</span><span id="line-436"></span> -<span class="source-line-no">437</span><span id="line-437"> /**</span> -<span class="source-line-no">438</span><span id="line-438"> * The UID to use when serializing this instance.</span> -<span class="source-line-no">439</span><span id="line-439"> */</span> -<span class="source-line-no">440</span><span id="line-440"> private static final long serialVersionUID = 2;</span> -<span class="source-line-no">441</span><span id="line-441"></span> -<span class="source-line-no">442</span><span id="line-442"> /**</span> -<span class="source-line-no">443</span><span id="line-443"> * Constructs an {@code MalformedStreamException} with the specified detail message.</span> -<span class="source-line-no">444</span><span id="line-444"> *</span> -<span class="source-line-no">445</span><span id="line-445"> * @param message The detail message.</span> -<span class="source-line-no">446</span><span id="line-446"> */</span> -<span class="source-line-no">447</span><span id="line-447"> public MalformedStreamException(final String message) {</span> -<span class="source-line-no">448</span><span id="line-448"> super(message);</span> -<span class="source-line-no">449</span><span id="line-449"> }</span> -<span class="source-line-no">450</span><span id="line-450"></span> -<span class="source-line-no">451</span><span id="line-451"> /**</span> -<span class="source-line-no">452</span><span id="line-452"> * Constructs an {@code MalformedStreamException} with the specified detail message.</span> -<span class="source-line-no">453</span><span id="line-453"> *</span> -<span class="source-line-no">454</span><span id="line-454"> * @param message The detail message.</span> -<span class="source-line-no">455</span><span id="line-455"> * @param cause The cause (which is saved for later retrieval by the {@link #getCause()} method). (A null value is permitted, and indicates that the</span> -<span class="source-line-no">456</span><span id="line-456"> * cause is nonexistent or unknown.)</span> -<span class="source-line-no">457</span><span id="line-457"> */</span> -<span class="source-line-no">458</span><span id="line-458"> public MalformedStreamException(final String message, final Throwable cause) {</span> -<span class="source-line-no">459</span><span id="line-459"> super(message, cause);</span> -<span class="source-line-no">460</span><span id="line-460"> }</span> -<span class="source-line-no">461</span><span id="line-461"></span> -<span class="source-line-no">462</span><span id="line-462"> }</span> +<span class="source-line-no">347</span><span id="line-347"> // Move the data to the beginning of the buffer.</span> +<span class="source-line-no">348</span><span id="line-348"> total += tail - head - pad;</span> +<span class="source-line-no">349</span><span id="line-349"> System.arraycopy(buffer, tail - pad, buffer, 0, pad);</span> +<span class="source-line-no">350</span><span id="line-350"></span> +<span class="source-line-no">351</span><span id="line-351"> // Refill buffer with new data.</span> +<span class="source-line-no">352</span><span id="line-352"> head = 0;</span> +<span class="source-line-no">353</span><span id="line-353"> tail = pad;</span> +<span class="source-line-no">354</span><span id="line-354"></span> +<span class="source-line-no">355</span><span id="line-355"> for (;;) {</span> +<span class="source-line-no">356</span><span id="line-356"> final var bytesRead = input.read(buffer, tail, bufSize - tail);</span> +<span class="source-line-no">357</span><span id="line-357"> if (bytesRead == -1) {</span> +<span class="source-line-no">358</span><span id="line-358"> // The last pad amount is left in the buffer.</span> +<span class="source-line-no">359</span><span id="line-359"> // Boundary can't be in there so signal an error</span> +<span class="source-line-no">360</span><span id="line-360"> // condition.</span> +<span class="source-line-no">361</span><span id="line-361"> final var msg = "Stream ended unexpectedly";</span> +<span class="source-line-no">362</span><span id="line-362"> throw new MalformedStreamException(msg);</span> +<span class="source-line-no">363</span><span id="line-363"> }</span> +<span class="source-line-no">364</span><span id="line-364"> if (notifier != null) {</span> +<span class="source-line-no">365</span><span id="line-365"> notifier.noteBytesRead(bytesRead);</span> +<span class="source-line-no">366</span><span id="line-366"> }</span> +<span class="source-line-no">367</span><span id="line-367"> tail += bytesRead;</span> +<span class="source-line-no">368</span><span id="line-368"></span> +<span class="source-line-no">369</span><span id="line-369"> findSeparator();</span> +<span class="source-line-no">370</span><span id="line-370"> final var av = available();</span> +<span class="source-line-no">371</span><span id="line-371"></span> +<span class="source-line-no">372</span><span id="line-372"> if (av > 0 || pos != -1) {</span> +<span class="source-line-no">373</span><span id="line-373"> return av;</span> +<span class="source-line-no">374</span><span id="line-374"> }</span> +<span class="source-line-no">375</span><span id="line-375"> }</span> +<span class="source-line-no">376</span><span id="line-376"> }</span> +<span class="source-line-no">377</span><span id="line-377"></span> +<span class="source-line-no">378</span><span id="line-378"> /**</span> +<span class="source-line-no">379</span><span id="line-379"> * Reads the next byte in the stream.</span> +<span class="source-line-no">380</span><span id="line-380"> *</span> +<span class="source-line-no">381</span><span id="line-381"> * @return The next byte in the stream, as a non-negative integer, or -1 for EOF.</span> +<span class="source-line-no">382</span><span id="line-382"> * @throws IOException An I/O error occurred.</span> +<span class="source-line-no">383</span><span id="line-383"> */</span> +<span class="source-line-no">384</span><span id="line-384"> @Override</span> +<span class="source-line-no">385</span><span id="line-385"> public int read() throws IOException {</span> +<span class="source-line-no">386</span><span id="line-386"> checkOpen();</span> +<span class="source-line-no">387</span><span id="line-387"> if (available() == 0 && makeAvailable() == 0) {</span> +<span class="source-line-no">388</span><span id="line-388"> return -1;</span> +<span class="source-line-no">389</span><span id="line-389"> }</span> +<span class="source-line-no">390</span><span id="line-390"> ++total;</span> +<span class="source-line-no">391</span><span id="line-391"> final int b = buffer[head++];</span> +<span class="source-line-no">392</span><span id="line-392"> if (b >= 0) {</span> +<span class="source-line-no">393</span><span id="line-393"> return b;</span> +<span class="source-line-no">394</span><span id="line-394"> }</span> +<span class="source-line-no">395</span><span id="line-395"> return b + BYTE_POSITIVE_OFFSET;</span> +<span class="source-line-no">396</span><span id="line-396"> }</span> +<span class="source-line-no">397</span><span id="line-397"></span> +<span class="source-line-no">398</span><span id="line-398"> /**</span> +<span class="source-line-no">399</span><span id="line-399"> * Reads bytes into the given buffer.</span> +<span class="source-line-no">400</span><span id="line-400"> *</span> +<span class="source-line-no">401</span><span id="line-401"> * @param b The destination buffer, where to write to.</span> +<span class="source-line-no">402</span><span id="line-402"> * @param off Offset of the first byte in the buffer.</span> +<span class="source-line-no">403</span><span id="line-403"> * @param len Maximum number of bytes to read.</span> +<span class="source-line-no">404</span><span id="line-404"> * @return Number of bytes, which have been actually read, or -1 for EOF.</span> +<span class="source-line-no">405</span><span id="line-405"> * @throws IOException An I/O error occurred.</span> +<span class="source-line-no">406</span><span id="line-406"> */</span> +<span class="source-line-no">407</span><span id="line-407"> @Override</span> +<span class="source-line-no">408</span><span id="line-408"> public int read(final byte[] b, final int off, final int len) throws IOException {</span> +<span class="source-line-no">409</span><span id="line-409"> checkOpen();</span> +<span class="source-line-no">410</span><span id="line-410"> if (len == 0) {</span> +<span class="source-line-no">411</span><span id="line-411"> return 0;</span> +<span class="source-line-no">412</span><span id="line-412"> }</span> +<span class="source-line-no">413</span><span id="line-413"> var res = available();</span> +<span class="source-line-no">414</span><span id="line-414"> if (res == 0) {</span> +<span class="source-line-no">415</span><span id="line-415"> res = makeAvailable();</span> +<span class="source-line-no">416</span><span id="line-416"> if (res == 0) {</span> +<span class="source-line-no">417</span><span id="line-417"> return -1;</span> +<span class="source-line-no">418</span><span id="line-418"> }</span> +<span class="source-line-no">419</span><span id="line-419"> }</span> +<span class="source-line-no">420</span><span id="line-420"> res = Math.min(res, len);</span> +<span class="source-line-no">421</span><span id="line-421"> System.arraycopy(buffer, head, b, off, res);</span> +<span class="source-line-no">422</span><span id="line-422"> head += res;</span> +<span class="source-line-no">423</span><span id="line-423"> total += res;</span> +<span class="source-line-no">424</span><span id="line-424"> return res;</span> +<span class="source-line-no">425</span><span id="line-425"> }</span> +<span class="source-line-no">426</span><span id="line-426"></span> +<span class="source-line-no">427</span><span id="line-427"> /**</span> +<span class="source-line-no">428</span><span id="line-428"> * Skips the given number of bytes.</span> +<span class="source-line-no">429</span><span id="line-429"> *</span> +<span class="source-line-no">430</span><span id="line-430"> * @param bytes Number of bytes to skip.</span> +<span class="source-line-no">431</span><span id="line-431"> * @return The number of bytes, which have actually been skipped.</span> +<span class="source-line-no">432</span><span id="line-432"> * @throws IOException An I/O error occurred.</span> +<span class="source-line-no">433</span><span id="line-433"> */</span> +<span class="source-line-no">434</span><span id="line-434"> @Override</span> +<span class="source-line-no">435</span><span id="line-435"> public long skip(final long bytes) throws IOException {</span> +<span class="source-line-no">436</span><span id="line-436"> checkOpen();</span> +<span class="source-line-no">437</span><span id="line-437"> var available = available();</span> +<span class="source-line-no">438</span><span id="line-438"> if (available == 0) {</span> +<span class="source-line-no">439</span><span id="line-439"> available = makeAvailable();</span> +<span class="source-line-no">440</span><span id="line-440"> if (available == 0) {</span> +<span class="source-line-no">441</span><span id="line-441"> return 0;</span> +<span class="source-line-no">442</span><span id="line-442"> }</span> +<span class="source-line-no">443</span><span id="line-443"> }</span> +<span class="source-line-no">444</span><span id="line-444"> // Fix "Implicit narrowing conversion in compound assignment"</span> +<span class="source-line-no">445</span><span id="line-445"> // https://github.com/apache/commons-fileupload/security/code-scanning/118</span> +<span class="source-line-no">446</span><span id="line-446"> // Math.min always returns an int because available is an int.</span> +<span class="source-line-no">447</span><span id="line-447"> final var res = Math.toIntExact(Math.min(available, bytes));</span> +<span class="source-line-no">448</span><span id="line-448"> head += res;</span> +<span class="source-line-no">449</span><span id="line-449"> return res;</span> +<span class="source-line-no">450</span><span id="line-450"> }</span> +<span class="source-line-no">451</span><span id="line-451"></span> +<span class="source-line-no">452</span><span id="line-452"> }</span> +<span class="source-line-no">453</span><span id="line-453"></span> +<span class="source-line-no">454</span><span id="line-454"> /**</span> +<span class="source-line-no">455</span><span id="line-455"> * Signals that the input stream fails to follow the required syntax.</span> +<span class="source-line-no">456</span><span id="line-456"> */</span> +<span class="source-line-no">457</span><span id="line-457"> public static class MalformedStreamException extends FileUploadException {</span> +<span class="source-line-no">458</span><span id="line-458"></span> +<span class="source-line-no">459</span><span id="line-459"> /**</span> +<span class="source-line-no">460</span><span id="line-460"> * The UID to use when serializing this instance.</span> +<span class="source-line-no">461</span><span id="line-461"> */</span> +<span class="source-line-no">462</span><span id="line-462"> private static final long serialVersionUID = 2;</span> <span class="source-line-no">463</span><span id="line-463"></span> -<span class="source-line-no">464</span><span id="line-464"> /**</span> -<span class="source-line-no">465</span><span id="line-465"> * Internal class, which is used to invoke the {@link ProgressListener}.</span> -<span class="source-line-no">466</span><span id="line-466"> */</span> -<span class="source-line-no">467</span><span id="line-467"> public static class ProgressNotifier {</span> -<span class="source-line-no">468</span><span id="line-468"></span> -<span class="source-line-no">469</span><span id="line-469"> /**</span> -<span class="source-line-no">470</span><span id="line-470"> * The listener to invoke.</span> -<span class="source-line-no">471</span><span id="line-471"> */</span> -<span class="source-line-no">472</span><span id="line-472"> private final ProgressListener progressListener;</span> -<span class="source-line-no">473</span><span id="line-473"></span> -<span class="source-line-no">474</span><span id="line-474"> /**</span> -<span class="source-line-no">475</span><span id="line-475"> * Number of expected bytes, if known, or -1.</span> -<span class="source-line-no">476</span><span id="line-476"> */</span> -<span class="source-line-no">477</span><span id="line-477"> private final long contentLength;</span> -<span class="source-line-no">478</span><span id="line-478"></span> -<span class="source-line-no">479</span><span id="line-479"> /**</span> -<span class="source-line-no">480</span><span id="line-480"> * Number of bytes, which have been read so far.</span> -<span class="source-line-no">481</span><span id="line-481"> */</span> -<span class="source-line-no">482</span><span id="line-482"> private long bytesRead;</span> +<span class="source-line-no">464</span><span id="line-464"> /**</span> +<span class="source-line-no">465</span><span id="line-465"> * Constructs an {@code MalformedStreamException} with the specified detail message.</span> +<span class="source-line-no">466</span><span id="line-466"> *</span> +<span class="source-line-no">467</span><span id="line-467"> * @param message The detail message.</span> +<span class="source-line-no">468</span><span id="line-468"> */</span> +<span class="source-line-no">469</span><span id="line-469"> public MalformedStreamException(final String message) {</span> +<span class="source-line-no">470</span><span id="line-470"> super(message);</span> +<span class="source-line-no">471</span><span id="line-471"> }</span> +<span class="source-line-no">472</span><span id="line-472"></span> +<span class="source-line-no">473</span><span id="line-473"> /**</span> +<span class="source-line-no">474</span><span id="line-474"> * Constructs an {@code MalformedStreamException} with the specified detail message.</span> +<span class="source-line-no">475</span><span id="line-475"> *</span> +<span class="source-line-no">476</span><span id="line-476"> * @param message The detail message.</span> +<span class="source-line-no">477</span><span id="line-477"> * @param cause The cause (which is saved for later retrieval by the {@link #getCause()} method). (A null value is permitted, and indicates that the</span> +<span class="source-line-no">478</span><span id="line-478"> * cause is nonexistent or unknown.)</span> +<span class="source-line-no">479</span><span id="line-479"> */</span> +<span class="source-line-no">480</span><span id="line-480"> public MalformedStreamException(final String message, final Throwable cause) {</span> +<span class="source-line-no">481</span><span id="line-481"> super(message, cause);</span> +<span class="source-line-no">482</span><span id="line-482"> }</span> <span class="source-line-no">483</span><span id="line-483"></span> -<span class="source-line-no">484</span><span id="line-484"> /**</span> -<span class="source-line-no">485</span><span id="line-485"> * Number of items, which have been read so far.</span> -<span class="source-line-no">486</span><span id="line-486"> */</span> -<span class="source-line-no">487</span><span id="line-487"> private int items;</span> -<span class="source-line-no">488</span><span id="line-488"></span> -<span class="source-line-no">489</span><span id="line-489"> /**</span> -<span class="source-line-no">490</span><span id="line-490"> * Creates a new instance with the given listener and content length.</span> -<span class="source-line-no">491</span><span id="line-491"> *</span> -<span class="source-line-no">492</span><span id="line-492"> * @param progressListener The listener to invoke.</span> -<span class="source-line-no">493</span><span id="line-493"> * @param contentLength The expected content length.</span> -<span class="source-line-no">494</span><span id="line-494"> */</span> -<span class="source-line-no">495</span><span id="line-495"> public ProgressNotifier(final ProgressListener progressListener, final long contentLength) {</span> -<span class="source-line-no">496</span><span id="line-496"> this.progressListener = progressListener != null ? progressListener : ProgressListener.NOP;</span> -<span class="source-line-no">497</span><span id="line-497"> this.contentLength = contentLength;</span> -<span class="source-line-no">498</span><span id="line-498"> }</span> -<span class="source-line-no">499</span><span id="line-499"></span> -<span class="source-line-no">500</span><span id="line-500"> /**</span> -<span class="source-line-no">501</span><span id="line-501"> * Called to indicate that bytes have been read.</span> -<span class="source-line-no">502</span><span id="line-502"> *</span> -<span class="source-line-no">503</span><span id="line-503"> * @param byteCount Number of bytes, which have been read.</span> -<span class="source-line-no">504</span><span id="line-504"> */</span> -<span class="source-line-no">505</span><span id="line-505"> void noteBytesRead(final int byteCount) {</span> -<span class="source-line-no">506</span><span id="line-506"> //</span> -<span class="source-line-no">507</span><span id="line-507"> // Indicates, that the given number of bytes have been read from the input stream.</span> -<span class="source-line-no">508</span><span id="line-508"> //</span> -<span class="source-line-no">509</span><span id="line-509"> bytesRead += byteCount;</span> -<span class="source-line-no">510</span><span id="line-510"> notifyListener();</span> -<span class="source-line-no">511</span><span id="line-511"> }</span> -<span class="source-line-no">512</span><span id="line-512"></span> -<span class="source-line-no">513</span><span id="line-513"> /**</span> -<span class="source-line-no">514</span><span id="line-514"> * Called to indicate, that a new file item has been detected.</span> -<span class="source-line-no">515</span><span id="line-515"> */</span> -<span class="source-line-no">516</span><span id="line-516"> public void noteItem() {</span> -<span class="source-line-no">517</span><span id="line-517"> ++items;</span> -<span class="source-line-no">518</span><span id="line-518"> notifyListener();</span> -<span class="source-line-no">519</span><span id="line-519"> }</span> -<span class="source-line-no">520</span><span id="line-520"></span> -<span class="source-line-no">521</span><span id="line-521"> /**</span> -<span class="source-line-no">522</span><span id="line-522"> * Called for notifying the listener.</span> -<span class="source-line-no">523</span><span id="line-523"> */</span> -<span class="source-line-no">524</span><span id="line-524"> private void notifyListener() {</span> -<span class="source-line-no">525</span><span id="line-525"> progressListener.update(bytesRead, contentLength, items);</span> -<span class="source-line-no">526</span><span id="line-526"> }</span> -<span class="source-line-no">527</span><span id="line-527"></span> -<span class="source-line-no">528</span><span id="line-528"> }</span> -<span class="source-line-no">529</span><span id="line-529"></span> -<span class="source-line-no">530</span><span id="line-530"> /**</span> -<span class="source-line-no">531</span><span id="line-531"> * The Carriage Return ASCII character value.</span> -<span class="source-line-no">532</span><span id="line-532"> */</span> -<span class="source-line-no">533</span><span id="line-533"> public static final byte CR = 0x0D;</span> +<span class="source-line-no">484</span><span id="line-484"> }</span> +<span class="source-line-no">485</span><span id="line-485"></span> +<span class="source-line-no">486</span><span id="line-486"> /**</span> +<span class="source-line-no">487</span><span id="line-487"> * Internal class, which is used to invoke the {@link ProgressListener}.</span> +<span class="source-line-no">488</span><span id="line-488"> */</span> +<span class="source-line-no">489</span><span id="line-489"> public static class ProgressNotifier {</span> +<span class="source-line-no">490</span><span id="line-490"></span> +<span class="source-line-no">491</span><span id="line-491"> /**</span> +<span class="source-line-no">492</span><span id="line-492"> * The listener to invoke.</span> +<span class="source-line-no">493</span><span id="line-493"> */</span> +<span class="source-line-no">494</span><span id="line-494"> private final ProgressListener progressListener;</span> +<span class="source-line-no">495</span><span id="line-495"></span> +<span class="source-line-no">496</span><span id="line-496"> /**</span> +<span class="source-line-no">497</span><span id="line-497"> * Number of expected bytes, if known, or -1.</span> +<span class="source-line-no">498</span><span id="line-498"> */</span> +<span class="source-line-no">499</span><span id="line-499"> private final long contentLength;</span> +<span class="source-line-no">500</span><span id="line-500"></span> +<span class="source-line-no">501</span><span id="line-501"> /**</span> +<span class="source-line-no">502</span><span id="line-502"> * Number of bytes, which have been read so far.</span> +<span class="source-line-no">503</span><span id="line-503"> */</span> +<span class="source-line-no">504</span><span id="line-504"> private long bytesRead;</span> +<span class="source-line-no">505</span><span id="line-505"></span> +<span class="source-line-no">506</span><span id="line-506"> /**</span> +<span class="source-line-no">507</span><span id="line-507"> * Number of items, which have been read so far.</span> +<span class="source-line-no">508</span><span id="line-508"> */</span> +<span class="source-line-no">509</span><span id="line-509"> private int items;</span> +<span class="source-line-no">510</span><span id="line-510"></span> +<span class="source-line-no">511</span><span id="line-511"> /**</span> +<span class="source-line-no">512</span><span id="line-512"> * Creates a new instance with the given listener and content length.</span> +<span class="source-line-no">513</span><span id="line-513"> *</span> +<span class="source-line-no">514</span><span id="line-514"> * @param progressListener The listener to invoke.</span> +<span class="source-line-no">515</span><span id="line-515"> * @param contentLength The expected content length.</span> +<span class="source-line-no">516</span><span id="line-516"> */</span> +<span class="source-line-no">517</span><span id="line-517"> public ProgressNotifier(final ProgressListener progressListener, final long contentLength) {</span> +<span class="source-line-no">518</span><span id="line-518"> this.progressListener = progressListener != null ? progressListener : ProgressListener.NOP;</span> +<span class="source-line-no">519</span><span id="line-519"> this.contentLength = contentLength;</span> +<span class="source-line-no">520</span><span id="line-520"> }</span> +<span class="source-line-no">521</span><span id="line-521"></span> +<span class="source-line-no">522</span><span id="line-522"> /**</span> +<span class="source-line-no">523</span><span id="line-523"> * Called to indicate that bytes have been read.</span> +<span class="source-line-no">524</span><span id="line-524"> *</span> +<span class="source-line-no">525</span><span id="line-525"> * @param byteCount Number of bytes, which have been read.</span> +<span class="source-line-no">526</span><span id="line-526"> */</span> +<span class="source-line-no">527</span><span id="line-527"> void noteBytesRead(final int byteCount) {</span> +<span class="source-line-no">528</span><span id="line-528"> //</span> +<span class="source-line-no">529</span><span id="line-529"> // Indicates, that the given number of bytes have been read from the input stream.</span> +<span class="source-line-no">530</span><span id="line-530"> //</span> +<span class="source-line-no">531</span><span id="line-531"> bytesRead += byteCount;</span> +<span class="source-line-no">532</span><span id="line-532"> notifyListener();</span> +<span class="source-line-no">533</span><span id="line-533"> }</span> <span class="source-line-no">534</span><span id="line-534"></span> -<span class="source-line-no">535</span><span id="line-535"> /**</span> -<span class="source-line-no">536</span><span id="line-536"> * The Line Feed ASCII character value.</span> -<span class="source-line-no">537</span><span id="line-537"> */</span> -<span class="source-line-no">538</span><span id="line-538"> public static final byte LF = 0x0A;</span> -<span class="source-line-no">539</span><span id="line-539"></span> -<span class="source-line-no">540</span><span id="line-540"> /**</span> -<span class="source-line-no">541</span><span id="line-541"> * The dash (-) ASCII character value.</span> -<span class="source-line-no">542</span><span id="line-542"> */</span> -<span class="source-line-no">543</span><span id="line-543"> public static final byte DASH = 0x2D;</span> -<span class="source-line-no">544</span><span id="line-544"></span> -<span class="source-line-no">545</span><span id="line-545"> /**</span> -<span class="source-line-no">546</span><span id="line-546"> * The maximum length of {@code header-part} that will be processed (10 kilobytes = 10240 bytes.).</span> -<span class="source-line-no">547</span><span id="line-547"> */</span> -<span class="source-line-no">548</span><span id="line-548"> public static final int HEADER_PART_SIZE_MAX = 10_240;</span> +<span class="source-line-no">535</span><span id="line-535"> /**</span> +<span class="source-line-no">536</span><span id="line-536"> * Called to indicate, that a new file item has been detected.</span> +<span class="source-line-no">537</span><span id="line-537"> */</span> +<span class="source-line-no">538</span><span id="line-538"> public void noteItem() {</span> +<span class="source-line-no">539</span><span id="line-539"> ++items;</span> +<span class="source-line-no">540</span><span id="line-540"> notifyListener();</span> +<span class="source-line-no">541</span><span id="line-541"> }</span> +<span class="source-line-no">542</span><span id="line-542"></span> +<span class="source-line-no">543</span><span id="line-543"> /**</span> +<span class="source-line-no">544</span><span id="line-544"> * Called for notifying the listener.</span> +<span class="source-line-no">545</span><span id="line-545"> */</span> +<span class="source-line-no">546</span><span id="line-546"> private void notifyListener() {</span> +<span class="source-line-no">547</span><span id="line-547"> progressListener.update(bytesRead, contentLength, items);</span> +<span class="source-line-no">548</span><span id="line-548"> }</span> <span class="source-line-no">549</span><span id="line-549"></span> -<span class="source-line-no">550</span><span id="line-550"> /**</span> -<span class="source-line-no">551</span><span id="line-551"> * The default length of the buffer used for processing a request.</span> -<span class="source-line-no">552</span><span id="line-552"> */</span> -<span class="source-line-no">553</span><span id="line-553"> static final int DEFAULT_BUFSIZE = 4096;</span> -<span class="source-line-no">554</span><span id="line-554"></span> -<span class="source-line-no">555</span><span id="line-555"> /**</span> -<span class="source-line-no">556</span><span id="line-556"> * A byte sequence that marks the end of {@code header-part} ({@code CRLFCRLF}).</span> -<span class="source-line-no">557</span><span id="line-557"> */</span> -<span class="source-line-no">558</span><span id="line-558"> static final byte[] HEADER_SEPARATOR = { CR, LF, CR, LF };</span> -<span class="source-line-no">559</span><span id="line-559"></span> -<span class="source-line-no">560</span><span id="line-560"> /**</span> -<span class="source-line-no">561</span><span id="line-561"> * A byte sequence that that follows a delimiter that will be followed by an encapsulation ({@code CRLF}).</span> -<span class="source-line-no">562</span><span id="line-562"> */</span> -<span class="source-line-no">563</span><span id="line-563"> static final byte[] FIELD_SEPARATOR = { CR, LF };</span> -<span class="source-line-no">564</span><span id="line-564"></span> -<span class="source-line-no">565</span><span id="line-565"> /**</span> -<span class="source-line-no">566</span><span id="line-566"> * A byte sequence that that follows a delimiter of the last encapsulation in the stream ({@code --}).</span> -<span class="source-line-no">567</span><span id="line-567"> */</span> -<span class="source-line-no">568</span><span id="line-568"> static final byte[] STREAM_TERMINATOR = { DASH, DASH };</span> -<span class="source-line-no">569</span><span id="line-569"></span> -<span class="source-line-no">570</span><span id="line-570"> /**</span> -<span class="source-line-no">571</span><span id="line-571"> * A byte sequence that precedes a boundary ({@code CRLF--}).</span> -<span class="source-line-no">572</span><span id="line-572"> */</span> -<span class="source-line-no">573</span><span id="line-573"> static final byte[] BOUNDARY_PREFIX = { CR, LF, DASH, DASH };</span> -<span class="source-line-no">574</span><span id="line-574"></span> -<span class="source-line-no">575</span><span id="line-575"> /**</span> -<span class="source-line-no">576</span><span id="line-576"> * Compares {@code count} first bytes in the arrays {@code a} and {@code b}.</span> -<span class="source-line-no">577</span><span id="line-577"> *</span> -<span class="source-line-no">578</span><span id="line-578"> * @param a The first array to compare.</span> -<span class="source-line-no">579</span><span id="line-579"> * @param b The second array to compare.</span> -<span class="source-line-no">580</span><span id="line-580"> * @param count How many bytes should be compared.</span> -<span class="source-line-no">581</span><span id="line-581"> * @return {@code true} if {@code count} first bytes in arrays {@code a} and {@code b} are equal.</span> -<span class="source-line-no">582</span><span id="line-582"> */</span> -<span class="source-line-no">583</span><span id="line-583"> static boolean arrayEquals(final byte[] a, final byte[] b, final int count) {</span> -<span class="source-line-no">584</span><span id="line-584"> for (var i = 0; i < count; i++) {</span> -<span class="source-line-no">585</span><span id="line-585"> if (a[i] != b[i]) {</span> -<span class="source-line-no">586</span><span id="line-586"> return false;</span> -<span class="source-line-no">587</span><span id="line-587"> }</span> -<span class="source-line-no">588</span><span id="line-588"> }</span> -<span class="source-line-no">589</span><span id="line-589"> return true;</span> -<span class="source-line-no">590</span><span id="line-590"> }</span> -<span class="source-line-no">591</span><span id="line-591"></span> -<span class="source-line-no">592</span><span id="line-592"> /**</span> -<span class="source-line-no">593</span><span id="line-593"> * Constructs a new {@link Builder}.</span> -<span class="source-line-no">594</span><span id="line-594"> *</span> -<span class="source-line-no">595</span><span id="line-595"> * @return a new {@link Builder}.</span>
[... 858 lines stripped ...]