in java/org/apache/catalina/ssi/SSIServletExternalResolver.java [155:314]
protected String getCGIVariable(String name) {
String retVal = null;
String[] nameParts = name.toUpperCase(Locale.ENGLISH).split("_");
int requiredParts = 2;
if (nameParts.length == 1) {
if (nameParts[0].equals("PATH")) {
requiredParts = 1;
}
} else if (nameParts[0].equals("AUTH")) {
if (nameParts[1].equals("TYPE")) {
retVal = req.getAuthType();
}
} else if (nameParts[0].equals("CONTENT")) {
if (nameParts[1].equals("LENGTH")) {
long contentLength = req.getContentLengthLong();
if (contentLength >= 0) {
retVal = Long.toString(contentLength);
}
} else if (nameParts[1].equals("TYPE")) {
retVal = req.getContentType();
}
} else if (nameParts[0].equals("DOCUMENT")) {
if (nameParts[1].equals("NAME")) {
String requestURI = req.getRequestURI();
retVal = requestURI.substring(requestURI.lastIndexOf('/') + 1);
} else if (nameParts[1].equals("URI")) {
retVal = req.getRequestURI();
}
} else if (name.equalsIgnoreCase("GATEWAY_INTERFACE")) {
retVal = "CGI/1.1";
} else if (nameParts[0].equals("HTTP")) {
switch (nameParts[1]) {
case "ACCEPT" -> {
String accept = null;
if (nameParts.length == 2) {
accept = "Accept";
} else if (nameParts[2].equals("ENCODING")) {
requiredParts = 3;
accept = "Accept-Encoding";
} else if (nameParts[2].equals("LANGUAGE")) {
requiredParts = 3;
accept = "Accept-Language";
}
if (accept != null) {
Enumeration<String> acceptHeaders = req.getHeaders(accept);
if (acceptHeaders != null) {
if (acceptHeaders.hasMoreElements()) {
StringBuilder rv = new StringBuilder(acceptHeaders.nextElement());
while (acceptHeaders.hasMoreElements()) {
rv.append(", ");
rv.append(acceptHeaders.nextElement());
}
retVal = rv.toString();
}
}
}
}
case "CONNECTION" -> retVal = req.getHeader("Connection");
case "HOST" -> retVal = req.getHeader("Host");
case "REFERER" -> retVal = req.getHeader("Referer");
case "USER" -> {
if (nameParts.length == 3) {
if (nameParts[2].equals("AGENT")) {
requiredParts = 3;
retVal = req.getHeader("User-Agent");
}
}
}
}
} else if (nameParts[0].equals("PATH")) {
if (nameParts[1].equals("INFO")) {
retVal = req.getPathInfo();
} else if (nameParts[1].equals("TRANSLATED")) {
retVal = req.getPathTranslated();
}
} else if (nameParts[0].equals("QUERY")) {
if (nameParts[1].equals("STRING")) {
String queryString = req.getQueryString();
if (nameParts.length == 2) {
// apache displays this as an empty string rather than (none)
retVal = nullToEmptyString(queryString);
} else if (nameParts[2].equals("UNESCAPED")) {
requiredParts = 3;
if (queryString != null) {
Charset uriCharset = null;
Charset requestCharset = null;
boolean useBodyEncodingForURI = false;
// Get encoding settings from request / connector if possible
if (req instanceof Request) {
requestCharset = ((Request) req).getCoyoteRequest().getCharsetHolder().getCharset();
Connector connector = ((Request) req).getConnector();
uriCharset = connector.getURICharset();
useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
}
Charset queryStringCharset;
// If valid, apply settings from request / connector
// Use default as a last resort
if (useBodyEncodingForURI && requestCharset != null) {
queryStringCharset = requestCharset;
} else {
queryStringCharset = Objects.requireNonNullElse(uriCharset, StandardCharsets.UTF_8);
}
retVal = UDecoder.URLDecode(queryString, queryStringCharset);
}
}
}
} else if (nameParts[0].equals("REMOTE")) {
switch (nameParts[1]) {
case "ADDR" -> retVal = req.getRemoteAddr();
case "HOST" -> retVal = req.getRemoteHost();
case "IDENT" -> {
// Not implemented
}
case "PORT" -> retVal = Integer.toString(req.getRemotePort());
case "USER" -> retVal = req.getRemoteUser();
}
} else if (nameParts[0].equals("REQUEST")) {
if (nameParts[1].equals("METHOD")) {
retVal = req.getMethod();
} else if (nameParts[1].equals("URI")) {
// If this is an error page, get the original URI
retVal = (String) req.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
if (retVal == null) {
retVal = req.getRequestURI();
}
}
} else if (nameParts[0].equals("SCRIPT")) {
String scriptName = req.getServletPath();
if (nameParts[1].equals("FILENAME")) {
retVal = context.getRealPath(scriptName);
} else if (nameParts[1].equals("NAME")) {
retVal = scriptName;
}
} else if (nameParts[0].equals("SERVER")) {
if (nameParts[1].equals("ADDR")) {
retVal = req.getLocalAddr();
}
if (nameParts[1].equals("NAME")) {
retVal = req.getServerName();
} else if (nameParts[1].equals("PORT")) {
retVal = Integer.toString(req.getServerPort());
} else if (nameParts[1].equals("PROTOCOL")) {
retVal = req.getProtocol();
} else if (nameParts[1].equals("SOFTWARE")) {
retVal = context.getServerInfo() + ' ' + System.getProperty("java.vm.name") +
'/' + System.getProperty("java.vm.version") + ' ' + System.getProperty("os.name");
}
} else if (name.equalsIgnoreCase("UNIQUE_ID")) {
retVal = req.getRequestedSessionId();
}
if (requiredParts != nameParts.length) {
return null;
}
return retVal;
}