Hi,

I have set up a ServiceOverride for the URLEncoder.class as I want to use 
standard % encoding. I am now using code from 
org.springframework.web.util.UriUtils in the decode and encode methods of my 
URLEncoderOverrideImpl.class. This all seems to work very well, except for a 
searchpage where I have a form input and an ActivationRequestParameter:

@Property
@Persist
@ActivationRequestParameter(value = "s")
private String searchQuery;

When I call http://example.com/search and then submit a querystring like 
%query, I receive the following exception: Invalid encoded sequence "%query" 
from my decode method.

I pointed the debugger to 
org.apache.tapestry5.internal.transform.ActivationRequestParameterWorker, after 
submitting the form it calls


1.       setValueFromInitializeEventHandler() -> clientValue is null, since 
there is no parameter s yet

2.       decorateLinks() -> value is now "%query" -> clientValue gets encoded 
to "%25query"

3.       setValueFromInitializeEventHandler() -> clientValue is again "%query", 
which then leads to the exception when trying to decode it

Why is the clientValue in 3. "%query" and not "%25query"? When I switch back to 
the original URLEncoder the clientValue in 3. is always encoded "$0025query"

This is my Encoder Class:

import java.io.UnsupportedEncodingException;

import org.apache.tapestry5.services.URLEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import org.springframework.web.util.UriUtils;


public class URLEncoderOverrideImpl implements URLEncoder
{

    private final static Logger LOG = LoggerFactory.getLogger(URLEncoder.class);

    @Override
    public String encode(String input)
    {
       String output;

        try
        {
            UriComponents uriComponents = 
UriComponentsBuilder.fromHttpUrl(input).build();
            output = uriComponents.encode().toUriString();
        }
        catch (IllegalArgumentException e)
        {
            // input is not a valid http url
            LOG.info("[" + input + "] is not a valid HTTP URL");
            try
            {
                output = UriUtils.encodeQuery(input, "UTF-8");
            }
            catch (UnsupportedEncodingException e1)
            {
                throw new AssertionError("UTF-8 not supported");
            }
        }
        return output;
    }

    @Override
    public String decode(String input)
    {
        try
        {
            return UriUtils.decode(input, "UTF-8");
        }
        catch (UnsupportedEncodingException e)
        {
            throw new AssertionError("UTF-8 not supported");
        }
    }
}

Thank you
Tim

Reply via email to