    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements.  See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache License, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License.  You may obtain a copy of the License at
    008     *
    009     *      http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the License for the specific language governing permissions and
    015     * limitations under the License.
    016     */
    017    package org.apache.commons.fileupload;
    018
    019    import java.io.ByteArrayOutputStream;
    020    import java.io.IOException;
    021    import java.util.Iterator;
    022    import java.util.List;
    023
    024    import javax.servlet.http.HttpServletRequest;
    025
    026    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    027    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    028
    029
    030    /**
    031     * Unit test for items with varying sizes.
    032     */
    033    public class SizesTest extends FileUploadTestCase
    034    {
    035            /** Runs a test with varying file sizes.
    036             */
    037            public void testFileUpload()
    038                throws IOException, FileUploadException
    039        {
    040            ByteArrayOutputStream baos = new ByteArrayOutputStream();
    041            int add = 16;
    042            int num = 0;
    043            for (int i = 0;  i < 16384;  i += add) {
    044                if (++add == 32) {
    045                    add = 16;
    046                }
    047                String header = "-----1234\r\n"
    048                    + "Content-Disposition: form-data; name=\"field" + (num++) + "\"\r\n"
    049                    + "\r\n";
    050                baos.write(header.getBytes("US-ASCII"));
    051                for (int j = 0;  j < i;  j++) {
    052                    baos.write((byte) j);
    053                }
    054                baos.write("\r\n".getBytes("US-ASCII"));
    055            }
    056            baos.write("-----1234--\r\n".getBytes("US-ASCII"));
    057
    058            List fileItems = parseUpload(baos.toByteArray());
    059            Iterator fileIter = fileItems.iterator();
    060            add = 16;
    061            num = 0;
    062            for (int i = 0;  i < 16384;  i += add) {
    063                if (++add == 32) {
    064                    add = 16;
    065                }
    066                FileItem item = (FileItem) fileIter.next();
    067                assertEquals("field" + (num++), item.getFieldName());
    068                byte[] bytes = item.get();
    069                assertEquals(i, bytes.length);
    070                for (int j = 0;  j < i;  j++) {
    071                    assertEquals((byte) j, bytes[j]);
    072                }
    073            }
    074            assertTrue(!fileIter.hasNext());
    075        }
    076
    077            /** Checks, whether limiting the file size works.
    078             */
    079            public void testFileSizeLimit()
    080                throws IOException, FileUploadException
    081        {
    082                    final String request =
    083                            "-----1234\r\n" +
    084                            "Content-Disposition: form-data; name=\"file\"; filename=\"foo.tab\"\r\n" +
    085                            "Content-Type: text/whatever\r\n" +
    086                            "\r\n" +
    087                            "This is the content of the file\n" +
    088                            "\r\n" +
    089                            "-----1234--\r\n";
    090
    091                    ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
    092                    upload.setFileSizeMax(-1);
    093            HttpServletRequest req = new MockHttpServletRequest(request.getBytes("US-ASCII"), CONTENT_TYPE);
    094            List fileItems = upload.parseRequest(req);
    095            assertEquals(1, fileItems.size());
    096            FileItem item = (FileItem) fileItems.get(0);
    097            assertEquals("This is the content of the file\n", new String(item.get()));
    098
    099                    upload = new ServletFileUpload(new DiskFileItemFactory());
    100                    upload.setFileSizeMax(40);
    101            req = new MockHttpServletRequest(request.getBytes("US-ASCII"), CONTENT_TYPE);
    102            fileItems = upload.parseRequest(req);
    103            assertEquals(1, fileItems.size());
    104            item = (FileItem) fileItems.get(0);
    105            assertEquals("This is the content of the file\n", new String(item.get()));
    106
    107                    upload = new ServletFileUpload(new DiskFileItemFactory());
    108                    upload.setFileSizeMax(30);
    109            req = new MockHttpServletRequest(request.getBytes("US-ASCII"), CONTENT_TYPE);
    110            try {
    111                    upload.parseRequest(req);
    112                    fail("Expected exception.");
    113            } catch (FileUploadBase.FileSizeLimitExceededException e) {
    114                    assertEquals(30, e.getPermittedSize());
    115            }
    116        }
    117    }