Hi,

I also want to keep the former behavior of URL encoding but have issues
with form submissions.

For keeping the former behavior I added a custom URLEncoder service
which does mostly what was before done in TapestryInternalUtils (see the
code at the end of the post).

However, when I do a form submission containing special chars (like
german umlauts), they are decoded wrong. We're using UTF-8, and have
configured UTF-8 support in our AppModule (Utf8Filter).

AFAICS RequestImpl.getParameter already returns the wrong parameter
value when the form input fields are processed.

Can anybody help with this issue?

Thx && cheers,
Martin


public class UrlEncoderImpl implements URLEncoder {

    private final static URLCodec CODEC = new URLCodec();
    private static final String PERCENT = "%";
    private static final Pattern PERCENT_PATTERN = Pattern.compile(PERCENT);
    private static final String ENCODED_PERCENT = "%25";
    private static final Pattern ENCODED_PERCENT_PATTERN = 
Pattern.compile(ENCODED_PERCENT);
    private static final String SLASH = "/";
    private static final Pattern SLASH_PATTERN = Pattern.compile(SLASH);
    // just a special char that denotes the slash, to circumvent issues with 
mod_jk
    private static final String ENCODED_SLASH = "172";
    private static final Pattern ENCODED_SLASH_PATTERN = 
Pattern.compile(ENCODED_SLASH, Pattern.CASE_INSENSITIVE);

    /* (non-Javadoc)
     * @see org.apache.tapestry5.services.URLEncoder#decode(java.lang.String)
     */
    public String decode( String input ) {
        return unescapePercentAndSlash( input );
    }

    /* (non-Javadoc)
     * @see org.apache.tapestry5.services.URLEncoder#encode(java.lang.String)
     */
    public String encode( String input ) {
        try {
            return CODEC.encode( escapePercentAndSlash(input) );
        } catch ( EncoderException e ) {
            throw new RuntimeException( e );
        }
    }
    /**
     * Encodes percent and slash characters in the string for later decoding 
via [EMAIL PROTECTED]
     * #unescapePercentAndSlash(String)}.
     *
     * @param input string to encode
     * @return modified string
     */
    public static String escapePercentAndSlash(String input) {
        return replace(replace(input, PERCENT_PATTERN, ENCODED_PERCENT), 
SLASH_PATTERN, ENCODED_SLASH);
    }

    /**
     * Used to decode certain escaped characters that are replaced when using 
[EMAIL PROTECTED] #encodeContext(String)}}.
     *
     * @param input a previously encoded string
     * @return the string with slash and percent characters restored
     */
    public static String unescapePercentAndSlash(String input) {
        return replace( replace( input, ENCODED_SLASH_PATTERN, SLASH ), 
ENCODED_PERCENT_PATTERN, PERCENT );
    }

    private static String replace( String input, Pattern pattern, String 
replacement ) {
        return pattern.matcher(input).replaceAll(replacement);
    }
    
    public static void main( String[] args ) {
        print( "foo/bar test" );
        print( "tästumlaut" );
        
    }

    private static void print( final String uri ) {
        System.out.println( "encoded: " + new UrlEncoderImpl().encode( uri ) );
        System.out.println( "decoded: " + new UrlEncoderImpl().decode( new 
UrlEncoderImpl().encode( uri ) ) );
    }

}


On Tue, 2008-10-28 at 15:39 -0700, Howard Lewis Ship wrote:
> Contribute a new implementation of URLEncoder to the Alias service
> configuration and Tapestry will use the contributed one instead of the
> default URLEncoder service.
> 
> Alternately, you can decorate the URLEncoder service with an
> alternative implementation, or a filter depending on how much of the
> existing URLEncoder service implementation you want to keep.
> 
> Could you provide some more context as to why URLEncoder is a problem?
> 
> On Tue, Oct 28, 2008 at 11:39 AM, jthompson209 <[EMAIL PROTECTED]> wrote:
> >
> > Hello I am in need of either turning off this new service or overriding it
> > and having it do nothing, it is currently breaking some code that I have,
> > what would be the best way of doing that, also if overriding it is the
> > answer how would i go about doing it.
> >
> > thanks so much
> > -jeff
> > --
> > View this message in context: 
> > http://n2.nabble.com/new-URLEncoder-Service-tp1389907p1389907.html
> > Sent from the Tapestry Users mailing list archive at Nabble.com.
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> 
> 
> 

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to