<!--
   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.
-->

                          Apache Commons-FileUpload
                                Version 1.3
                               Release Notes


INTRODUCTION
============

This is a maintenance release, new projects are encouraged to
use this release of FileUpload.
There is no urgency for existing projects to upgrade.

IMPORTANT NOTES
================

 * SECURITY - CVE-2013-0248, see http://seclists.org/fulldisclosure/2013/Mar/76

DEPENDENCIES
=============

FileUpload 1.3 users should upgrade to the recommended dependency set below
where possible.

The Recommended Dependency Set for FileUpload 1.3 is:
   Apache Commons-IO 2.2

Sub-task
=============

 * [FILEUPLOAD-216] - Update the project tree dirs according to default Maven conventions
 * [FILEUPLOAD-217] - drop JDK1.3 support and update to Java5
 * [FILEUPLOAD-218] - Update version in POM
 * [FILEUPLOAD-219] - upgrade tests to JUnit 4
 * [FILEUPLOAD-220] - replace package.html with package-info.java
 * [FILEUPLOAD-221] - FileItemHeadersImpl can now use LinkedHashMap
 * [FILEUPLOAD-222] - Mark @deprecated classes/methods with @Deprecated annotation

Bug
=============

 * [FILEUPLOAD-143] - "Stream ended unexpectedly" when posting from a Flash client
 * [FILEUPLOAD-173] - Manifest for OSGi has invalid syntax
 * [FILEUPLOAD-183] - commons-io dependency does not get loaded by maven if only dependency to commons-fileupload is specified
 * [FILEUPLOAD-185] - http://commons.apache.org/fileupload/index.html is out of date
 * [FILEUPLOAD-186] - http://commons.apache.org/fileupload/index.html should not mention nightly builds
 * [FILEUPLOAD-189] - DiskFileItemFactory use of FileCleaningTracker is documented or coded wrong
 * [FILEUPLOAD-195] - Error reading the file size larger than 2 gb
 * [FILEUPLOAD-197] - ServletFileUpload isMultipartContent method does not support HTTP PUT
 * [FILEUPLOAD-199] - Uploads have unexpected results for files with non-ASCII names - support RFC2047
 * [FILEUPLOAD-202] - org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
 * [FILEUPLOAD-204] - FileItem.getHeaders() returns always null.
 * [FILEUPLOAD-212] - Insecure request size checking
 * [FILEUPLOAD-214] - ServletFileUpload only accepts POST requests
 * [FILEUPLOAD-228] - (Servlet|Portlet)RequestContext#contentLength() must return request.getContentLength() if Content-length header is not available
 * [FILEUPLOAD-229] - toLowerCase() is Locale-dependent; should use toLowerCase(Locale.ENGLISH) instead

Improvement
=============

 * [FILEUPLOAD-182] - Documentation: add simple HTML form example to fileupload user guide
 * [FILEUPLOAD-207] - enhance file read/write performance
 * [FILEUPLOAD-209] - Add Support for Generic Types
 * [FILEUPLOAD-210] - Process HTTP Requests Into Maps
 * [FILEUPLOAD-223] - Update commons-io dependency to latest version that supports JDK1.5
 * [FILEUPLOAD-224] - Avoid string concatenations while parsing headers, use buffers instead
 * [FILEUPLOAD-225] - Replace java.rmi.server.UID() with java.util.UUID
 * [FILEUPLOAD-226] - DiskFileItem.counter could be converted to AtomicInteger (or AtomicLong?)
 * [FILEUPLOAD-227] - Private immutable fields which could be final

Task
=============

 * [FILEUPLOAD-201] - Update to JDK 1.5 and bump IO dependency to 2.0.1
 * [FILEUPLOAD-215] - version 1.2.3 improvement tasks

OTHER NOTES
============

 * This is the first version of Apache Commons FileUpload which requires Java5
