Updated Branches:
  refs/heads/master 7b31effcb -> 7428323ac

WICKET-4865 Page parameters not working with CryptoMapper


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

Branch: refs/heads/master
Commit: 7428323acc6c90b615f8967faed1d051a71d2493
Parents: 7b31eff
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Thu Nov 15 10:18:57 2012 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Thu Nov 15 10:18:57 2012 +0200

----------------------------------------------------------------------
 .../handler/RequestSettingRequestHandler.java      |   91 +++++++++++++++
 .../wicket/core/request/mapper/CryptoMapper.java   |   40 +++++-
 .../core/request/mapper/CryptoMapperTest.java      |   22 +++-
 .../org/apache/wicket/request/IRequestCycle.java   |   11 ++-
 .../java/org/apache/wicket/request/Request.java    |    2 +-
 5 files changed, 155 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RequestSettingRequestHandler.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RequestSettingRequestHandler.java
 
b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RequestSettingRequestHandler.java
new file mode 100644
index 0000000..06ee9aa
--- /dev/null
+++ 
b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/RequestSettingRequestHandler.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.IRequestHandlerDelegate;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * A {@link IRequestHandler} that sets the current {@link Request} before 
delegating the responding
+ * to a wrapped request handler. This is useful when the request received from 
the browser is not the same
+ * request used to respond, like when the request mapper clones the request 
with a new URL.
+ *
+ * @author Jesse Long
+ */
+public class RequestSettingRequestHandler implements IRequestHandlerDelegate
+{
+       private final Request request;
+       private final IRequestHandler delegate;
+
+       /**
+        * Creates a new instance
+        * @param request
+        *      The request to use when responding
+        * @param delegate
+        *      The request handler to delegate responding to
+        */
+       public RequestSettingRequestHandler(Request request, IRequestHandler 
delegate)
+       {
+               this.request = Args.notNull(request, "request");
+               this.delegate = Args.notNull(delegate,"delegate");
+       }
+
+       /**
+        * Returns the request that will be set before responding.
+        * @return the request that will be set before responding.
+        */
+       public Request getRequest()
+       {
+               return request;
+       }
+
+       /**
+        * Returns the request handler to which responding will be delegated.
+        * @return the request handler to which responding will be delegated.
+        */
+       @Override
+       public IRequestHandler getDelegateHandler()
+       {
+               return delegate;
+       }
+
+       @Override
+       public void respond(IRequestCycle requestCycle)
+       {
+               RequestCycle cycle = (RequestCycle) requestCycle;
+               Request originalRequest = cycle.getRequest();
+               try
+               {
+                       cycle.setRequest(request);
+                       delegate.respond(requestCycle);
+               }
+               finally
+               {
+                       cycle.setRequest(originalRequest);
+               }
+       }
+
+       @Override
+       public void detach(IRequestCycle requestCycle)
+       {
+               delegate.detach(requestCycle);
+       }
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java
 
b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java
index 03abefa..86c551a 100755
--- 
a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/CryptoMapper.java
@@ -19,6 +19,7 @@ package org.apache.wicket.core.request.mapper;
 import java.util.List;
 
 import org.apache.wicket.Application;
+import org.apache.wicket.core.request.handler.RequestSettingRequestHandler;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.Request;
@@ -110,7 +111,16 @@ public class CryptoMapper implements IRequestMapper
                        return wrappedMapper.mapRequest(request);
                }
 
-               return wrappedMapper.mapRequest(request.cloneWithUrl(url));
+               Request decryptedRequest = request.cloneWithUrl(url);
+
+               IRequestHandler handler = 
wrappedMapper.mapRequest(decryptedRequest);
+
+               if (handler != null)
+               {
+                   handler = new 
RequestSettingRequestHandler(decryptedRequest, handler);
+               }
+
+               return handler;
        }
 
        /**
@@ -132,7 +142,7 @@ public class CryptoMapper implements IRequestMapper
 
        private Url encryptUrl(final Url url)
        {
-               if (url.getSegments().isEmpty() && 
url.getQueryParameters().isEmpty())
+               if (url.getSegments().isEmpty())
                {
                        return url;
                }
@@ -152,20 +162,24 @@ public class CryptoMapper implements IRequestMapper
 
        private Url decryptUrl(final Request request, final Url encryptedUrl)
        {
+               /*
+                * If the encrypted URL has no segments it is the home page URL,
+                * and does not need decrypting.
+                */
                if (encryptedUrl.getSegments().isEmpty())
                {
                        return encryptedUrl;
                }
 
                List<String> encryptedSegments = encryptedUrl.getSegments();
