protected String getCGIVariable()

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;
    }