diff options
author | Greg Wilkins | 2014-04-10 05:14:46 +0000 |
---|---|---|
committer | Greg Wilkins | 2014-04-10 05:14:46 +0000 |
commit | 7adba8d0335070815f33406b99aad9804b7bb3cb (patch) | |
tree | 54e5f2d425fbf2d96d9dbfef020d2648e5232ffb | |
parent | 4785121a53314c3b70e09b812654712ff94bd89f (diff) | |
download | org.eclipse.jetty.project-7adba8d0335070815f33406b99aad9804b7bb3cb.tar.gz org.eclipse.jetty.project-7adba8d0335070815f33406b99aad9804b7bb3cb.tar.xz org.eclipse.jetty.project-7adba8d0335070815f33406b99aad9804b7bb3cb.zip |
431094 Consistent handling of utf8 decoding errors
-rw-r--r-- | jetty-util/src/test/java/org/eclipse/jetty/util/UrlEncodedUtf8Test.java | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/UrlEncodedUtf8Test.java b/jetty-util/src/test/java/org/eclipse/jetty/util/UrlEncodedUtf8Test.java new file mode 100644 index 0000000000..a80c51c5e6 --- /dev/null +++ b/jetty-util/src/test/java/org/eclipse/jetty/util/UrlEncodedUtf8Test.java @@ -0,0 +1,165 @@ +// +// ======================================================================== +// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. +// ------------------------------------------------------------------------ +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// and Apache License v2.0 which accompanies this distribution. +// +// The Eclipse Public License is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// The Apache License v2.0 is available at +// http://www.opensource.org/licenses/apache2.0.php +// +// You may elect to redistribute this code under either of these licenses. +// ======================================================================== +// + +package org.eclipse.jetty.util; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import org.eclipse.jetty.util.log.Log; +import org.eclipse.jetty.util.log.Logger; +import org.junit.Assert; +import org.junit.Test; + +public class UrlEncodedUtf8Test +{ + + static final Logger LOG=Log.getLogger(UrlEncodedUtf8Test.class); + + + @Test + public void testIncompleteSequestAtTheEnd() throws Exception + { + byte[] bytes= { 97, 98, 61, 99, -50 }; + String test=new String(bytes,StandardCharsets.UTF_8); + String expected = "c"+Utf8Appendable.REPLACEMENT; + + fromByteArray(test,bytes,"ab",expected,false); + fromInputStream(test,bytes,"ab",expected,false); + } + + @Test + public void testIncompleteSequestAtTheEnd2() throws Exception + { + byte[] bytes={ 97, 98, 61, -50 }; + String test=new String(bytes,StandardCharsets.UTF_8); + String expected = ""+Utf8Appendable.REPLACEMENT; + + fromByteArray(test,bytes,"ab",expected,false); + fromInputStream(test,bytes,"ab",expected,false); + + } + + @Test + public void testIncompleteSequestInName() throws Exception + { + byte[] bytes= { 101, -50, 61, 102, 103, 38, 97, 98, 61, 99, 100 }; + String test=new String(bytes,StandardCharsets.UTF_8); + String name = "e"+Utf8Appendable.REPLACEMENT; + String value = "fg"; + + fromByteArray(test,bytes,name,value,false); + fromInputStream(test,bytes,name,value,false); + } + + @Test + public void testIncompleteSequestInValue() throws Exception + { + byte[] bytes= { 101, 102, 61, 103, -50, 38, 97, 98, 61, 99, 100 }; + String test=new String(bytes,StandardCharsets.UTF_8); + String name = "ef"; + String value = "g"+Utf8Appendable.REPLACEMENT; + + fromByteArray(test,bytes,name,value,false); + fromInputStream(test,bytes,name,value,false); + + } + + @Test + public void testCorrectUnicode() throws Exception + { + String chars="a=%u0061"; + byte[] bytes= chars.getBytes(StandardCharsets.UTF_8); + String test=new String(bytes,StandardCharsets.UTF_8); + String name = "a"; + String value = "a"; + + fromByteArray(test,bytes,name,value,false); + fromInputStream(test,bytes,name,value,false); + + } + + @Test + public void testIncompleteUnicode() throws Exception + { + String chars="a=%u0"; + byte[] bytes= chars.getBytes(StandardCharsets.UTF_8); + String test=new String(bytes,StandardCharsets.UTF_8); + String name = "a"; + String value = ""+Utf8Appendable.REPLACEMENT; + + fromByteArray(test,bytes,name,value,false); + fromInputStream(test,bytes,name,value,false); + + } + + @Test + public void testIncompletePercent() throws Exception + { + String chars="a=%A"; + byte[] bytes= chars.getBytes(StandardCharsets.UTF_8); + String test=new String(bytes,StandardCharsets.UTF_8); + String name = "a"; + String value = ""+Utf8Appendable.REPLACEMENT; + + fromByteArray(test,bytes,name,value,false); + fromInputStream(test,bytes,name,value,false); + + } + + static void fromByteArray(String test,byte[] b,String field,String expected,boolean thrown) throws Exception + { + MultiMap<String> values=new MultiMap<>(); + try + { + //safeDecodeUtf8To(b, 0, b.length, values); + UrlEncoded.decodeUtf8To(b, 0, b.length, values); + if (thrown) + Assert.fail(); + Assert.assertEquals(test, expected, values.getString(field)); + } + catch (Exception e) + { + if (!thrown) + throw e; + LOG.ignore(e); + } + } + + static void fromInputStream(String test, byte[] b,String field, String expected,boolean thrown) throws Exception + { + InputStream is=new ByteArrayInputStream(b); + MultiMap<String> values=new MultiMap<>(); + try + { + //safeDecodeUtf8To(is, values, 1000000, 10000000); + UrlEncoded.decodeUtf8To(is, values, 1000000, 10000000); + if (thrown) + Assert.fail(); + Assert.assertEquals(test, expected, values.getString(field)); + } + catch (Exception e) + { + if (!thrown) + throw e; + LOG.ignore(e); + } + } + +} |