Hi Pedro,

How exactly you did this change ?
The diff for ServletWebRequest below looks wrong and scary. I see that
the actual source of that class is OK but for some reason the diff is
wrong.
Even ViewVC shows the same problem:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?r1=1186162&r2=1190589&diff_format=h

I remember once Peter Ertl also confused me with such commit notification.
Can you remember the steps you did to commit this change ?
I would like to avoid them in future :-)

On Sat, Oct 29, 2011 at 12:31 AM,  <[email protected]> wrote:
> Author: pedro
> Date: Fri Oct 28 21:31:23 2011
> New Revision: 1190589
>
> URL: http://svn.apache.org/viewvc?rev=1190589&view=rev
> Log:
> Making sure that client URL is context relative even while responding errors
> Issue: WICKET-4168
>
> Modified:
>    
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>    
> wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java
>
> Modified: 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> URL: 
> http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=1190589&r1=1190588&r2=1190589&view=diff
> ==============================================================================
> --- 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>  (original)
> +++ 
> wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>  Fri Oct 28 21:31:23 2011
> @@ -16,445 +16,120 @@
>  */
>  package org.apache.wicket.protocol.http.servlet;
>
> -import java.nio.charset.Charset;
> -import java.util.ArrayList;
> -import java.util.Arrays;
> -import java.util.Collections;
> -import java.util.Enumeration;
> -import java.util.HashMap;
> -import java.util.List;
> -import java.util.Locale;
> -import java.util.Map;
> -import java.util.Set;
> -
> -import javax.servlet.ServletRequest;
> -import javax.servlet.http.Cookie;
>  import javax.servlet.http.HttpServletRequest;
>
> -import org.apache.wicket.protocol.http.RequestUtils;
> -import org.apache.wicket.request.IRequestParameters;
> -import org.apache.wicket.request.IWritableRequestParameters;
> +import org.apache.wicket.MarkupContainer;
> +import org.apache.wicket.Page;
> +import org.apache.wicket.markup.IMarkupResourceStreamProvider;
> +import org.apache.wicket.markup.html.WebPage;
> +import org.apache.wicket.protocol.http.WebApplication;
> +import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
>  import org.apache.wicket.request.Url;
>  import org.apache.wicket.request.http.WebRequest;
> -import org.apache.wicket.util.lang.Args;
> -import org.apache.wicket.util.lang.Bytes;
> -import org.apache.wicket.util.lang.Checks;
> -import org.apache.wicket.util.string.PrependingStringBuffer;
> -import org.apache.wicket.util.string.StringValue;
> -import org.apache.wicket.util.string.Strings;
> -import org.apache.wicket.util.string.UrlUtils;
> -import org.apache.wicket.util.time.Time;
> -import org.apache.wicket.util.upload.FileItemFactory;
> -import org.apache.wicket.util.upload.FileUploadException;
> -import org.slf4j.Logger;
> -import org.slf4j.LoggerFactory;
> +import org.apache.wicket.util.resource.IResourceStream;
> +import org.apache.wicket.util.resource.StringResourceStream;
> +import org.apache.wicket.util.tester.WicketTester;
> +import org.junit.Assert;
> +import org.junit.Test;
>
>  /**
> - * {@link WebRequest} subclass that wraps a {@link HttpServletRequest} 
> object.
> - *
> - * @author Matej Knopp
> - * @author Juergen Donnerstag
> - * @author Igor Vaynberg
> + * Tests for {@link ServletWebRequest}
>  */
> -public class ServletWebRequest extends WebRequest
> +public class ServletWebRequestTest extends Assert
>  {
> -       private final HttpServletRequest httpServletRequest;
> -
> -       private final Url url;
> -
> -       private final String filterPrefix;
> -
> -       private final ErrorAttributes errorAttributes;
> -
> -       /**
> -        * Construct.
> -        *
> -        * @param httpServletRequest
> -        * @param filterPrefix
> -        *            contentPath + filterPath, used to extract the actual 
> {@link Url}
> -        */
> -       public ServletWebRequest(HttpServletRequest httpServletRequest, 
> String filterPrefix)
> -       {
> -               this(httpServletRequest, filterPrefix, null);
> -       }
>
>        /**
> -        * Construct.
> -        *
> -        * @param httpServletRequest
> -        * @param filterPrefix
> -        *            contentPath + filterPath, used to extract the actual 
> {@link Url}
> -        * @param url
> +        * Tests that {@link ServletWebRequest#getClientUrl()} returns the 
> current url + the query
> +        * string when this is not error dispatched request. When the request 
> is error dispatched it
> +        * returns just the request uri to the error page without the query 
> string
>         */
> -       public ServletWebRequest(HttpServletRequest httpServletRequest, 
> String filterPrefix, Url url)
> +       @Test
> +       public void wicket3599()
>        {
> -               Args.notNull(httpServletRequest, "httpServletRequest");
> -               Args.notNull(filterPrefix, "filterPrefix");
> +               MockHttpServletRequest httpRequest = new 
> MockHttpServletRequest(null, null, null);
> +               httpRequest.setURL("/" + httpRequest.getContextPath() + 
> "/request/Uri");
> +               httpRequest.setParameter("some", "parameter");
>
> -               this.httpServletRequest = httpServletRequest;
> -               this.filterPrefix = filterPrefix;
> +               ServletWebRequest webRequest = new 
> ServletWebRequest(httpRequest, "/");
> +               Url clientUrl = webRequest.getClientUrl();
> +               assertEquals("request/Uri?some=parameter", 
> clientUrl.toString());
>
> -               errorAttributes = ErrorAttributes.of(httpServletRequest);
> +               // simulates a request that has errors metadata
> +               httpRequest.setAttribute("javax.servlet.error.request_uri",
> +                       "/" + httpRequest.getContextPath() + 
> "/any/source/of/error");
> +               ServletWebRequest errorWebRequest = new 
> ServletWebRequest(httpRequest, "/");
> +               Url errorClientUrl = errorWebRequest.getClientUrl();
>
> -               if (url != null)
> -               {
> -                       this.url = url;
> -               }
> -               else
> -               {
> -                       this.url = getUrl(httpServletRequest, filterPrefix);
> -               }
> +               assertEquals("any/source/of/error", 
> errorClientUrl.toString());
>        }
>
>        /**
> -        * Returns base url without context or filter mapping.
> -        * <p>
> -        * Example: if current url is
> -        *
> -        * <pre>
> -        * 
> http://localhost:8080/context/filter/mapping/wicket/bookmarkable/com.foo.Page?1&id=2
> -        * </pre>
> -        *
> -        * the base url is <em>wicket/bookmarkable/com.foo.Page</em>
> -        * </p>
> -        *
> -        * @see org.apache.wicket.request.Request#getClientUrl()
> +        * <a 
> href="https://issues.apache.org/jira/browse/WICKET-4168";>WICKET-4168</a>
>         */
> -       @Override
> -       public Url getClientUrl()
> +       @Test
> +       public void testClientURLIsContextRelativeInErrorResponses()
>        {
> -               if (errorAttributes != null && 
> !Strings.isEmpty(errorAttributes.getRequestUri()))
> -               {
> -                       return 
> setParameters(Url.parse(errorAttributes.getRequestUri(), getCharset()));
> -               }
> -               else if (!isAjax())
> -               {
> -                       return getUrl(httpServletRequest, filterPrefix);
> -               }
> -               else
> -               {
> -                       String base = null;
> +               MockHttpServletRequest httpRequest = new 
> MockHttpServletRequest(null, null, null);
> +               httpRequest.setURL(httpRequest.getContextPath() + 
> "/request/Uri");
>
> -                       base = getHeader(HEADER_AJAX_BASE_URL);
> +               String problematiURI = httpRequest.getContextPath() + 
> "/any/source/of/error";
>
> -                       if (base == null)
> -                       {
> -                               base = 
> getRequestParameters().getParameterValue(PARAM_AJAX_BASE_URL).toString(null);
> -                       }
> +               httpRequest.setAttribute("javax.servlet.error.request_uri", 
> problematiURI);
>
> -                       Checks.notNull(base, "Current ajax request is missing 
> the base url header or parameter");
> +               ServletWebRequest errorWebRequest = new 
> ServletWebRequest(httpRequest, "");
>
> -                       return setParameters(Url.parse(base, getCharset()));
> -               }
> -       }
> +               Url errorClientUrl = errorWebRequest.getClientUrl();
>
> -       private Url setParameters(Url url)
> -       {
> -               url.setPort(httpServletRequest.getServerPort());
> -               url.setHost(httpServletRequest.getServerName());
> -               url.setProtocol(httpServletRequest.getScheme());
> -               return url;
> -       }
> +               assertEquals("any/source/of/error", 
> errorClientUrl.toString());
>
> -       private Url getUrl(HttpServletRequest request, String filterPrefix)
> -       {
> -               if (filterPrefix.length() > 0 && !filterPrefix.endsWith("/"))
> -               {
> -                       filterPrefix += "/";
> -               }
> -               StringBuilder url = new StringBuilder();
> -               String uri = request.getRequestURI();
> -               uri = Strings.stripJSessionId(uri);
> -               final int start = request.getContextPath().length() + 
> filterPrefix.length() + 1;
> -               url.append(uri.substring(start));
> -
> -               if (errorAttributes == null)
> -               {
> -                       String query = request.getQueryString();
> -                       if (!Strings.isEmpty(query))
> -                       {
> -                               url.append('?');
> -                               url.append(query);
> -                       }
> -               }
> -
> -               return setParameters(Url.parse(url.toString(), getCharset()));
>        }
>
>        /**
> -        * Returns the prefix of Wicket filter (without the leading /)
> -        *
> -        * @return Wicket filter prefix
> +        * https://issues.apache.org/jira/browse/WICKET-4123
>         */
> -       public String getFilterPrefix()
> -       {
> -               return filterPrefix;
> -       }
> -
> -       @Override
> -       public List<Cookie> getCookies()
> -       {
> -               Cookie[] cookies = httpServletRequest.getCookies();
> -               List<Cookie> result = (cookies == null) ? 
> Collections.<Cookie> emptyList()
> -                       : Arrays.asList(cookies);
> -               return Collections.unmodifiableList(result);
> -       }
> -
> -
> -       @Override
> -       public Locale getLocale()
> -       {
> -               return httpServletRequest.getLocale();
> -       }
> -
> -       @Override
> -       public Time getDateHeader(String name)
> -       {
> -               try
> -               {
> -                       long value = httpServletRequest.getDateHeader(name);
> -
> -                       if (value == -1)
> -                       {
> -                               return null;
> -                       }
> -
> -                       return Time.millis(value);
> -               }
> -               catch (IllegalArgumentException e)
> -               {
> -                       // per spec thrown if the header contains a value 
> that cannot be converted to a date
> -                       return null;
> -               }
> -       }
> -
> -       @Override
> -       public String getHeader(String name)
> +       @Test
> +       public void useCustomServletWebRequest()
>        {
> -               return httpServletRequest.getHeader(name);
> -       }
> -
> -       @SuppressWarnings("unchecked")
> -       @Override
> -       public List<String> getHeaders(String name)
> -       {
> -               List<String> result = new ArrayList<String>();
> -               Enumeration<String> e = httpServletRequest.getHeaders(name);
> -               while (e.hasMoreElements())
> -               {
> -                       result.add(e.nextElement());
> -               }
> -               return Collections.unmodifiableList(result);
> -       }
> -
> -       private Map<String, List<StringValue>> postParameters = null;
> -
> -       private static boolean isMultiPart(ServletRequest request)
> -       {
> -               String contentType = request.getContentType();
> -               return contentType != null && 
> contentType.toLowerCase().contains("multipart");
> -       }
> -
> -       protected Map<String, List<StringValue>> generatePostParameters()
> -       {
> -               Map<String, List<StringValue>> postParameters = new 
> HashMap<String, List<StringValue>>();
> -
> -               IRequestParameters queryParams = getQueryParameters();
> -
> -               @SuppressWarnings("unchecked")
> -               Map<String, String[]> params = 
> getContainerRequest().getParameterMap();
> -               for (Map.Entry<String, String[]> param : params.entrySet())
> +               WebApplication application = new WebApplication()
>                {
> -                       final String name = param.getKey();
> -                       final String[] values = param.getValue();
> -
> -                       // build a mutable list of query params that have the 
> same name as the post param
> -                       List<StringValue> queryValues = 
> queryParams.getParameterValues(name);
> -                       if (queryValues == null)
> -                       {
> -                               queryValues = Collections.emptyList();
> -                       }
> -                       else
> -                       {
> -                               queryValues = new 
> ArrayList<StringValue>(queryValues);
> -                       }
> -
> -                       // the list that will contain accepted post param 
> values
> -                       List<StringValue> postValues = new 
> ArrayList<StringValue>();
> -
> -                       for (String value : values)
> +                       @Override
> +                       public Class<? extends Page> getHomePage()
>                        {
> -                               StringValue val = StringValue.valueOf(value);
> -                               if (queryValues.contains(val))
> -                               {
> -                                       // if a query param with this value 
> exists remove it and continue
> -                                       queryValues.remove(val);
> -                               }
> -                               else
> -                               {
> -                                       // there is no query param with this 
> value, assume post
> -                                       postValues.add(val);
> -                               }
> +                               return CustomRequestPage.class;
>                        }
>
> -                       if (!postValues.isEmpty())
> +                       @Override
> +                       protected WebRequest newWebRequest(HttpServletRequest 
> servletRequest, String filterPath)
>                        {
> -                               postParameters.put(name, postValues);
> +                               return new 
> CustomServletWebRequest(servletRequest, filterPath);
>                        }
> -               }
> -               return postParameters;
> -       }
> +               };
>
> -       private Map<String, List<StringValue>> getPostRequestParameters()
> -       {
> -               if (postParameters == null)
> -               {
> -                       postParameters = generatePostParameters();
> -               }
> -               return postParameters;
> +               WicketTester tester = new WicketTester(application);
> +               tester.startPage(new CustomRequestPage());
>        }
>
> -       private final IRequestParameters postRequestParameters = new 
> IWritableRequestParameters()
> +       private static class CustomRequestPage extends WebPage implements 
> IMarkupResourceStreamProvider
>        {
> -               public void reset()
> -               {
> -                       getPostRequestParameters().clear();
> -               }
> +               private static final long serialVersionUID = 1L;
>
> -               public void setParameterValues(String key, List<StringValue> 
> values)
> +               private CustomRequestPage()
>                {
> -                       getPostRequestParameters().put(key, values);
> +                       assertTrue(getRequest() instanceof 
> CustomServletWebRequest);
>                }
>
> -               public Set<String> getParameterNames()
> +               public IResourceStream 
> getMarkupResourceStream(MarkupContainer container,
> +                       Class<?> containerClass)
>                {
> -                       return 
> Collections.unmodifiableSet(getPostRequestParameters().keySet());
> +                       return new StringResourceStream("<html></html>");
>                }
> -
> -               public StringValue getParameterValue(String name)
> -               {
> -                       List<StringValue> values = 
> getPostRequestParameters().get(name);
> -                       if (values == null || values.isEmpty())
> -                       {
> -                               return StringValue.valueOf((String)null);
> -                       }
> -                       else
> -                       {
> -                               return values.iterator().next();
> -                       }
> -               }
> -
> -               public List<StringValue> getParameterValues(String name)
> -               {
> -                       List<StringValue> values = 
> getPostRequestParameters().get(name);
> -                       if (values != null)
> -                       {
> -                               values = Collections.unmodifiableList(values);
> -                       }
> -                       return values;
> -               }
> -       };
> -
> -       @Override
> -       public IRequestParameters getPostParameters()
> -       {
> -               return postRequestParameters;
> -       }
> -
> -       @Override
> -       public Url getUrl()
> -       {
> -               return new Url(url);
>        }
>
> -       @Override
> -       public ServletWebRequest cloneWithUrl(Url url)
> +       private static class CustomServletWebRequest extends ServletWebRequest
>        {
> -               return new ServletWebRequest(httpServletRequest, 
> filterPrefix, url)
> +               public CustomServletWebRequest(HttpServletRequest 
> httpServletRequest, String filterPrefix)
>                {
> -                       @Override
> -                       public IRequestParameters getPostParameters()
> -                       {
> -                               // don't parse post parameters again
> -                               return 
> ServletWebRequest.this.getPostParameters();
> -                       }
> -               };
> -       }
> -
> -       /**
> -        * Creates multipart web request from this request.
> -        *
> -        * @param maxSize
> -        * @param upload
> -        *            upload identifier for {@link UploadInfo}
> -        * @return multipart request
> -        * @throws FileUploadException
> -        */
> -       public MultipartServletWebRequest newMultipartWebRequest(Bytes 
> maxSize, String upload)
> -               throws FileUploadException
> -       {
> -               return new 
> MultipartServletWebRequestImpl(getContainerRequest(), filterPrefix, maxSize,
> -                       upload);
> -       }
> -
> -       /**
> -        * Creates multipart web request from this request.
> -        *
> -        * @param maxSize
> -        * @param upload
> -        *            upload identifier for {@link UploadInfo}
> -        * @param factory
> -        * @return multipart request
> -        * @throws FileUploadException
> -        */
> -       public MultipartServletWebRequest newMultipartWebRequest(Bytes 
> maxSize, String upload,
> -               FileItemFactory factory) throws FileUploadException
> -       {
> -               return new 
> MultipartServletWebRequestImpl(getContainerRequest(), filterPrefix, maxSize,
> -                       upload, factory);
> -       }
> -
> -       private static final Logger logger = 
> LoggerFactory.getLogger(ServletWebRequest.class);
> -
> -       @Override
> -       public String getPrefixToContextPath()
> -       {
> -               PrependingStringBuffer buffer = new PrependingStringBuffer();
> -               Url filterPrefixUrl = Url.parse(filterPrefix, getCharset());
> -               for (int i = 0; i < filterPrefixUrl.getSegments().size() - 1; 
> ++i)
> -               {
> -                       buffer.prepend("../");
> +                       super(httpServletRequest, filterPrefix);
>                }
> -               return buffer.toString();
> -       }
> -
> -       @Override
> -       public Charset getCharset()
> -       {
> -               return RequestUtils.getCharset(httpServletRequest);
> -       }
> -
> -       @Override
> -       public HttpServletRequest getContainerRequest()
> -       {
> -               return httpServletRequest;
> -       }
> -
> -       @Override
> -       public String getContextPath()
> -       {
> -               return 
> UrlUtils.normalizePath(httpServletRequest.getContextPath());
> -       }
> -
> -       @Override
> -       public String getFilterPath()
> -       {
> -               return UrlUtils.normalizePath(filterPrefix);
> -       }
> -
> -       @Override
> -       public boolean shouldPreserveClientUrl()
> -       {
> -               return errorAttributes != null && 
> !Strings.isEmpty(errorAttributes.getRequestUri());
>        }
>  }
>
> Modified: 
> wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java
> URL: 
> http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java?rev=1190589&r1=1190588&r2=1190589&view=diff
> ==============================================================================
> --- 
> wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java
>  (original)
> +++ 
> wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/servlet/ServletWebRequestTest.java
>  Fri Oct 28 21:31:23 2011
> @@ -54,12 +54,34 @@ public class ServletWebRequestTest exten
>                Url clientUrl = webRequest.getClientUrl();
>                assertEquals("request/Uri?some=parameter", 
> clientUrl.toString());
>
> -               // error dispatched
> -               httpRequest.setAttribute("javax.servlet.error.request_uri", 
> "/some/error/url");
> +               // simulates a request that has errors metadata
> +               httpRequest.setAttribute("javax.servlet.error.request_uri",
> +                       "/" + httpRequest.getContextPath() + 
> "/any/source/of/error");
>                ServletWebRequest errorWebRequest = new 
> ServletWebRequest(httpRequest, "/");
>                Url errorClientUrl = errorWebRequest.getClientUrl();
>
> -               assertEquals("/some/error/url", errorClientUrl.toString());
> +               assertEquals("any/source/of/error", 
> errorClientUrl.toString());
> +       }
> +
> +       /**
> +        * <a 
> href="https://issues.apache.org/jira/browse/WICKET-4168";>WICKET-4168</a>
> +        */
> +       @Test
> +       public void testClientURLIsContextRelativeInErrorResponses()
> +       {
> +               MockHttpServletRequest httpRequest = new 
> MockHttpServletRequest(null, null, null);
> +               httpRequest.setURL(httpRequest.getContextPath() + 
> "/request/Uri");
> +
> +               String problematiURI = httpRequest.getContextPath() + 
> "/any/source/of/error";
> +
> +               httpRequest.setAttribute("javax.servlet.error.request_uri", 
> problematiURI);
> +
> +               ServletWebRequest errorWebRequest = new 
> ServletWebRequest(httpRequest, "");
> +
> +               Url errorClientUrl = errorWebRequest.getClientUrl();
> +
> +               assertEquals("any/source/of/error", 
> errorClientUrl.toString());
> +
>        }
>
>        /**
>
>
>



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com

Reply via email to