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 }