<!--
   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
 * [FILEUPLOAD-233] - Base64Decoder doesn't correctly implement RFC 4648

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
 * [FILEUPLOAD-232] - There are no unit tests for the new utils.mime classes

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.3 improvement tasks

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

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