diff --git a/src/java/davmail/util/StringUtil.java b/src/java/davmail/util/StringUtil.java index 2a8f5453..9e6a4e4c 100644 --- a/src/java/davmail/util/StringUtil.java +++ b/src/java/davmail/util/StringUtil.java @@ -151,6 +151,7 @@ public final class StringUtil { private static final Pattern URLENCODED_HASH_PATTERN = Pattern.compile("%23"); private static final Pattern URLENCODED_STAR_PATTERN = Pattern.compile("%2A"); private static final Pattern URLENCODED_PIPE_PATTERN = Pattern.compile("%7C"); + private static final Pattern URLENCODED_QUESTION_PATTERN = Pattern.compile("%3F"); private static final Pattern ENCODED_AMP_PATTERN = Pattern.compile("&"); private static final Pattern ENCODED_LT_PATTERN = Pattern.compile("<"); @@ -165,6 +166,7 @@ public final class StringUtil { private static final Pattern UNDERSCORE_PATTERN = Pattern.compile("_"); private static final Pattern DASH_PATTERN = Pattern.compile("-"); private static final Pattern PIPE_PATTERN = Pattern.compile("\\|"); + private static final Pattern QUESTION_PATTERN = Pattern.compile("\\?"); // WebDav search parameter encode private static final Pattern APOS_PATTERN = Pattern.compile("'"); @@ -334,6 +336,9 @@ public final class StringUtil { if (result.indexOf('|') >= 0) { result = PIPE_PATTERN.matcher(result).replaceAll("%7C"); } + if (result.indexOf('?') >= 0) { + result = QUESTION_PATTERN.matcher(result).replaceAll("%3F"); + } return result; } @@ -380,6 +385,9 @@ public final class StringUtil { if (result.indexOf("%7C") >= 0) { result = URLENCODED_PIPE_PATTERN.matcher(result).replaceAll("|"); } + if (result.indexOf("%3F") >= 0) { + result = URLENCODED_QUESTION_PATTERN.matcher(result).replaceAll("?"); + } // last replace % if (result.indexOf("%25") >= 0) { result = URLENCODED_PERCENT_PATTERN.matcher(result).replaceAll("%"); diff --git a/src/test/davmail/util/StringUtilTest.java b/src/test/davmail/util/StringUtilTest.java index 6d706488..7a7612af 100644 --- a/src/test/davmail/util/StringUtilTest.java +++ b/src/test/davmail/util/StringUtilTest.java @@ -19,6 +19,8 @@ package davmail.util; import junit.framework.TestCase; +import org.apache.commons.httpclient.URIException; +import org.apache.commons.httpclient.util.URIUtil; /** * Test StringUtil. @@ -107,4 +109,14 @@ public class StringUtilTest extends TestCase { assertEquals("test %7C", StringUtil.encodeUrlcompname("test |")); assertEquals("test |", StringUtil.decodeUrlcompname("test %7C")); } + + public void testEncodeQuestion() { + try { + URIUtil.encodeWithinQuery("test ?"); + } catch (URIException e) { + e.printStackTrace(); + } + assertEquals("test %3F", StringUtil.encodeUrlcompname("test ?")); + assertEquals("test ?", StringUtil.decodeUrlcompname("test %3F")); + } }