| /**************************************************************** |
| * 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. * |
| ****************************************************************/ |
| |
| package org.apache.james.mime4j.field; |
| |
| import org.apache.james.mime4j.MimeException; |
| import org.apache.james.mime4j.dom.field.ContentDispositionField; |
| import org.apache.james.mime4j.stream.RawField; |
| import org.apache.james.mime4j.stream.RawFieldParser; |
| import org.apache.james.mime4j.util.ByteSequence; |
| import org.apache.james.mime4j.util.ContentUtil; |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| import java.util.Date; |
| |
| public class LenientContentDispositionFieldTest { |
| |
| static ContentDispositionField parse(final String s) throws MimeException { |
| ByteSequence raw = ContentUtil.encode(s); |
| RawField rawField = RawFieldParser.DEFAULT.parseField(raw); |
| return ContentDispositionFieldLenientImpl.PARSER.parse(rawField, null); |
| } |
| |
| @Test |
| public void testDispositionTypeWithSemiColonNoParams() throws Exception { |
| ContentDispositionField f = parse("Content-Disposition: inline;"); |
| Assert.assertEquals("inline", f.getDispositionType()); |
| } |
| |
| @Test |
| public void testGetDispositionType() throws Exception { |
| ContentDispositionField f = parse("Content-Disposition: attachment"); |
| Assert.assertEquals("attachment", f.getDispositionType()); |
| |
| f = parse("content-disposition: InLiNe "); |
| Assert.assertEquals("inline", f.getDispositionType()); |
| |
| f = parse("CONTENT-DISPOSITION: x-yada ;" + " param = yada"); |
| Assert.assertEquals("x-yada", f.getDispositionType()); |
| |
| f = parse("CONTENT-DISPOSITION: "); |
| Assert.assertEquals("", f.getDispositionType()); |
| } |
| |
| @Test |
| public void testGetParameter() throws Exception { |
| ContentDispositionField f = parse("CONTENT-DISPOSITION: inline ;" |
| + " filename=yada yada"); |
| Assert.assertEquals("yada yada", f.getParameter("filename")); |
| |
| f = parse("Content-Disposition: x-yada;" |
| + " fileNAme= \"ya:\\\"*da\"; " + "\tSIZE\t = 1234"); |
| Assert.assertEquals("ya:\"*da", f.getParameter("filename")); |
| Assert.assertEquals("1234", f.getParameter("size")); |
| |
| f = parse("Content-Disposition: x-yada; " |
| + "fileNAme= \"ya \\\"\\\"\tda \\\"\"; " |
| + "\tx-Yada\t = \"\\\"hepp\\\" =us\t-ascii\""); |
| Assert.assertEquals("ya \"\"\tda \"", f.getParameter("filename")); |
| Assert.assertEquals("\"hepp\" =us\t-ascii", f.getParameter("x-yada")); |
| } |
| |
| @Test |
| public void testIsDispositionType() throws Exception { |
| ContentDispositionField f = parse("Content-Disposition:INline"); |
| Assert.assertTrue(f.isDispositionType("InLiNe")); |
| Assert.assertFalse(f.isDispositionType("NiLiNe")); |
| Assert.assertTrue(f.isInline()); |
| Assert.assertFalse(f.isAttachment()); |
| |
| f = parse("Content-Disposition: attachment"); |
| Assert.assertTrue(f.isDispositionType("ATTACHMENT")); |
| Assert.assertFalse(f.isInline()); |
| Assert.assertTrue(f.isAttachment()); |
| |
| f = parse("Content-Disposition: x-something"); |
| Assert.assertTrue(f.isDispositionType("x-SomeThing")); |
| Assert.assertFalse(f.isInline()); |
| Assert.assertFalse(f.isAttachment()); |
| } |
| |
| @Test |
| public void testGetFilename() throws Exception { |
| ContentDispositionField f = parse("Content-Disposition: inline; filename=yada.txt"); |
| Assert.assertEquals("yada.txt", f.getFilename()); |
| |
| f = parse("Content-Disposition: inline; filename=yada yada.txt"); |
| Assert.assertEquals("yada yada.txt", f.getFilename()); |
| |
| f = parse("Content-Disposition: inline; filename=\"yada yada.txt\""); |
| Assert.assertEquals("yada yada.txt", f.getFilename()); |
| |
| f = parse("Content-Disposition: inline"); |
| Assert.assertNull(f.getFilename()); |
| } |
| |
| @Test |
| public void testGetCreationDate() throws Exception { |
| ContentDispositionField f = parse("Content-Disposition: inline; " |
| + "creation-date=\"Tue, 01 Jan 1970 00:00:00 +0000\""); |
| Assert.assertEquals(new Date(0), f.getCreationDate()); |
| |
| f = parse("Content-Disposition: inline; " |
| + "creation-date=Tue, 01 Jan 1970 00:00:00 +0000"); |
| Assert.assertEquals(new Date(0), f.getCreationDate()); |
| |
| f = parse("Content-Disposition: attachment"); |
| Assert.assertNull(f.getCreationDate()); |
| } |
| |
| @Test |
| public void testGetModificationDate() throws Exception { |
| ContentDispositionField f = parse("Content-Disposition: inline; " |
| + "modification-date=\"Tue, 01 Jan 1970 00:00:00 +0000\""); |
| Assert.assertEquals(new Date(0), f.getModificationDate()); |
| |
| f = parse("Content-Disposition: inline; " |
| + "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\""); |
| Assert.assertEquals(new Date(855782991000l), f.getModificationDate()); |
| |
| f = parse("Content-Disposition: inline; " |
| + "modification-date=yesterday"); |
| Assert.assertNull(f.getModificationDate()); |
| |
| f = parse("Content-Disposition: attachment"); |
| Assert.assertNull(f.getModificationDate()); |
| } |
| |
| @Test |
| public void testGetReadDate() throws Exception { |
| ContentDispositionField f = parse("Content-Disposition: inline; " |
| + "read-date=\"Tue, 01 Jan 1970 00:00:00 +0000\""); |
| Assert.assertEquals(new Date(0), f.getReadDate()); |
| |
| f = parse("Content-Disposition: inline; read-date="); |
| Assert.assertNull(f.getReadDate()); |
| |
| f = parse("Content-Disposition: attachment"); |
| Assert.assertNull(f.getReadDate()); |
| } |
| |
| @Test |
| public void testGetSize() throws Exception { |
| ContentDispositionField f = parse("Content-Disposition: attachment; size=0"); |
| Assert.assertEquals(0, f.getSize()); |
| |
| f = parse("Content-Disposition: attachment; size=matters"); |
| Assert.assertEquals(-1, f.getSize()); |
| |
| f = parse("Content-Disposition: attachment"); |
| Assert.assertEquals(-1, f.getSize()); |
| |
| f = parse("Content-Disposition: attachment; size=-12"); |
| Assert.assertEquals(-1, f.getSize()); |
| |
| f = parse("Content-Disposition: attachment; size=12"); |
| Assert.assertEquals(12, f.getSize()); |
| } |
| |
| @Test |
| public void testMultipartFileName() throws Exception { |
| ContentDispositionField f = parse("Content-Disposition: attachment;\n" + |
| " filename*0=\"looooooooooooooooooooooooooooooooooooooooooooooooooooooooooo\";\n" + |
| " filename*1=\"oooooooooooooooooooooooooooooooooooooong_fiiiiiiiiiiiiiiiiii\";\n" + |
| " filename*2=\"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiileeeeeeeeeeeeeeeeeee\";\n" + |
| " filename*3=\"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee.txt\""); |
| Assert.assertEquals("loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo" + |
| "ooooooooooooooong_fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiileeeeeeeeeeeeeeeeeeeeeeeeeeeeee" + |
| "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee.txt", f.getFilename()); |
| } |
| |
| @Test |
| public void testNonAsciiFilename() throws MimeException { |
| ContentDispositionField f = parse("Content-Disposition: attachment;" |
| + "\nfilename*0=\"=?UTF-8?Q?3-2_FORPROSJEKT_2-Sheet_-_XXX_A_2_40_?=" |
| + "\n=?UTF-8?Q?\";" |
| + "\nfilename*1=\"201_-_Fasader_nord=C3=B8st_og_nordvest.dwg?=\""); |
| |
| Assert.assertEquals("3-2 FORPROSJEKT 2-Sheet - XXX A 2 40 201 - Fasader nordøst og nordvest.dwg", |
| f.getFilename()); |
| } |
| |
| @Test |
| public void testBadEncodingFilename() throws MimeException { |
| ContentDispositionField f = parse("Content-Disposition: attachment; \n" + |
| " filename*=utf-8''4%P001!.DOC;\n" + |
| " filename=\"4%P001!.DOC\""); |
| |
| Assert.assertEquals(f.getDispositionType(), "attachment"); |
| Assert.assertEquals(f.getFilename(), "4%P001!.DOC4%P001!.DOC"); |
| } |
| |
| } |