You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2015/10/25 15:38:29 UTC

[1/2] wicket git commit: WICKET-6010 UrlEncoder#FULL_PATH is no longer used in Wicket

Repository: wicket
Updated Branches:
  refs/heads/WICKET-6010-url-encoder [created] 0be6a8de7


WICKET-6010 UrlEncoder#FULL_PATH is no longer used in Wicket


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a4578cea
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a4578cea
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a4578cea

Branch: refs/heads/WICKET-6010-url-encoder
Commit: a4578ceac5723c581a84871726e308252073309f
Parents: 52f4ec4
Author: Sven Meier <sv...@apache.org>
Authored: Fri Oct 23 12:48:55 2015 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Fri Oct 23 12:48:55 2015 +0200

----------------------------------------------------------------------
 .../apache/wicket/util/encoding/UrlEncoder.java | 37 ++------------------
 .../wicket/util/encoding/UrlEncoderTest.java    |  4 +--
 2 files changed, 4 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/a4578cea/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java b/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java
index fb26bc4..d03b7f1 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java
@@ -49,11 +49,7 @@ public class UrlEncoder
 		/**
 		 * path type
 		 */
-		PATH,
-		/**
-		 * full path type
-		 */
-		FULL_PATH
+		PATH
 	}
 
 	// list of what not to decode
@@ -79,16 +75,6 @@ public class UrlEncoder
 	public static final UrlEncoder PATH_INSTANCE = new UrlEncoder(Type.PATH);
 
 	/**
-	 * Encoder used to encode all path segments. Querystring will be excluded.<br/>
-	 * <br/>
-	 * 
-	 * For example: http://org.acme/foo/thispart/orthispart?butnot=thispart
-	 */
-	public static final UrlEncoder FULL_PATH_INSTANCE = new UrlEncoder(Type.FULL_PATH);
-
-	private final Type type;
-
-	/**
 	 * Allow subclass to call constructor.
 	 * 
 	 * @param type
@@ -144,7 +130,6 @@ public class UrlEncoder
 		 * query =( pchar / "/" / "?" )
 		 */
 
-		this.type = type;
 		// unreserved
 		dontNeedEncoding = new BitSet(256);
 		int i;
@@ -216,18 +201,6 @@ public class UrlEncoder
 				// don't encode semicolon because it is used in ;jsessionid=
 				dontNeedEncoding.set(';');
 				break;
-
-			// same as path, but '/' will not be encoded
-			case FULL_PATH :
-				// encode ' ' with a % instead of + in path portion
-
-				// path component sub-delim values we do not need to escape
-				dontNeedEncoding.set('&');
-				dontNeedEncoding.set('=');
-				dontNeedEncoding.set('+');
-
-				dontNeedEncoding.set('/');
-				break;
 		}
 	}
 
@@ -270,18 +243,12 @@ public class UrlEncoder
 			throw new RuntimeException(new UnsupportedEncodingException(charsetName));
 		}
 
