Author: pete
Date: Sat Jun 25 02:24:38 2011
New Revision: 1139481
URL: http://svn.apache.org/viewvc?rev=1139481&view=rev
Log:
WICKET-3834 WicketTester does not follow absolute redirects
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java
- copied, changed from r1139475,
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java?rev=1139481&r1=1139480&r2=1139481&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
Sat Jun 25 02:24:38 2011
@@ -598,15 +598,31 @@ public class BaseWicketTester
if (newUrl.isAbsolute())
{
- fail("Can not follow absolute redirect
URL.");
+ request.setUrl(newUrl);
+
+ if (newUrl.getProtocol() != null)
+ {
+
request.setScheme(newUrl.getProtocol());
+ }
+ if (newUrl.getHost() != null)
+ {
+
request.setServerName(newUrl.getHost());
+ }
+ if (newUrl.getPort() != null)
+ {
+
request.setServerPort(newUrl.getPort());
+ }
}
+ else
+ {
+ // append redirect URL to current URL
(what browser would do)
+ Url mergedURL = new
Url(lastRequest.getUrl().getSegments(),
+ newUrl.getQueryParameters());
+
mergedURL.concatSegments(newUrl.getSegments());
- // append redirect URL to current URL (what
browser would do)
- Url mergedURL = new
Url(lastRequest.getUrl().getSegments(),
- newUrl.getQueryParameters());
- mergedURL.concatSegments(newUrl.getSegments());
+ request.setUrl(mergedURL);
+ }
- request.setUrl(mergedURL);
processRequest(null, null, true);
--redirectCount;
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html?rev=1139481&view=auto
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html
(added)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.html
Sat Jun 25 02:24:38 2011
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+<head>
+ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+ <title>Secure Page</title>
+</head>
+<body>
+ insecure page
+</body>
+</html>
\ No newline at end of file
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java?rev=1139481&view=auto
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java
(added)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpPage.java
Sat Jun 25 02:24:38 2011
@@ -0,0 +1,24 @@
+/*
+ * 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.protocol.https;
+
+import org.apache.wicket.markup.html.WebPage;
+
+public class HttpPage extends WebPage
+{
+ private static final long serialVersionUID = 1L;
+}
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java?rev=1139481&view=auto
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java
(added)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplication.java
Sat Jun 25 02:24:38 2011
@@ -0,0 +1,53 @@
+/*
+ * 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.protocol.https;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.protocol.http.WebApplication;
+
+public class HttpsMapperApplication extends WebApplication
+{
+ private HttpsConfig config;
+
+ public HttpsMapperApplication(int httpPort, int httpsPort)
+ {
+ config = new HttpsConfig(httpPort, httpsPort);
+ }
+
+ public HttpsMapperApplication()
+ {
+ config = new HttpsConfig();
+ }
+
+ @Override
+ protected void init()
+ {
+ super.init();
+
+ mountPage("/secure", HttpsPage.class);
+ mountPage("/insecure", HttpPage.class);
+
+ setRootRequestMapper(new HttpsMapper(getRootRequestMapper(),
config));
+ }
+
+
+ @Override
+ public Class<? extends Page> getHomePage()
+ {
+ return HttpsPage.class;
+ }
+}
Copied:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java
(from r1139475,
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java)
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java?p2=wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java&p1=wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java&r1=1139475&r2=1139481&rev=1139481&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
(original)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsMapperApplicationTest.java
Sat Jun 25 02:24:38 2011
@@ -16,56 +16,103 @@
*/
package org.apache.wicket.protocol.https;
-import org.apache.wicket.WicketTestCase;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.handler.IPageRequestHandler;
+import org.apache.wicket.Page;
+import org.apache.wicket.util.tester.WicketTester;
import org.junit.Test;
-import org.mockito.Mockito;
+
+import static org.junit.Assert.*;
/**
- * Test for {@link HttpsRequestChecker}
+ * Test for proper switching of http and https in {@link WicketTester}
*/
-public class HttpsRequestCheckerTest extends WicketTestCase
+public class HttpsMapperApplicationTest
{
+ @SuppressWarnings({"unchecked"})
+ private <T extends Page> T requestPage(WicketTester tester, Class<T>
pageClass)
+ {
+ Page page = tester.startPage(pageClass);
+ tester.assertRenderedPage(pageClass);
+ assertNotNull(page);
+ assertEquals(pageClass, page.getClass());
+ assertEquals(page, tester.getLastRenderedPage());
+ return (T)page;
+ }
+
+ @Test
+ public void switchDefaultToHttpsWithDefaultPorts()
+ {
+ WicketTester tester = new WicketTester(new
HttpsMapperApplication());
+
+ requestPage(tester, HttpsPage.class);
+
+ assertEquals("https", tester.getLastRequest().getScheme());
+ assertEquals(443, tester.getLastRequest().getServerPort());
+ }
+
+ @Test
+ public void switchDefaultToHttpsWithCustomPort()
+ {
+ WicketTester tester = new WicketTester(new
HttpsMapperApplication(123, 456));
+
+ requestPage(tester, HttpsPage.class);
+
+ assertEquals("https", tester.getLastRequest().getScheme());
+ assertEquals(456, tester.getLastRequest().getServerPort());
+ }
- /**
- * Asserts that
- * {@link
HttpsRequestChecker#checkSecureIncoming(org.apache.wicket.request.IRequestHandler,
HttpsConfig)}
- * returns {@link SwitchProtocolRequestHandler} for pages annotated
with {@link RequireHttps} or
- * returns the original {@link IRequestHandler} for pages that are not
annotated with
- * {@link RequireHttps}
- */
@Test
- public void checkSecureIncoming()
+ public void switchHttpsToHttpWithDefaultPorts()
{
- HttpsRequestChecker checker = new HttpsRequestChecker();
+ WicketTester tester = new WicketTester(new
HttpsMapperApplication());
- IPageRequestHandler httpsPageRequestHandler =
Mockito.mock(IPageRequestHandler.class);
-
Mockito.doReturn(HttpsPage.class).when(httpsPageRequestHandler).getPageClass();
+ tester.getRequest().setScheme("https");
+ tester.getRequest().setServerPort(443);
+
+ requestPage(tester, HttpPage.class);
+
+ assertEquals("http", tester.getLastRequest().getScheme());
+ assertEquals(80, tester.getLastRequest().getServerPort());
+ }
- HttpsConfig httpsConfig = new HttpsConfig();
+ @Test
+ public void switchHttpsToHttpWithCustomPorts()
+ {
+ WicketTester tester = new WicketTester(new
HttpsMapperApplication(123, 456));
- IRequestHandler httpsPageSecureIncoming =
checker.checkSecureIncoming(
- httpsPageRequestHandler, httpsConfig);
- assertTrue(httpsPageSecureIncoming instanceof
SwitchProtocolRequestHandler);
+ tester.getRequest().setScheme("https");
+ tester.getRequest().setServerPort(443);
- IPageRequestHandler httpPageRequestHandler =
Mockito.mock(IPageRequestHandler.class);
-
Mockito.doReturn(HttpPage.class).when(httpsPageRequestHandler).getPageClass();
+ requestPage(tester, HttpPage.class);
- IRequestHandler httpPageSecureIncoming =
checker.checkSecureIncoming(
- httpPageRequestHandler, httpsConfig);
- assertSame(httpPageRequestHandler, httpPageSecureIncoming);
+ assertEquals("http", tester.getLastRequest().getScheme());
+ assertEquals(123, tester.getLastRequest().getServerPort());
}
- @RequireHttps
- private static class HttpsPage extends WebPage
+ @Test
+ public void switchHttpToHttpsWithDefaultPorts()
{
- private static final long serialVersionUID = 1L;
+ WicketTester tester = new WicketTester(new
HttpsMapperApplication());
+
+ tester.getRequest().setScheme("http");
+ tester.getRequest().setServerPort(80);
+
+ requestPage(tester, HttpsPage.class);
+
+ assertEquals("https", tester.getLastRequest().getScheme());
+ assertEquals(443, tester.getLastRequest().getServerPort());
}
- private static class HttpPage extends WebPage
+ @Test
+ public void switchHttpToHttpsWithCustomPorts()
{
- private static final long serialVersionUID = 1L;
+ WicketTester tester = new WicketTester(new
HttpsMapperApplication(123, 456));
+
+ tester.getRequest().setScheme("http");
+ tester.getRequest().setServerPort(123);
+
+ requestPage(tester, HttpsPage.class);
+
+ assertEquals("https", tester.getLastRequest().getScheme());
+ assertEquals(456, tester.getLastRequest().getServerPort());
}
}
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html?rev=1139481&view=auto
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html
(added)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.html
Sat Jun 25 02:24:38 2011
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html>
+<html xmlns:wicket="http://wicket.apache.org">
+<head>
+ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
+ <title>Secure Page</title>
+</head>
+<body>
+ secure page
+</body>
+</html>
\ No newline at end of file
Added:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java?rev=1139481&view=auto
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java
(added)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsPage.java
Sat Jun 25 02:24:38 2011
@@ -0,0 +1,25 @@
+/*
+ * 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.protocol.https;
+
+import org.apache.wicket.markup.html.WebPage;
+
+@RequireHttps
+public class HttpsPage extends WebPage
+{
+ private static final long serialVersionUID = 1L;
+}
Modified:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java?rev=1139481&r1=1139480&r2=1139481&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
(original)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/https/HttpsRequestCheckerTest.java
Sat Jun 25 02:24:38 2011
@@ -17,7 +17,6 @@
package org.apache.wicket.protocol.https;
import org.apache.wicket.WicketTestCase;
-import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.handler.IPageRequestHandler;
import org.junit.Test;
@@ -57,15 +56,4 @@ public class HttpsRequestCheckerTest ext
httpPageRequestHandler, httpsConfig);
assertSame(httpPageRequestHandler, httpPageSecureIncoming);
}
-
- @RequireHttps
- private static class HttpsPage extends WebPage
- {
- private static final long serialVersionUID = 1L;
- }
-
- private static class HttpPage extends WebPage
- {
- private static final long serialVersionUID = 1L;
- }
}
Modified:
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java?rev=1139481&r1=1139480&r2=1139481&view=diff
==============================================================================
---
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
(original)
+++
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
Sat Jun 25 02:24:38 2011
@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.lang.Generics;
@@ -105,6 +106,7 @@ public final class Url implements Serial
* Parses the given URL string.
*
* @param url
+ * absolute or relative url with query string
* @return Url object
*/
public static Url parse(final String url)
@@ -116,7 +118,7 @@ public final class Url implements Serial
* Parses the given URL string.
*
* @param url
- * full absolute or relative url with query string
+ * absolute or relative url with query string
* @param charset
* @return Url object
*/
@@ -154,12 +156,13 @@ public final class Url implements Serial
if (protocolAt != -1)
{
- result.protocol = absoluteUrl.substring(0, protocolAt);
+ result.protocol = absoluteUrl.substring(0,
protocolAt).toLowerCase(Locale.US);
final String afterProto =
absoluteUrl.substring(protocolAt + 3);
final String hostAndPort;
int relativeAt = afterProto.indexOf('/');
-
+
+
if (relativeAt == -1)
{
relativeUrl = "";
@@ -176,7 +179,7 @@ public final class Url implements Serial
if (portAt == -1)
{
result.host = hostAndPort;
- result.port = null;
+ result.port =
getDefaultPortForProtocol(result.protocol);
}
else
{
@@ -230,6 +233,33 @@ public final class Url implements Serial
}
/**
+ * get default port number for protocol
+ *
+ * @param protocol
+ * name of protocol
+ * @return default port for protocol or <code>null</code> if unknown
+ */
+ private static Integer getDefaultPortForProtocol(String protocol)
+ {
+ if ("http".equals(protocol))
+ {
+ return 80;
+ }
+ else if ("https".equals(protocol))
+ {
+ return 443;
+ }
+ else if ("ftp".equals(protocol))
+ {
+ return 21;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ /**
* Construct.
*/
public Url()
@@ -281,7 +311,7 @@ public final class Url implements Serial
*/
public Url(final List<String> segments, final Charset charset)
{
- this(segments, Collections.<QueryParameter> emptyList(),
charset);
+ this(segments, Collections.<QueryParameter>emptyList(),
charset);
}
/**
Modified:
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java?rev=1139481&r1=1139480&r2=1139481&view=diff
==============================================================================
---
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
(original)
+++
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/UrlTest.java
Sat Jun 25 02:24:38 2011
@@ -64,17 +64,31 @@ public class UrlTest extends Assert
assertTrue(url.isAbsolute());
url = Url.parse("https://myhost/foo");
- checkUrl(url, "https", "myhost", null, "", "foo");
+ checkUrl(url, "https", "myhost", 443, "", "foo");
assertTrue(url.isAbsolute());
url = Url.parse("https://myhost/foo:123");
- checkUrl(url, "https", "myhost", null, "", "foo:123");
+ checkUrl(url, "https", "myhost", 443, "", "foo:123");
assertTrue(url.isAbsolute());
+
+ url = Url.parse("ftp://myhost/foo");
+ checkUrl(url, "ftp", "myhost", 21, "", "foo");
+ assertTrue(url.isAbsolute());
+
+ url = Url.parse("FTp://myhost/foo");
+ checkUrl(url, "ftp", "myhost", 21, "", "foo");
+ assertTrue(url.isAbsolute());
+
+ url = Url.parse("unknown://myhost/foo");
+ checkUrl(url, "unknown", "myhost", null, "", "foo");
+ assertTrue(url.isAbsolute());
+
}
private void checkUrl(Url url, String protocol, String host, Integer
port, String... segments)
{
assertNotNull(url);
+ assertEquals(protocol, url.getProtocol());
assertEquals(host, url.getHost());
assertEquals(port, url.getPort());
assertEquals(Arrays.asList(segments), url.getSegments());