-               if (encryptedSegments.size() < 1)
-               {
-                       return null;
-               }
 
                Url url = new Url(request.getCharset());
                try
                {
+                       /*
+                        * The first encrypted segment contains an encrypted 
version of the
+                        * entire plain text url.
+                        */
                        String encryptedUrlString = encryptedSegments.get(0);
                        if (Strings.isEmpty(encryptedUrlString))
                        {
@@ -195,12 +209,24 @@ public class CryptoMapper implements IRequestMapper
                                String encryptedSegment = 
encryptedSegments.get(segNo);
                                if (!next.equals(encryptedSegment))
                                {
+                                       /*
+                                        * This segment received from the 
browser is not the same as the
+                                        * expected segment generated by the 
HashSegmentGenerator. Hence it,
+                                        * and all subsequent segments are 
considered plain text siblings of the
+                                        * original encrypted url.
+                                        */
                                        break;
                                }
 
-                               // unmodified segment
+                               /*
+                                * This segments matches the expected checksum, 
so we add the corresponding
+                                * segment from the original URL.
+                                */
                                
url.getSegments().add(originalUrl.getSegments().get(segNo - 1));
                        }
+                       /*
+                        * Add all remaining segments from the encrypted url as 
plain text segments.
+                        */
                        for (; segNo < encryptedNumberOfSegments; segNo++)
                        {
                                // modified or additional segment

http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java
index 83a6d7c..da8e80de8 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/CryptoMapperTest.java
@@ -18,6 +18,7 @@ package org.apache.wicket.core.request.mapper;
 
 import org.apache.wicket.core.request.handler.PageProvider;
 import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
+import org.apache.wicket.core.request.handler.RequestSettingRequestHandler;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Request;
@@ -97,6 +98,8 @@ public class CryptoMapperTest extends AbstractMapperTest
        {
                Request request = getRequest(Url.parse(ENCRYPTED_URL));
                IRequestHandler requestHandler = mapper.mapRequest(request);
+               assertTrue(requestHandler instanceof 
RequestSettingRequestHandler);
+               requestHandler = 
((RequestSettingRequestHandler)requestHandler).getDelegateHandler();
                assertTrue(requestHandler instanceof RenderPageRequestHandler);
 
                RenderPageRequestHandler handler = 
(RenderPageRequestHandler)requestHandler;
@@ -112,6 +115,8 @@ public class CryptoMapperTest extends AbstractMapperTest
        {
                Request request = getRequest(Url.parse("?named1=value1"));
                IRequestHandler requestHandler = mapper.mapRequest(request);
+               assertTrue(requestHandler instanceof 
RequestSettingRequestHandler);
+               requestHandler = 
((RequestSettingRequestHandler)requestHandler).getDelegateHandler();
                assertTrue(requestHandler instanceof RenderPageRequestHandler);
 
                RenderPageRequestHandler handler = 
(RenderPageRequestHandler)requestHandler;
@@ -154,6 +159,8 @@ public class CryptoMapperTest extends AbstractMapperTest
 
                Request request = getRequest(url);
                IRequestHandler requestHandler = mapper.mapRequest(request);
+               assertTrue(requestHandler instanceof 
RequestSettingRequestHandler);
+               requestHandler = 
((RequestSettingRequestHandler)requestHandler).getDelegateHandler();
                assertTrue(requestHandler instanceof RenderPageRequestHandler);
 
                RenderPageRequestHandler handler = 
(RenderPageRequestHandler)requestHandler;
@@ -163,12 +170,13 @@ public class CryptoMapperTest extends AbstractMapperTest
        }
 
        /**
-        * https://issues.apache.org/jira/browse/WICKET-3926
+        * When the home page url is requested, with parameters, the url will 
contain only page parameters.
+        * It should not be encrypted, otherwise we get needless redirects.
         */
        @Test
        public void homePageWithParameters()
        {
-               String expectedEncrypted = "0lhSFdMIt3yZUNwbtLuXgDePMclxSbks";
+               String expectedEncrypted = "?namedKey1=namedValue1";
                PageParameters expectedParameters = new PageParameters();
                expectedParameters.add("namedKey1", "namedValue1");
 
@@ -179,6 +187,8 @@ public class CryptoMapperTest extends AbstractMapperTest
 
                Request request = getRequest(url);
                IRequestHandler requestHandler = mapper.mapRequest(request);
+               assertTrue(requestHandler instanceof 
RequestSettingRequestHandler);
+               requestHandler = 
((RequestSettingRequestHandler)requestHandler).getDelegateHandler();
                assertTrue(requestHandler instanceof RenderPageRequestHandler);
 
                RenderPageRequestHandler handler = 
(RenderPageRequestHandler)requestHandler;
@@ -201,6 +211,8 @@ public class CryptoMapperTest extends AbstractMapperTest
 
                IRequestHandler requestHandler = mapper.mapRequest(request);
 
+               assertTrue(requestHandler instanceof 
RequestSettingRequestHandler);
+               requestHandler = 
((RequestSettingRequestHandler)requestHandler).getDelegateHandler();
                assertTrue(requestHandler instanceof 
ResourceReferenceRequestHandler);
                ResourceReferenceRequestHandler handler = 
(ResourceReferenceRequestHandler)requestHandler;
 
@@ -224,6 +236,8 @@ public class CryptoMapperTest extends AbstractMapperTest
 
                IRequestHandler requestHandler = mapper.mapRequest(request);
 
+               assertTrue(requestHandler instanceof 
RequestSettingRequestHandler);
+               requestHandler = 
((RequestSettingRequestHandler)requestHandler).getDelegateHandler();
                assertTrue(requestHandler instanceof 
ResourceReferenceRequestHandler);
                ResourceReferenceRequestHandler handler = 
(ResourceReferenceRequestHandler)requestHandler;
 
@@ -248,6 +262,8 @@ public class CryptoMapperTest extends AbstractMapperTest
 
                IRequestHandler requestHandler = mapper.mapRequest(request);
 
+               assertTrue(requestHandler instanceof 
RequestSettingRequestHandler);
+               requestHandler = 
((RequestSettingRequestHandler)requestHandler).getDelegateHandler();
                assertTrue(requestHandler instanceof 
ResourceReferenceRequestHandler);
                ResourceReferenceRequestHandler handler = 
(ResourceReferenceRequestHandler)requestHandler;
 
@@ -272,6 +288,8 @@ public class CryptoMapperTest extends AbstractMapperTest
 
                IRequestHandler requestHandler = mapper.mapRequest(request);
 
+               assertTrue(requestHandler instanceof 
RequestSettingRequestHandler);
+               requestHandler = 
((RequestSettingRequestHandler)requestHandler).getDelegateHandler();
                assertTrue(requestHandler instanceof 
ResourceReferenceRequestHandler);
                ResourceReferenceRequestHandler handler = 
(ResourceReferenceRequestHandler)requestHandler;
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java 
b/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java
index 3b3870d..1aebc47 100755
--- a/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/IRequestCycle.java
@@ -29,7 +29,7 @@ public interface IRequestCycle
        Response getResponse();
 
        /**
-        * Replaces current {@link Response} with new {@link Response} 
instance. The original response
+        * Replaces the current {@link Response} with new {@link Response} 
instance. The original response
         * is always restored after the {@link 
IRequestHandler#respond(IRequestCycle)} method is
         * finished.
         * 
@@ -39,6 +39,15 @@ public interface IRequestCycle
        Response setResponse(Response response);
 
        /**
+        * TODO Wicket 7
+        * Add the following method to the API:
+        *
+        * Replaces the current {@link Request} with a new one.
+        * @return the previous request
+        */
+//     Request setRequest(Request request);
+
+       /**
         * @return the request that originated this cycle
         */
        Request getRequest();

http://git-wip-us.apache.org/repos/asf/wicket/blob/7428323a/wicket-request/src/main/java/org/apache/wicket/request/Request.java
----------------------------------------------------------------------
diff --git 
a/wicket-request/src/main/java/org/apache/wicket/request/Request.java 
b/wicket-request/src/main/java/org/apache/wicket/request/Request.java
index 67fe851..95d24cc 100644
--- a/wicket-request/src/main/java/org/apache/wicket/request/Request.java
+++ b/wicket-request/src/main/java/org/apache/wicket/request/Request.java
@@ -187,7 +187,7 @@ public abstract class Request
                        @Override
                        public Url getClientUrl()
                        {
-                               return getUrl();
+                               return Request.this.getClientUrl();
                        }
 
                        @Override

Reply via email to