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.IOException;
020    import java.io.UnsupportedEncodingException;
021    import java.util.List;
022    
023    import javax.servlet.http.HttpServletRequest;
024    
025    /**
026     * Unit tests {@link org.apache.commons.fileupload.DiskFileUpload}.
027     *
028     * @author <a href="mailto:jmcnally@apache.org">John McNally</a>
029     * @author Sean C. Sullivan
030     *
031     */
032    public class ServletFileUploadTest extends FileUploadTestCase
033    {
034            public void testWithInvalidRequest()
035        {
036            FileUploadBase fu = null;
037    
038            fu = new DiskFileUpload();
039    
040            HttpServletRequest req = HttpServletRequestFactory.createInvalidHttpServletRequest();
041    
042    
043            try
044            {
045                    fu.parseRequest(req);
046                    fail("testWithInvalidRequest: expected exception was not thrown");
047            }
048            catch (FileUploadException expected)
049            {
050                    // this exception is expected
051            }
052    
053        }
054    
055    
056            public void testWithNullContentType()
057        {
058            FileUploadBase fu = new DiskFileUpload();
059    
060            HttpServletRequest req = HttpServletRequestFactory.createHttpServletRequestWithNullContentType();
061    
062            try
063            {
064                    fu.parseRequest(req);
065                    fail("testWithNullContentType: expected exception was not thrown");
066            }
067            catch (DiskFileUpload.InvalidContentTypeException expected)
068            {
069                    // this exception is expected
070            }
071            catch (FileUploadException unexpected)
072            {
073                    fail("testWithNullContentType: unexpected exception was thrown");
074            }
075    
076        }
077    
078    
079        public void testFileUpload()
080                throws IOException, FileUploadException
081        {
082            List fileItems = parseUpload("-----1234\r\n" +
083                            "Content-Disposition: form-data; name=\"file\"; filename=\"foo.tab\"\r\n" +
084                            "Content-Type: text/whatever\r\n" +
085                            "\r\n" +
086                            "This is the content of the file\n" +
087                            "\r\n" +
088                            "-----1234\r\n" +
089                            "Content-Disposition: form-data; name=\"field\"\r\n" +
090                            "\r\n" +
091                            "fieldValue\r\n" +
092                            "-----1234\r\n" +
093                            "Content-Disposition: form-data; name=\"multi\"\r\n" +
094                            "\r\n" +
095                            "value1\r\n" +
096                            "-----1234\r\n" +
097                            "Content-Disposition: form-data; name=\"multi\"\r\n" +
098                            "\r\n" +
099                            "value2\r\n" +
100                            "-----1234--\r\n");
101            assertEquals(4, fileItems.size());
102    
103            FileItem file = (FileItem) fileItems.get(0);
104            assertEquals("file", file.getFieldName());
105            assertFalse(file.isFormField());
106            assertEquals("This is the content of the file\n", file.getString());
107            assertEquals("text/whatever", file.getContentType());
108            assertEquals("foo.tab", file.getName());
109    
110            FileItem field = (FileItem) fileItems.get(1);
111            assertEquals("field", field.getFieldName());
112            assertTrue(field.isFormField());
113            assertEquals("fieldValue", field.getString());
114    
115            FileItem multi0 = (FileItem) fileItems.get(2);
116            assertEquals("multi", multi0.getFieldName());
117            assertTrue(multi0.isFormField());
118            assertEquals("value1", multi0.getString());
119    
120            FileItem multi1 = (FileItem) fileItems.get(3);
121            assertEquals("multi", multi1.getFieldName());
122            assertTrue(multi1.isFormField());
123            assertEquals("value2", multi1.getString());
124        }
125    
126        public void testFilenameCaseSensitivity() 
127                throws IOException, FileUploadException
128        {
129            List fileItems = parseUpload("-----1234\r\n" +
130                            "Content-Disposition: form-data; name=\"FiLe\"; filename=\"FOO.tab\"\r\n" +
131                            "Content-Type: text/whatever\r\n" +
132                            "\r\n" +
133                            "This is the content of the file\n" +
134                            "\r\n" +
135                            "-----1234--\r\n");
136            assertEquals(1, fileItems.size());
137    
138            FileItem file = (FileItem) fileItems.get(0);
139            assertEquals("FiLe", file.getFieldName());
140            assertEquals("FOO.tab", file.getName());
141        }
142    
143        /**
144         * This is what the browser does if you submit the form without choosing a file.
145         */
146        public void testEmptyFile()
147                throws UnsupportedEncodingException, FileUploadException
148        {
149            List fileItems = parseUpload ("-----1234\r\n" +
150                    "Content-Disposition: form-data; name=\"file\"; filename=\"\"\r\n" +
151                    "\r\n" +
152                    "\r\n" +
153                    "-----1234--\r\n");
154            assertEquals(1, fileItems.size());
155    
156            FileItem file = (FileItem) fileItems.get(0);
157            assertFalse(file.isFormField());
158            assertEquals("", file.getString());
159            assertEquals("", file.getName());
160        }
161    
162        /**
163         * Internet Explorer 5 for the Mac has a bug where the carriage
164         * return is missing on any boundary line immediately preceding
165         * an input with type=image. (type=submit does not have the bug.)
166         */
167        public void testIE5MacBug()
168                throws UnsupportedEncodingException, FileUploadException
169        {
170            List fileItems = parseUpload("-----1234\r\n" +
171                    "Content-Disposition: form-data; name=\"field1\"\r\n" +
172                    "\r\n" +
173                    "fieldValue\r\n" +
174                    "-----1234\n" + // NOTE \r missing
175                    "Content-Disposition: form-data; name=\"submitName.x\"\r\n" +
176                    "\r\n" +
177                    "42\r\n" +
178                    "-----1234\n" + // NOTE \r missing
179                    "Content-Disposition: form-data; name=\"submitName.y\"\r\n" +
180                    "\r\n" +
181                    "21\r\n" +
182                    "-----1234\r\n" +
183                    "Content-Disposition: form-data; name=\"field2\"\r\n" +
184                    "\r\n" +
185                    "fieldValue2\r\n" +
186                    "-----1234--\r\n");
187    
188            assertEquals(4, fileItems.size());
189    
190            FileItem field1 = (FileItem) fileItems.get(0);
191            assertEquals("field1", field1.getFieldName());
192            assertTrue(field1.isFormField());
193            assertEquals("fieldValue", field1.getString());
194    
195            FileItem submitX = (FileItem) fileItems.get(1);
196            assertEquals("submitName.x", submitX.getFieldName());
197            assertTrue(submitX.isFormField());
198            assertEquals("42", submitX.getString());
199    
200            FileItem submitY = (FileItem) fileItems.get(2);
201            assertEquals("submitName.y", submitY.getFieldName());
202            assertTrue(submitY.isFormField());
203            assertEquals("21", submitY.getString());
204    
205            FileItem field2 = (FileItem) fileItems.get(3);
206            assertEquals("field2", field2.getFieldName());
207            assertTrue(field2.isFormField());
208            assertEquals("fieldValue2", field2.getString());
209        }
210    
211        /**
212         * Test for <a href="http://issues.apache.org/jira/browse/FILEUPLOAD-62">FILEUPLOAD-62</a>
213         */
214        public void testFILEUPLOAD62() throws Exception {
215            final String contentType = "multipart/form-data; boundary=AaB03x";
216            final String request =
217                    "--AaB03x\r\n" +
218                    "content-disposition: form-data; name=\"field1\"\r\n" +
219                    "\r\n" +
220                    "Joe Blow\r\n" +
221                    "--AaB03x\r\n" +
222                    "content-disposition: form-data; name=\"pics\"\r\n" +
223                    "Content-type: multipart/mixed; boundary=BbC04y\r\n" +
224                    "\r\n" +
225                    "--BbC04y\r\n" +
226                    "Content-disposition: attachment; filename=\"file1.txt\"\r\n" +
227                    "Content-Type: text/plain\r\n" +
228                    "\r\n" +
229                    "... contents of file1.txt ...\r\n" +
230                    "--BbC04y\r\n" +
231                    "Content-disposition: attachment; filename=\"file2.gif\"\r\n" +
232                    "Content-type: image/gif\r\n" +
233                    "Content-Transfer-Encoding: binary\r\n" +
234                    "\r\n" +
235                    "...contents of file2.gif...\r\n" +
236                    "--BbC04y--\r\n" +
237                    "--AaB03x--";
238            List fileItems = parseUpload(request.getBytes("US-ASCII"), contentType);
239            assertEquals(3, fileItems.size());
240            FileItem item0 = (FileItem) fileItems.get(0);
241            assertEquals("field1", item0.getFieldName());
242            assertNull(item0.getName());
243            assertEquals("Joe Blow", new String(item0.get()));
244            FileItem item1 = (FileItem) fileItems.get(1);
245            assertEquals("pics", item1.getFieldName());
246            assertEquals("file1.txt", item1.getName());
247            assertEquals("... contents of file1.txt ...", new String(item1.get()));
248            FileItem item2 = (FileItem) fileItems.get(2);
249            assertEquals("pics", item2.getFieldName());
250            assertEquals("file2.gif", item2.getName());
251            assertEquals("...contents of file2.gif...", new String(item2.get()));
252        }
253    
254        /**
255         * Test for <a href="http://issues.apache.org/jira/browse/FILEUPLOAD-111">FILEUPLOAD-111</a>
256         */
257        public void testFoldedHeaders()
258                    throws IOException, FileUploadException {
259            List fileItems = parseUpload("-----1234\r\n" +
260                            "Content-Disposition: form-data; name=\"file\"; filename=\"foo.tab\"\r\n" +
261                            "Content-Type: text/whatever\r\n" +
262                            "\r\n" +
263                            "This is the content of the file\n" +
264                            "\r\n" +
265                            "-----1234\r\n" +
266                            "Content-Disposition: form-data; \r\n" +
267                            "\tname=\"field\"\r\n" +
268                            "\r\n" +
269                            "fieldValue\r\n" +
270                            "-----1234\r\n" +
271                            "Content-Disposition: form-data;\r\n" +
272                            "     name=\"multi\"\r\n" +
273                            "\r\n" +
274                            "value1\r\n" +
275                            "-----1234\r\n" +
276                            "Content-Disposition: form-data; name=\"multi\"\r\n" +
277                            "\r\n" +
278                            "value2\r\n" +
279                            "-----1234--\r\n");
280            assertEquals(4, fileItems.size());
281    
282            FileItem file = (FileItem) fileItems.get(0);
283            assertEquals("file", file.getFieldName());
284            assertFalse(file.isFormField());
285            assertEquals("This is the content of the file\n", file.getString());
286            assertEquals("text/whatever", file.getContentType());
287            assertEquals("foo.tab", file.getName());
288    
289            FileItem field = (FileItem) fileItems.get(1);
290            assertEquals("field", field.getFieldName());
291            assertTrue(field.isFormField());
292            assertEquals("fieldValue", field.getString());
293    
294            FileItem multi0 = (FileItem) fileItems.get(2);
295            assertEquals("multi", multi0.getFieldName());
296            assertTrue(multi0.isFormField());
297            assertEquals("value1", multi0.getString());
298    
299            FileItem multi1 = (FileItem) fileItems.get(3);
300            assertEquals("multi", multi1.getFieldName());
301            assertTrue(multi1.isFormField());
302            assertEquals("value2", multi1.getString());
303        }
304    }