-		boolean stopEncoding = false;
 		for (int i = 0; i < s.length();)
 		{
 			int c = s.charAt(i);
 
-			if ((stopEncoding == false) && (c == '?' && type == Type.FULL_PATH))
-			{
-				stopEncoding = true;
-			}
-
 			// System.out.println("Examining character: " + c);
-			if (stopEncoding || dontNeedEncoding.get(c))
+			if (dontNeedEncoding.get(c))
 			{
 				if (c == ' ')
 				{

http://git-wip-us.apache.org/repos/asf/wicket/blob/a4578cea/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java b/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java
index 3691c74..4cc3971 100644
--- a/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java
+++ b/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java
@@ -36,7 +36,7 @@ public class UrlEncoderTest extends Assert
 	public void encodeApostrophe()
 	{
 		assertEquals("someone%27s%20bad%20url",
-			UrlEncoder.FULL_PATH_INSTANCE.encode("someone's bad url", CharEncoding.UTF_8));
+			UrlEncoder.PATH_INSTANCE.encode("someone's bad url", CharEncoding.UTF_8));
 	}
 
 	/**
@@ -56,6 +56,6 @@ public class UrlEncoderTest extends Assert
 	public void dontStopOnNullByte() throws Exception
 	{
 		assertEquals("someone%27s%20badNULL%20url",
-			UrlEncoder.FULL_PATH_INSTANCE.encode("someone's bad\0 url", CharEncoding.UTF_8));
+			UrlEncoder.PATH_INSTANCE.encode("someone's bad\0 url", CharEncoding.UTF_8));
 	}
 }


[2/2] wicket git commit: WCKET-6010 new encoder for header

Posted by sv...@apache.org.
WCKET-6010 new encoder for header


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/0be6a8de
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/0be6a8de
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/0be6a8de

Branch: refs/heads/WICKET-6010-url-encoder
Commit: 0be6a8de76b29ebe295f601b3b78cd9db253e93b
Parents: a4578ce
Author: Sven Meier <sv...@apache.org>
Authored: Fri Oct 23 19:27:02 2015 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Fri Oct 23 19:40:45 2015 +0200

----------------------------------------------------------------------
 .../http/servlet/ServletWebResponseTest.java    |  4 +-
 .../apache/wicket/request/http/WebResponse.java |  2 +-
 .../apache/wicket/util/encoding/UrlEncoder.java | 87 ++++++++++++--------
 .../wicket/util/encoding/UrlEncoderTest.java    | 42 ++++++++++
 4 files changed, 98 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0be6a8de/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebResponseTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebResponseTest.java b/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebResponseTest.java
index 5c5e9eb..e9fd4fa 100644
--- a/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebResponseTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebResponseTest.java
@@ -130,10 +130,10 @@ public class ServletWebResponseTest extends Assert
 		HttpServletResponse httpResponse = new MockHttpServletResponse(httpRequest);
 		ServletWebResponse response = new ServletWebResponse(webRequest, httpResponse);
 
-		response.setInlineHeader("name with spaces");
+		response.setInlineHeader("name with spaces and;,");
 		String header = httpResponse.getHeader("Content-Disposition");
 		assertEquals(
-			"inline; filename=\"name%20with%20spaces\"; filename*=UTF-8''name%20with%20spaces",
+			"inline; filename=\"name%20with%20spaces%20and%3B%2C\"; filename*=UTF-8''name%20with%20spaces%20and%3B%2C",
 			header);
 
 		// says: "name with bulgarian"

http://git-wip-us.apache.org/repos/asf/wicket/blob/0be6a8de/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
----------------------------------------------------------------------
diff --git a/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java b/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
index a790d0b..4183940 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
@@ -175,7 +175,7 @@ public abstract class WebResponse extends Response
 	{
 		return (Strings.isEmpty(filename) ? "" : String.format(
 			"; filename=\"%1$s\"; filename*=UTF-8''%1$s",
-			UrlEncoder.PATH_INSTANCE.encode(filename, "UTF-8")));
+			UrlEncoder.HEADER_INSTANCE.encode(filename, "UTF-8")));
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/0be6a8de/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java b/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java
index d03b7f1..85b18bd 100644
--- a/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/encoding/UrlEncoder.java
@@ -42,17 +42,15 @@ public class UrlEncoder
 	 * encoder types
 	 */
 	public enum Type {
-		/**
-		 * query type
-		 */
 		QUERY,
-		/**
-		 * path type
-		 */
-		PATH
+		PATH,
+		HEADER
 	}
 
-	// list of what not to decode
+	/**
+	 * List of what not to encode, i.e. characters (e.g. A-Z) and other allowed signs (e.g. !)
+	 * that are allowed but don't have a special meaning.
+	 */
 	protected BitSet dontNeedEncoding;
 
 	// used in decoding
@@ -67,7 +65,7 @@ public class UrlEncoder
 	public static final UrlEncoder QUERY_INSTANCE = new UrlEncoder(Type.QUERY);
 
 	/**
-	 * Encoder used to encode components of a path.<br/>
+	 * Encoder used to encode segments of a path.<br/>
 	 * <br/>
 	 * 
 	 * For example: http://org.acme/foo/thispart/orthispart?butnot=thispart
@@ -75,6 +73,11 @@ public class UrlEncoder
 	public static final UrlEncoder PATH_INSTANCE = new UrlEncoder(Type.PATH);
 
 	/**
+	 * Encoder used to encode a header.
+	 */
+	public static final UrlEncoder HEADER_INSTANCE = new UrlEncoder(Type.HEADER);
+
+	/**
 	 * Allow subclass to call constructor.
 	 * 
 	 * @param type
@@ -154,29 +157,25 @@ public class UrlEncoder
 		// sub-delims
 		dontNeedEncoding.set('!');
 		dontNeedEncoding.set('$');
-		// "&" needs to be encoded for query stings
-		// "(" and ")" probably don't need encoding, but we'll be conservative
-		dontNeedEncoding.set('*');
-		// "+" needs to be encoded for query strings (since it means =
-		dontNeedEncoding.set(',');
-		// ";" encoded due to use in path and/or query as delim in some
-		// instances (e.g., jsessionid)
-		// "=" needs to be encoded for query strings
-
-		// pchar
-		dontNeedEncoding.set(':'); // allowed and used in wicket interface
-		// params
-		dontNeedEncoding.set('@');
 
 		// encoding type-specific
 		switch (type)
 		{
-		// this code consistent with java.net.URLEncoder version
 			case QUERY :
+				// this code consistent with java.net.URLEncoder version#
+				
 				// encoding a space to a + is done in the encode() method
 				dontNeedEncoding.set(' ');
-				// to allow direct passing of URL in query
-				dontNeedEncoding.set('/');
+				
+				// sub-delims continued
+				dontNeedEncoding.set('*');
+				dontNeedEncoding.set('/'); // to allow direct passing of URL in query
+				dontNeedEncoding.set(',');
+				// "'" doesn't need encoding, but it will make it easier to use in in JavaScript  
+				// "(" and ")" don't need encoding, but we'll be conservative
+
+				dontNeedEncoding.set(':'); // allowed and used in wicket interface
+				dontNeedEncoding.set('@');
 
 				/*
 				 * the below encoding of a ? is disabled because it interferes in portlet
@@ -185,21 +184,41 @@ public class UrlEncoder
 				 * re-enable it as portlet environments are not high priority. we can also add a
 				 * switch somewhere to enable/disable this on applicaiton level. (WICKET-4019)
 				 */
-
-				// to allow direct passing of URL in query
-				// dontNeedEncoding.set('?');
+				// dontNeedEncoding.set('?'); // to allow direct passing of URL in query
 				break;
 
-			// this added to deal with encoding a PATH component
 			case PATH :
-				// encode ' ' with a % instead of + in path portion
-
-				// path component sub-delim values we do not need to escape
+				// this added to deal with encoding a PATH segment
+				
+				// sub-delims continued
+				dontNeedEncoding.set('*');
 				dontNeedEncoding.set('&');
+				dontNeedEncoding.set('+');
+				// "'" doesn't need encoding, but it will make it easier to use in in JavaScript  
+				// "(" and ")" don't need encoding, but we'll be conservative
+				dontNeedEncoding.set(',');
+				dontNeedEncoding.set(';'); // semicolon is used in ;jsessionid=
 				dontNeedEncoding.set('=');
+				
+				dontNeedEncoding.set(':'); // allowed and used in wicket interface
+				dontNeedEncoding.set('@');
+
+				break;
+				
+			// this added to deal with encoding a PATH component
+			case HEADER :
+				// this added to deal with encoding of header
+				
+				// ' ' is encoded
+
+				// sub-delims continued
+				dontNeedEncoding.set('#');
+				dontNeedEncoding.set('&');
 				dontNeedEncoding.set('+');
-				// don't encode semicolon because it is used in ;jsessionid=
-				dontNeedEncoding.set(';');
+				
+				dontNeedEncoding.set('^');
+				dontNeedEncoding.set('`');
+				dontNeedEncoding.set('|');
 				break;
 		}
 	}

http://git-wip-us.apache.org/repos/asf/wicket/blob/0be6a8de/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java b/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java
index 4cc3971..b002e1f 100644
--- a/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java
+++ b/wicket-util/src/test/java/org/apache/wicket/util/encoding/UrlEncoderTest.java
@@ -27,6 +27,48 @@ import org.junit.Test;
 public class UrlEncoderTest extends Assert
 {
 
+	// starts with &auml;
+	private static final char[] encodingCandidates = "\u00c4!\"§$%&/()=?`*'_:;><,.-#+´\\}][{|".toCharArray();
+	
+	@Test
+	public void pathUnencoded()  {
+		String unencoded = "azAZ09.-_~!$&*+,;=:@";
+		
+		assertEquals(unencoded,  UrlEncoder.PATH_INSTANCE.encode(unencoded, CharEncoding.UTF_8));
+		
+		for (char candidate : encodingCandidates) {
+			if (unencoded.indexOf(candidate) == -1) {
+				assertNotEquals("" + candidate, UrlEncoder.PATH_INSTANCE.encode("" + candidate, CharEncoding.UTF_8));
+			}
+		}
+	}
+	
+	@Test
+	public void queryStringUnencoded()  {
+		String unencoded = "azAZ09.-_~!$*,:@/";
+		
+		assertEquals(unencoded, UrlEncoder.QUERY_INSTANCE.encode(unencoded, CharEncoding.UTF_8));
+
+		for (char candidate : encodingCandidates) {
+			if (unencoded.indexOf(candidate) == -1) {
+				assertNotEquals("" + candidate, UrlEncoder.QUERY_INSTANCE.encode("" + candidate, CharEncoding.UTF_8));
+			}
+		}
+	}
+	
+	@Test
+	public void headerUnencoded()  {
+		String unencoded = "azAZ09.-_~!$&+#^`|";
+		
+		assertEquals(unencoded, UrlEncoder.HEADER_INSTANCE.encode(unencoded, CharEncoding.UTF_8));
+		
+		for (char candidate : encodingCandidates) {
+			if (unencoded.indexOf(candidate) == -1) {
+				assertNotEquals("" + candidate, UrlEncoder.HEADER_INSTANCE.encode("" + candidate, CharEncoding.UTF_8));
+			}
+		}
+	}
+	
 	/**
 	 * <a href="https://issues.apache.org/jira/browse/WICKET-3721">WICKET-3721</a> Encode
 	 * apostrophes because otherwise they get XML encoded by ComponentTag#writeOutput() to