in core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java [78:180]
public String buildUrl(String action, HttpServletRequest request, HttpServletResponse response, Map<String, Object> params, String urlScheme,
boolean includeContext, boolean encodeResult, boolean forceAddSchemeHostAndPort, boolean escapeAmp) {
StringBuilder link = new StringBuilder();
boolean changedScheme = false;
String scheme = null;
if (isValidScheme(urlScheme)) {
scheme = urlScheme;
}
// only append scheme if it is different to the current scheme *OR*
// if we explicity want it to be appended by having forceAddSchemeHostAndPort = true
if (forceAddSchemeHostAndPort) {
String reqScheme = request.getScheme();
changedScheme = true;
link.append(scheme != null ? scheme : reqScheme);
link.append("://");
link.append(request.getServerName());
if (scheme != null) {
// If switching schemes, use the configured port for the particular scheme.
if (!scheme.equals(reqScheme)) {
appendPort(link, scheme, HTTP_PROTOCOL.equals(scheme) ? httpPort : httpsPort);
// Else use the port from the current request.
} else {
appendPort(link, scheme, request.getServerPort());
}
} else {
appendPort(link, reqScheme, request.getServerPort());
}
} else if ((scheme != null) && !scheme.equals(request.getScheme())) {
changedScheme = true;
link.append(scheme);
link.append("://");
link.append(request.getServerName());
appendPort(link, scheme, HTTP_PROTOCOL.equals(scheme) ? httpPort : httpsPort);
}
if (action != null) {
// Check if context path needs to be added
// Add path to absolute links
if (action.startsWith("/") && includeContext) {
String contextPath = request.getContextPath();
if (!contextPath.equals("/")) {
link.append(contextPath);
}
} else if (changedScheme) {
// (Applicable to Servlet 2.4 containers)
// If the request was forwarded, the attribute below will be set with the original URL
String uri = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
// If the attribute wasn't found, default to the value in the request object
if (uri == null) {
uri = request.getRequestURI();
}
link.append(uri, 0, uri.lastIndexOf('/') + 1);
}
// Add page
link.append(action);
} else {
// Go to "same page"
String requestURI = (String) request.getAttribute("struts.request_uri");
// (Applicable to Servlet 2.4 containers)
// If the request was forwarded, the attribute below will be set with the original URL
if (requestURI == null) {
requestURI = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
}
// If neither request attributes were found, default to the value in the request object
if (requestURI == null) {
requestURI = request.getRequestURI();
}
link.append(requestURI);
}
//if the action was not explicitly set grab the params from the request
if (escapeAmp) {
queryStringBuilder.build(params, link, AMP);
} else {
queryStringBuilder.build(params, link, "&");
}
String result = link.toString();
if (StringUtils.containsIgnoreCase(result, "<script")) {
result = StringEscapeUtils.escapeEcmaScript(result);
}
try {
result = encodeResult ? response.encodeURL(result) : result;
} catch (Exception ex) {
LOG.debug("Could not encode the URL for some reason, use it unchanged", ex);
result = link.toString();
}
return result;
}