/*
* $Header: /home/data/cvs/rt/org.eclipse.ecf/tests/bundles/org.eclipse.ecf.tests.apache.httpclient.server/src/org/apache/commons/httpclient/TestRedirects.java,v 1.1 2009/02/13 18:07:50 slewis Exp $
* $Revision: 1.1 $
* $Date: 2009/02/13 18:07:50 $
* ====================================================================
*
* Copyright 1999-2004 The Apache Software Foundation
*
* Licensed 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.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.commons.httpclient;
import java.io.IOException;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.params.HttpClientParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.server.HttpService;
import org.apache.commons.httpclient.server.RequestLine;
import org.apache.commons.httpclient.server.SimpleHttpServer;
import org.apache.commons.httpclient.server.SimpleRequest;
import org.apache.commons.httpclient.server.SimpleResponse;
/**
* Redirection test cases.
*
* @author Oleg Kalnichevski
*
* @version $Id: TestRedirects.java,v 1.1 2009/02/13 18:07:50 slewis Exp $
*/
public class TestRedirects extends HttpClientTestBase {
// ------------------------------------------------------------ Constructor
public TestRedirects(final String testName) throws IOException {
super(testName);
}
// ------------------------------------------------------------------- Main
public static void main(String args[]) {
String[] testCaseName = { TestRedirects.class.getName() };
junit.textui.TestRunner.main(testCaseName);
}
// ------------------------------------------------------- TestCase Methods
public static Test suite() {
TestSuite suite = new TestSuite(TestRedirects.class);
ProxyTestDecorator.addTests(suite);
return suite;
}
private class BasicRedirectService implements HttpService {
private int statuscode = HttpStatus.SC_MOVED_TEMPORARILY;
private String host = null;
private int port;
public BasicRedirectService(final String host, int port, int statuscode) {
super();
this.host = host;
this.port = port;
if (statuscode > 0) {
this.statuscode = statuscode;
}
}
public BasicRedirectService(final String host, int port) {
this(host, port, -1);
}
public boolean process(final SimpleRequest request, final SimpleResponse response)
throws IOException {
RequestLine reqline = request.getRequestLine();
HttpVersion ver = reqline.getHttpVersion();
if (reqline.getUri().equals("/oldlocation/")) {
response.setStatusLine(ver, this.statuscode);
response.addHeader(new Header("Location",
"http://" + this.host + ":" + this.port + "/newlocation/"));
response.addHeader(new Header("Connection", "close"));
} else if (reqline.getUri().equals("/newlocation/")) {
response.setStatusLine(ver, HttpStatus.SC_OK);
response.setBodyString("Successful redirect");
} else {
response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
}
return true;
}
}
private class CircularRedirectService implements HttpService {
private int invocations = 0;
public CircularRedirectService() {
super();
}
public boolean process(final SimpleRequest request, final SimpleResponse response)
throws IOException
{
RequestLine reqline = request.getRequestLine();
HttpVersion ver = reqline.getHttpVersion();
if (reqline.getUri().startsWith("/circular-oldlocation")) {
response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
response.addHeader(new Header("Location", "/circular-location2?invk=" + (++this.invocations)));
} else if (reqline.getUri().startsWith("/circular-location2")) {
response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
response.addHeader(new Header("Location", "/circular-oldlocation?invk=" + (++this.invocations)));
} else {
response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
}
return true;
}
}
private class RelativeRedirectService implements HttpService {
public RelativeRedirectService() {
super();
}
public boolean process(final SimpleRequest request, final SimpleResponse response)
throws IOException
{
RequestLine reqline = request.getRequestLine();
HttpVersion ver = reqline.getHttpVersion();
if (reqline.getUri().equals("/oldlocation/")) {
response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
response.addHeader(new Header("Location", "/relativelocation/"));
} else if (reqline.getUri().equals("/relativelocation/")) {
response.setStatusLine(ver, HttpStatus.SC_OK);
response.setBodyString("Successful redirect");
} else {
response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
}
return true;
}
}
private class BogusRedirectService implements HttpService {
private String url;
public BogusRedirectService(String redirectUrl) {
super();
this.url = redirectUrl;
}
public boolean process(final SimpleRequest request, final SimpleResponse response)
throws IOException {
RequestLine reqline = request.getRequestLine();
HttpVersion ver = reqline.getHttpVersion();
if (reqline.getUri().equals("/oldlocation/")) {
response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
response.addHeader(new Header("Location", url));
} else if (reqline.getUri().equals("/relativelocation/")) {
response.setStatusLine(ver, HttpStatus.SC_OK);
response.setBodyString("Successful redirect");
} else {
response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
}
return true;
}
}
public void testBasicRedirect300() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(
new BasicRedirectService(host, port, HttpStatus.SC_MULTIPLE_CHOICES));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(false);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_MULTIPLE_CHOICES, httpget.getStatusCode());
assertEquals("/oldlocation/", httpget.getPath());
assertEquals(new URI("/oldlocation/", false), httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testBasicRedirect301() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(
new BasicRedirectService(host, port, HttpStatus.SC_MOVED_PERMANENTLY));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
assertEquals("/newlocation/", httpget.getPath());
assertEquals(host, httpget.getURI().getHost());
assertEquals(port, httpget.getURI().getPort());
assertEquals(new URI("http://" + host + ":" + port + "/newlocation/", false), httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testBasicRedirect302() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(
new BasicRedirectService(host, port, HttpStatus.SC_MOVED_TEMPORARILY));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
assertEquals("/newlocation/", httpget.getPath());
assertEquals(host, httpget.getURI().getHost());
assertEquals(port, httpget.getURI().getPort());
assertEquals(new URI("http://" + host + ":" + port + "/newlocation/", false), httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testBasicRedirect303() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(
new BasicRedirectService(host, port, HttpStatus.SC_SEE_OTHER));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
assertEquals("/newlocation/", httpget.getPath());
assertEquals(host, httpget.getURI().getHost());
assertEquals(port, httpget.getURI().getPort());
assertEquals(new URI("http://" + host + ":" + port + "/newlocation/", false), httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testBasicRedirect304() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(
new BasicRedirectService(host, port, HttpStatus.SC_NOT_MODIFIED));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_NOT_MODIFIED, httpget.getStatusCode());
assertEquals("/oldlocation/", httpget.getPath());
assertEquals(new URI("/oldlocation/", false), httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testBasicRedirect305() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(
new BasicRedirectService(host, port, HttpStatus.SC_USE_PROXY));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_USE_PROXY, httpget.getStatusCode());
assertEquals("/oldlocation/", httpget.getPath());
assertEquals(new URI("/oldlocation/", false), httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testBasicRedirect307() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(
new BasicRedirectService(host, port, HttpStatus.SC_TEMPORARY_REDIRECT));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
assertEquals("/newlocation/", httpget.getPath());
assertEquals(host, httpget.getURI().getHost());
assertEquals(port, httpget.getURI().getPort());
assertEquals(new URI("http://" + host + ":" + port + "/newlocation/", false), httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testNoRedirect() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(new BasicRedirectService(host, port));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(false);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, httpget.getStatusCode());
assertEquals("/oldlocation/", httpget.getPath());
assertEquals(new URI("/oldlocation/", false), httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testMaxRedirectCheck() throws IOException {
this.server.setHttpService(new CircularRedirectService());
GetMethod httpget = new GetMethod("/circular-oldlocation/");
try {
this.client.getParams().setBooleanParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, true);
this.client.getParams().setIntParameter(HttpClientParams.MAX_REDIRECTS, 5);
this.client.executeMethod(httpget);
fail("RedirectException exception should have been thrown");
}
catch (RedirectException e) {
// expected
} finally {
httpget.releaseConnection();
}
}
public void testCircularRedirect() throws IOException {
this.server.setHttpService(new CircularRedirectService());
GetMethod httpget = new GetMethod("/circular-oldlocation/");
try {
this.client.getParams().setBooleanParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, false);
this.client.executeMethod(httpget);
fail("CircularRedirectException exception should have been thrown");
} catch (CircularRedirectException expected) {
} finally {
httpget.releaseConnection();
}
}
public void testPostRedirect() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(new BasicRedirectService(host, port));
PostMethod httppost = new PostMethod("/oldlocation/");
httppost.setRequestEntity(new StringRequestEntity("stuff"));
try {
this.client.executeMethod(httppost);
assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, httppost.getStatusCode());
assertEquals("/oldlocation/", httppost.getPath());
assertEquals(new URI("/oldlocation/", false), httppost.getURI());
} finally {
httppost.releaseConnection();
}
}
public void testRelativeRedirect() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(new RelativeRedirectService());
this.client.getParams().setBooleanParameter(
HttpClientParams.REJECT_RELATIVE_REDIRECT, false);
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
assertEquals("/relativelocation/", httpget.getPath());
assertEquals(host, httpget.getURI().getHost());
assertEquals(port, httpget.getURI().getPort());
assertEquals(new URI("http://" + host + ":" + port + "/relativelocation/", false),
httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testRejectRelativeRedirect() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(new RelativeRedirectService());
this.client.getParams().setBooleanParameter(
HttpClientParams.REJECT_RELATIVE_REDIRECT, true);
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_MOVED_TEMPORARILY, httpget.getStatusCode());
assertEquals("/oldlocation/", httpget.getPath());
assertEquals(new URI("/oldlocation/", false), httpget.getURI());
} finally {
httpget.releaseConnection();
}
}
public void testRejectBogusRedirectLocation() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(new BogusRedirectService("xxx://bogus"));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
fail("BogusRedirectService should have been thrown");
} catch (IllegalStateException e) {
//expected
} finally {
httpget.releaseConnection();
}
}
public void testCrossSiteRedirect() throws IOException {
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
SimpleHttpServer thatserver = new SimpleHttpServer();
this.server.setHttpService(new BasicRedirectService(host, port));
thatserver.setHttpService(new BasicRedirectService(host, port));
thatserver.setTestname(getName());
HostConfiguration hostconfig = new HostConfiguration();
hostconfig.setHost(
thatserver.getLocalAddress(),
thatserver.getLocalPort(),
Protocol.getProtocol("http"));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(hostconfig, httpget);
assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
assertEquals("/newlocation/", httpget.getPath());
assertEquals(host, httpget.getURI().getHost());
assertEquals(port, httpget.getURI().getPort());
assertEquals(new URI("http://" + host + ":" + port + "/newlocation/", false),
httpget.getURI());
} finally {
httpget.releaseConnection();
}
thatserver.destroy();
}
public void testRedirectWithCookie() throws IOException {
client.getState().addCookie(new Cookie("localhost", "name", "value", "/", -1, false));
String host = this.server.getLocalAddress();
int port = this.server.getLocalPort();
this.server.setHttpService(new BasicRedirectService(host, port));
GetMethod httpget = new GetMethod("/oldlocation/");
httpget.setFollowRedirects(true);
try {
this.client.executeMethod(httpget);
assertEquals(HttpStatus.SC_OK, httpget.getStatusCode());
assertEquals("/newlocation/", httpget.getPath());
Header[] headers = httpget.getRequestHeaders();
int cookiecount = 0;
for (int i = 0; i < headers.length; i++) {
if ("cookie".equalsIgnoreCase(headers[i].getName())) {
++cookiecount;
}
}
assertEquals("There can only be one (cookie)", 1, cookiecount);
} finally {
httpget.releaseConnection();
}
}
}