package org.appfuse.webapp.util;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.appfuse.Constants;
public class SslUtil extends BaseUtil {
public static final String HTTP = "http";
public static final String HTTPS = "https";
public static final String HTTP_PORT_PARAM = "listenPort_http";
public static final String HTTPS_PORT_PARAM = "listenPort_https";
private static String HTTP_PORT = null;
private static String HTTPS_PORT = null;
public static final String STD_HTTP_PORT = "80";
public static final String STD_HTTPS_PORT = "443";
public static String getRedirectString(HttpServletRequest request,
ServletContext ctx, boolean isSecure) {
Map config = (HashMap) ctx.getAttribute(Constants.CONFIG);
HTTP_PORT = (String) config.get(Constants.HTTP_PORT);
HTTPS_PORT = (String) config.get(Constants.HTTPS_PORT);
String desiredScheme = isSecure ? HTTPS : HTTP;
String usingScheme = request.getScheme();
String desiredPort = isSecure ? HTTPS_PORT : HTTP_PORT;
String usingPort = String.valueOf(request.getServerPort());
String urlString = null;
if (!desiredScheme.equals(usingScheme) ||
!desiredPort.equals(usingPort)) {
urlString =
buildNewUrlString(request, desiredScheme, usingScheme,
desiredPort, usingPort);
RequestUtil.stowRequestAttributes(request);
} else {
RequestUtil.reclaimRequestAttributes(request);
}
return urlString;
}
private static String buildNewUrlString(HttpServletRequest request,
String desiredScheme,
String usingScheme,
String desiredPort, String usingPort) {
StringBuffer url = request.getRequestURL();
url.replace(0, usingScheme.length(), desiredScheme);
int startIndex = url.toString().indexOf(usingPort);
if (startIndex == -1) {
if ((!(STD_HTTPS_PORT.equals(desiredPort) &&
HTTPS.equals(desiredScheme))) &&
(!(STD_HTTP_PORT.equals(desiredPort) &&
HTTP.equals(desiredScheme)))) {
startIndex =
url.toString().indexOf("/",
url.toString().indexOf("/",
url.toString()
.indexOf("/") +
1) + 1);
url.insert(startIndex, ":" + desiredPort);
}
} else {
if ((STD_HTTPS_PORT.equals(desiredPort) &&
HTTPS.equals(desiredScheme)) ||
(STD_HTTP_PORT.equals(desiredPort) &&
HTTP.equals(desiredScheme))) {
url.delete(startIndex - 1, startIndex + usingPort.length());
} else {
url.replace(startIndex, startIndex + usingPort.length(),
desiredPort);
}
}
String queryString = request.getQueryString();
if ((queryString != null) && (queryString.length() != 0)) {
url.append("?" + queryString);
} else {
queryString = RequestUtil.getRequestParameters(request);
if ((queryString != null) && (queryString.length() != 0)) {
url.append("?" + queryString);
}
}
return url.toString();
}
}