blob: a99784de375434b52df71c7b94cf50e3ec99b555 [file] [log] [blame]
/*
* Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package wrongtransport;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyStore;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import com.sun.appserv.test.BaseDevTest;
import org.glassfish.grizzly.config.portunif.HttpProtocolFinder;
public class HttpRedirectElement extends BaseDevTest {
private String targetUrl;
private String httpPort;
private String httpsPort;
private boolean secureRedirect;
private boolean samePort;
private SSLSocketFactory ssf;
public HttpRedirectElement(final String host, final String port, final String securePort, boolean secureRedirect,
final boolean samePort, final String path) {
httpPort = port;
httpsPort = securePort;
this.secureRedirect = secureRedirect;
this.samePort = samePort;
stat.getSuite().setName(getTestName());
stat.getSuite().setDescription(getTestDescription());
createPUElements();
try {
String url;
if (secureRedirect) {
targetUrl = String.format("https://%s:%s/", host, samePort ? port : securePort);
url = String.format("http://%s:%s/", host, port);
} else {
targetUrl = String.format("http://%s:%s/", host, samePort ? securePort : port);
url = String.format("https://%s:%s/", host, securePort);
ssf = getSSLSocketFactory(path);
}
HttpURLConnection connection = getConnection(url);
connection.setInstanceFollowRedirects(true);
checkStatus(connection);
parseResponse(connection);
} catch (Throwable t) {
report("exception found: " + t.getMessage(), false);
t.printStackTrace();
} finally {
deletePUElements();
}
stat.printSummary();
}
private HttpURLConnection getConnection(final String url) throws Exception {
return secureRedirect
? (HttpURLConnection) new URL(url).openConnection()
: doSSLHandshake(url, ssf);
}
private TrustManager[] getTrustManagers(String path) throws Exception {
TrustManager[] tms = null;
InputStream stream = new FileInputStream(path);
try {
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(stream, null);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
tms = tmf.getTrustManagers();
} finally {
stream.close();
}
return tms;
}
private SSLSocketFactory getSSLSocketFactory(String trustStorePath)
throws Exception {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, getTrustManagers(trustStorePath), null);
return sc.getSocketFactory();
}
private HttpsURLConnection doSSLHandshake(String urlAddress, SSLSocketFactory ssf)
throws Exception {
URL url = new URL(urlAddress);
HttpsURLConnection.setDefaultSSLSocketFactory(ssf);
HttpsURLConnection.setFollowRedirects(true);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setHostnameVerifier(
new HostnameVerifier() {
public boolean verify(String server, SSLSession session) {
return true;
}
});
connection.setDoOutput(true);
return connection;
}
@Override
protected String getTestName() {
return String.format("%sRedirectOn%sPort",
secureRedirect ? "HttpToHttps" : "HttpsToHttp",
samePort ? "Same" : "Different");
}
@Override
protected String getTestDescription() {
return String.format("%s redirection on %s port using http-redirect elements",
secureRedirect ? "HTTP to HTTPS" : "HTTPS to HTTP",
samePort ? "the same" : "different");
}
public static void main(String args[]) throws Exception {
for(boolean secure : new boolean[] {true, false}) {
for(boolean same : new boolean[] {true, false}) {
new HttpRedirectElement(args[0], args[1], args[2], secure, same, args[3]);
}
}
}
private void createPUElements() {
final String redirectProtocol = "http-redirect";
// http-redirect
report("create-http-redirect-protocol", asadmin("create-protocol",
"--securityenabled", String.valueOf(!secureRedirect),
redirectProtocol));
String port;
if(samePort) {
port = "-1";
} else {
port = secureRedirect ? httpsPort : httpPort;
}
report("create-http-redirect", asadmin("create-http-redirect",
"--redirect-port", port,
"--secure-redirect", String.valueOf(secureRedirect),
redirectProtocol));
if (!secureRedirect) {
report("create-ssl", asadmin("create-ssl",
"--ssl3enabled", "false",
"--ssl2enabled", "false",
"--certname", "s1as",
"--clientauthenabled", "false",
"--type", "network-listener",
redirectProtocol));
}
// pu-protocol
report("create-pu-protocol", asadmin("create-protocol", "pu-protocol"));
report("create-protocol-finder-http-finder", asadmin("create-protocol-finder",
"--protocol", "pu-protocol",
"--targetprotocol", secureRedirect ? "http-listener-2" : "http-listener-1",
"--classname", HttpProtocolFinder.class.getName(),
"http-finder"));
report("create-protocol-finder-http-redirect", asadmin("create-protocol-finder",
"--protocol", "pu-protocol",
"--targetprotocol", redirectProtocol,
"--classname", HttpProtocolFinder.class.getName(),
redirectProtocol));
// reset listener
if (secureRedirect) {
report("set-http-listener-protocol", asadmin("set",
"configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol=pu-protocol"));
} else {
report("set-http-listener-protocol", asadmin("set",
"configs.config.server-config.network-config.network-listeners.network-listener.http-listener-2.protocol=pu-protocol"));
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
private void deletePUElements() {
// reset listener
if (secureRedirect) {
report("reset-http-listener-protocol", asadmin("set",
"configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol=http-listener-1"));
} else {
report("reset-http-listener-protocol", asadmin("set",
"configs.config.server-config.network-config.network-listeners.network-listener.http-listener-2.protocol=http-listener-2"));
}
report("delete-pu-protocol", asadmin("delete-protocol",
"pu-protocol"));
report("delete-http-redirect", asadmin("delete-protocol",
"http-redirect"));
}
private void checkStatus(HttpURLConnection connection) throws Exception {
int responseCode = connection.getResponseCode();
String location = connection.getHeaderField("location");
report("response-code", responseCode == 302);
report("returned-location", targetUrl.equals(location));
}
private void parseResponse(HttpURLConnection connection) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
try {
while (in.readLine() != null) {
}
} finally {
in.close();
}
}
}