⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coyoteadapter.java

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    /**     * Parse session id in URL.     * FIXME: Optimize this.     */    protected void parseSessionId(Request req, CoyoteRequest request) {        ByteChunk uriBC = req.decodedURI().getByteChunk();        int semicolon = uriBC.indexOf(match, 0, match.length(), 0);        if (semicolon > 0) {            // Parse session ID, and extract it from the decoded request URI            String uri = uriBC.toString();            String rest = uri.substring(semicolon + match.length());            int semicolon2 = rest.indexOf(';');            if (semicolon2 >= 0) {                request.setRequestedSessionId(rest.substring(0, semicolon2));                rest = rest.substring(semicolon2);            } else {                request.setRequestedSessionId(rest);                rest = "";            }            request.setRequestedSessionURL(true);            req.decodedURI().setString(uri.substring(0, semicolon) + rest);            // Extract session ID from request URI            uri = req.requestURI().toString();            semicolon = uri.indexOf(match);            if (semicolon > 0) {                rest = uri.substring(semicolon + match.length());                semicolon2 = rest.indexOf(';');                if (semicolon2 >= 0) {                    rest = rest.substring(semicolon2);                } else {                    rest = "";                }                req.requestURI().setString(uri.substring(0, semicolon) + rest);            }        } else {            request.setRequestedSessionId(null);            request.setRequestedSessionURL(false);        }    }    /**     * Parse cookies.     */    protected void parseCookies(Request req, CoyoteRequest request) {        Cookies serverCookies = req.getCookies();        int count = serverCookies.getCookieCount();        if (count <= 0)            return;        Cookie[] cookies = new Cookie[count];        int idx=0;        for (int i = 0; i < count; i++) {            ServerCookie scookie = serverCookies.getCookie(i);            if (scookie.getName().equals(Globals.SESSION_COOKIE_NAME)) {                // Override anything requested in the URL                if (!request.isRequestedSessionIdFromCookie()) {                    // Accept only the first session id cookie                    request.setRequestedSessionId                        (scookie.getValue().toString());                    request.setRequestedSessionCookie(true);                    request.setRequestedSessionURL(false);                    if (debug >= 1)                        log(" Requested cookie session id is " +                            ((HttpServletRequest) request.getRequest())                            .getRequestedSessionId());                }            }            try {                Cookie cookie = new Cookie(scookie.getName().toString(),                                       scookie.getValue().toString());                cookies[idx++] = cookie;            } catch (Exception ex) {                log("Bad Cookie Name: " + scookie.getName() +                     " /Value: " + scookie.getValue(),ex);            }            }        if( idx < count ) {            Cookie [] ncookies = new Cookie[idx];            System.arraycopy(cookies, 0, ncookies, 0, idx);            cookies = ncookies;        }        request.setCookies(cookies);    }    /**     * Return a context-relative path, beginning with a "/", that represents     * the canonical version of the specified path after ".." and "." elements     * are resolved out.  If the specified path attempts to go outside the     * boundaries of the current context (i.e. too many ".." path elements     * are present), return <code>null</code> instead.     * This code is not optimized, and is only needed for Tomcat 4.0.x.     *     * @param path Path to be validated     */    protected static String validate(String path) {        if (path == null)            return null;        // Create a place for the normalized path        String normalized = path;        // Normalize "/%7E" and "/%7e" at the beginning to "/~"        if (normalized.startsWith("/%7E") ||            normalized.startsWith("/%7e"))            normalized = "/~" + normalized.substring(4);        // Prevent encoding '%', '/', '.' and '\', which are special reserved        // characters        if ((normalized.indexOf("%25") >= 0)            || (normalized.indexOf("%2F") >= 0)            || (normalized.indexOf("%2E") >= 0)            || (normalized.indexOf("%5C") >= 0)            || (normalized.indexOf("%2f") >= 0)            || (normalized.indexOf("%2e") >= 0)            || (normalized.indexOf("%5c") >= 0)) {            return null;        }        if (normalized.equals("/."))            return "/";        // Normalize the slashes and add leading slash if necessary        if (normalized.indexOf('\\') >= 0)            normalized = normalized.replace('\\', '/');        if (!normalized.startsWith("/"))            normalized = "/" + normalized;        // Resolve occurrences of "//" in the normalized path        while (true) {            int index = normalized.indexOf("//");            if (index < 0)                break;            normalized = normalized.substring(0, index) +                normalized.substring(index + 1);        }        // Resolve occurrences of "/./" in the normalized path        while (true) {            int index = normalized.indexOf("/./");            if (index < 0)                break;            normalized = normalized.substring(0, index) +                normalized.substring(index + 2);        }        // Resolve occurrences of "/../" in the normalized path        while (true) {            int index = normalized.indexOf("/../");            if (index < 0)                break;            if (index == 0)                return (null);  // Trying to go outside our context            int index2 = normalized.lastIndexOf('/', index - 1);            normalized = normalized.substring(0, index2) +                normalized.substring(index + 3);        }        // Declare occurrences of "/..." (three or more dots) to be invalid        // (on some Windows platforms this walks the directory tree!!!)        if (normalized.indexOf("/...") >= 0)            return (null);        // Return the normalized path that we have completed        return (normalized);    }    /**     * Normalize URI.     * <p>     * This method normalizes "\", "//", "/./" and "/../". This method will     * return false when trying to go above the root, or if the URI contains     * a null byte.     *      * @param uriMB URI to be normalized     */    public static boolean normalize(MessageBytes uriMB) {        ByteChunk uriBC = uriMB.getByteChunk();        byte[] b = uriBC.getBytes();        int start = uriBC.getStart();        int end = uriBC.getEnd();        int pos = 0;        int index = 0;        // Replace '\' with '/'        // Check for null byte        for (pos = start; pos < end; pos++) {            if (b[pos] == (byte) '\\')                b[pos] = (byte) '/';            if (b[pos] == (byte) 0)                return false;        }        // The URL must start with '/'        if (b[start] != (byte) '/') {            return false;        }        // Replace "//" with "/"        for (pos = start; pos < (end - 1); pos++) {            if ((b[pos] == (byte) '/') && (b[pos + 1] == (byte) '/')) {                copyBytes(b, pos, pos + 1, end - pos - 1);                end--;            }        }        // If the URI ends with "/." or "/..", then we append an extra "/"        // Note: It is possible to extend the URI by 1 without any side effect        // as the next character is a non-significant WS.        if (((end - start) > 2) && (b[end - 1] == (byte) '.')) {            if ((b[end - 2] == (byte) '/')                 || ((b[end - 2] == (byte) '.')                     && (b[end - 3] == (byte) '/'))) {                b[end] = (byte) '/';                end++;            }        }        uriBC.setEnd(end);        index = 0;        // Resolve occurrences of "/./" in the normalized path        while (true) {            index = uriBC.indexOf("/./", 0, 3, index);            if (index < 0)                break;            copyBytes(b, start + index, start + index + 2,                       end - start - index - 2);            end = end - 2;            uriBC.setEnd(end);        }        index = 0;        // Resolve occurrences of "/../" in the normalized path        while (true) {            index = uriBC.indexOf("/../", 0, 4, index);            if (index < 0)                break;            // Prevent from going outside our context            if (index == 0)                return false;            int index2 = -1;            for (pos = start + index - 1; (pos >= 0) && (index2 < 0); pos --) {                if (b[pos] == (byte) '/') {                    index2 = pos;                }            }            copyBytes(b, start + index2, start + index + 3,                      end - start - index - 3);            end = end + index2 - index - 3;            uriBC.setEnd(end);            index = index2;        }        uriBC.setBytes(b, start, end);        return true;    }    // ------------------------------------------------------ Protected Methods    /**     * Copy an array of bytes to a different position. Used during      * normalization.     */    protected static void copyBytes(byte[] b, int dest, int src, int len) {        for (int pos = 0; pos < len; pos++) {            b[pos + dest] = b[pos + src];        }    }    /**     * Log a message on the Logger associated with our Container (if any)     *     * @param message Message to be logged     */    protected void log(String message) {        Logger logger = connector.getContainer().getLogger();        if (logger != null)            logger.log("CoyoteAdapter " + message);    }    /**     * Log a message on the Logger associated with our Container (if any)     *     * @param message Message to be logged     * @param throwable Associated exception     */    protected void log(String message, Throwable throwable) {        Logger logger = connector.getContainer().getLogger();        if (logger != null)            logger.log("CoyoteAdapter " + message, throwable);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -