The Tapestry URL encoding is not a problem for me in general, just for one use case when i wanted to migrate a site to tapestry and keeping the same URL (with accents, spaces, dashes, underscores and so on).
On Fri, 18 Jun 2010 17:20:36 -0700, Howard Lewis Ship <hls...@gmail.com> wrote: > Tapestry does its own encoding because Jetty and Tomcat differ on > whether you get the decoded or raw strings. Creating another option, > that would work the same across servlet containers, seemed to make > sense at the time. > > On Fri, Jun 18, 2010 at 8:50 AM, Nicolas Bouillon <nico...@bouil.org> > wrote: >> Hi, >> >> Here is how i've overrided this behavior, to allow URL with "%20" or >> other >> chars as incomming request. It quite a copy/paste tweaking of the >> original >> UrlEncoderImpl from Tapestry 5.1.0.5. >> >> public class AppModule { >> ..... >> public static void contributeServiceOverride( >> MappedConfiguration<Class, Object> configuration) { >> configuration.add(URLEncoder.class, new MyURLEncoderImpl()); >> } >> ..... >> } >> >> >> package org.bouil.tapestry.services; >> >> import java.io.UnsupportedEncodingException; >> import java.util.BitSet; >> >> import org.apache.tapestry5.ioc.internal.util.Defense; >> import org.apache.tapestry5.services.URLEncoder; >> >> public class MyURLEncoderImpl implements URLEncoder { >> static final String ENCODED_NULL = "$N"; >> static final String ENCODED_BLANK = "$B"; >> >> /** >> * Bit set indicating which character are safe to pass through (when >> * encoding or decoding) as-is. All other characters are encoded as a >> kind >> * of unicode escape. >> */ >> private final BitSet safeForInput = new BitSet(128); >> private final BitSet safeForOutput = new BitSet(128); >> >> { >> >> markSafeForInput("aàâäbcçĉdeéèêëfgĝhĥiïîjĵklmnoôöpqrsŝtuùûüvwxyzæœ"); >> >> markSafeForInput("AÀÂÄBCÇĈDEÉÈÊËFGĜHĤIÏÎĤJĴKLMNOÔÖPQRSŜTUÙÛÜVWXYZÆŒ"); >> markSafeForInput("01234567890-_.:,'"); >> >> markSafeForOuput("abcdefghijklmnopqrstuvwxyz"); >> markSafeForOuput("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); >> markSafeForOuput("01234567890-_.:,'"); >> } >> >> private void markSafeForInput(String s) { >> for (char ch : s.toCharArray()) { >> safeForInput.set(ch); >> } >> } >> >> private void markSafeForOuput(String s) { >> for (char ch : s.toCharArray()) { >> safeForOutput.set(ch); >> } >> } >> >> public String encode(String input) { >> if (input == null) >> return ENCODED_NULL; >> >> if (input.equals("")) >> return ENCODED_BLANK; >> >> boolean dirty = false; >> >> int length = input.length(); >> >> StringBuilder output = new StringBuilder(length * 2); >> >> for (int i = 0; i < length; i++) { >> char ch = input.charAt(i); >> >> if (ch == '$') { >> output.append("$$"); >> dirty = true; >> continue; >> } >> >> int chAsInt = ch; >> >> if (safeForOutput.get(chAsInt)) { >> output.append(ch); >> continue; >> } >> >> try { >> return java.net.URLEncoder.encode(new String(input), >> "UTF-8"); >> } catch (UnsupportedEncodingException e) { >> throw new IllegalArgumentException(e); >> } >> // output.append(String.format("$%04x", chAsInt)); >> // dirty = true; >> } >> >> return dirty ? output.toString() : input; >> } >> >> public String decode(String input) { >> Defense.notNull(input, "input"); >> >> if (input.equals(ENCODED_NULL)) >> return null; >> >> if (input.equals(ENCODED_BLANK)) >> return ""; >> >> boolean dirty = false; >> >> int length = input.length(); >> >> StringBuilder output = new StringBuilder(length * 2); >> >> for (int i = 0; i < length; i++) { >> char ch = input.charAt(i); >> >> if (ch == '$') { >> dirty = true; >> >> if (i + 1 < length && input.charAt(i + 1) == '$') { >> output.append('$'); >> i++; >> >> dirty = true; >> continue; >> } >> >> if (i + 4 < length) { >> String hex = input.substring(i + 1, i + 5); >> >> try { >> int unicode = Integer.parseInt(hex, 16); >> >> output.append((char) unicode); >> i += 4; >> dirty = true; >> continue; >> } catch (NumberFormatException ex) { >> // Ignore. >> } >> } >> >> throw new IllegalArgumentException( >> String >> .format( >> "Input string '%s' is not valid; >> the '$' character at position %d should be followed by another '$' or a >> four digit hex number (a unicode value).", >> input, i + 1)); >> } >> >> if (!safeForInput.get(ch)) { >> throw new IllegalArgumentException( >> String >> .format( >> "Input string '%s' is not valid; >> the character '%s' at position %d is not valid.", >> input, ch, i + 1)); >> } >> >> output.append(ch); >> } >> >> return dirty ? output.toString() : input; >> } >> } >> >> >> >> On Fri, 18 Jun 2010 16:08:09 +0100, Joel Halbert <j...@su3analytics.com> >> wrote: >>> Tapestry appears to URL encode spaces as "$0020" >>> >>> e.g. >>> http://localhost:8080/web/buy/sports$0020shoes >>> >>> >>> I would much prefer to use standard encoding such as: >>> >>> http://localhost:8080/web/buy/sports+shoes >>> or >>> http://localhost:8080/web/buy/sports%20shoes >>> >>> >>> Is it possible to configure or override this behaviour? >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >> For additional commands, e-mail: users-h...@tapestry.apache.org >> >> --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org