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

📄 internalinputbuffer.java

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
     */    public void parseRequestLine()        throws IOException {        int start = 0;        //        // Skipping blank lines        //        byte chr = 0;        do {            // Read new bytes if needed            if (pos >= lastValid) {                if (!fill())                    throw new EOFException(sm.getString("iib.eof.error"));            }            chr = buf[pos++];        } while ((chr == Constants.CR) || (chr == Constants.LF));        pos--;        // Mark the current buffer position        start = pos;        //        // Reading the method name        // Method name is always US-ASCII        //        boolean space = false;        while (!space) {            // Read new bytes if needed            if (pos >= lastValid) {                if (!fill())                    throw new EOFException(sm.getString("iib.eof.error"));            }            ascbuf[pos] = (char) buf[pos];            if (buf[pos] == Constants.SP) {                space = true;                request.method().setChars(ascbuf, start, pos - start);            }            pos++;        }        // Mark the current buffer position        start = pos;        int end = 0;        int questionPos = -1;        //        // Reading the URI        //        space = false;        boolean eol = false;        while (!space) {            // Read new bytes if needed            if (pos >= lastValid) {                if (!fill())                    throw new EOFException(sm.getString("iib.eof.error"));            }            if (buf[pos] == Constants.SP) {                space = true;                end = pos;            } else if ((buf[pos] == Constants.CR)                        || (buf[pos] == Constants.LF)) {                // HTTP/0.9 style request                eol = true;                space = true;                end = pos;            } else if ((buf[pos] == Constants.QUESTION)                        && (questionPos == -1)) {                questionPos = pos;            }            pos++;        }        request.unparsedURI().setBytes(buf, start, end - start);        if (questionPos >= 0) {            request.queryString().setBytes(buf, questionPos + 1,                                            end - questionPos - 1);            request.requestURI().setBytes(buf, start, questionPos - start);        } else {            request.requestURI().setBytes(buf, start, end - start);        }        // Mark the current buffer position        start = pos;        end = 0;        //        // Reading the protocol        // Protocol is always US-ASCII        //        while (!eol) {            // Read new bytes if needed            if (pos >= lastValid) {                if (!fill())                    throw new EOFException(sm.getString("iib.eof.error"));            }            ascbuf[pos] = (char) buf[pos];            if (buf[pos] == Constants.CR) {                end = pos;            } else if (buf[pos] == Constants.LF) {                if (end == 0)                    end = pos;                eol = true;            }            pos++;        }        if ((end - start) > 0) {            request.protocol().setChars(ascbuf, start, end - start);        } else {            request.protocol().setString("");        }    }    /**     * Parse the HTTP headers.     */    public void parseHeaders()        throws IOException {        while (parseHeader()) {        }        parsingHeader = false;    }    /**     * Parse an HTTP header.     *      * @return false after reading a blank line (which indicates that the     * HTTP header parsing is done     */    public boolean parseHeader()        throws IOException {        //        // Check for blank line        //        byte chr = 0;        while (true) {            // Read new bytes if needed            if (pos >= lastValid) {                if (!fill())                    throw new EOFException(sm.getString("iib.eof.error"));            }            chr = buf[pos];            if ((chr == Constants.CR) || (chr == Constants.LF)) {                if (chr == Constants.LF) {                    pos++;                    return false;                }            } else {                break;            }            pos++;        }        // Mark the current buffer position        int start = pos;        //        // Reading the header name        // Header name is always US-ASCII        //        boolean colon = false;        MessageBytes headerValue = null;        while (!colon) {            // Read new bytes if needed            if (pos >= lastValid) {                if (!fill())                    throw new EOFException(sm.getString("iib.eof.error"));            }            if (buf[pos] == Constants.COLON) {                colon = true;                headerValue = headers.addValue(ascbuf, start, pos - start);            }            chr = buf[pos];            if ((chr >= Constants.A) && (chr <= Constants.Z)) {                buf[pos] = (byte) (chr - Constants.LC_OFFSET);            }            ascbuf[pos] = (char) buf[pos];            pos++;        }        // Mark the current buffer position        start = pos;        int realPos = pos;        //        // Reading the header value (which can be spanned over multiple lines)        //        boolean eol = false;        boolean validLine = true;        while (validLine) {            boolean space = true;            // Skipping spaces            while (space) {                // Read new bytes if needed                if (pos >= lastValid) {                    if (!fill())                        throw new EOFException(sm.getString("iib.eof.error"));                }                if ((buf[pos] == Constants.SP) || (buf[pos] == Constants.HT)) {                    pos++;                } else {                    space = false;                }            }            int lastSignificantChar = realPos;            // Reading bytes until the end of the line            while (!eol) {                // Read new bytes if needed                if (pos >= lastValid) {                    if (!fill())                        throw new EOFException(sm.getString("iib.eof.error"));                }                if (buf[pos] == Constants.CR) {                } else if (buf[pos] == Constants.LF) {                    eol = true;                } else if (buf[pos] == Constants.SP) {                    buf[realPos] = buf[pos];                    realPos++;                } else {                    buf[realPos] = buf[pos];                    realPos++;                    lastSignificantChar = realPos;                }                pos++;            }            realPos = lastSignificantChar;            // Checking the first character of the new line. If the character            // is a LWS, then it's a multiline header            // Read new bytes if needed            if (pos >= lastValid) {                if (!fill())                    throw new EOFException(sm.getString("iib.eof.error"));            }            chr = buf[pos];            if ((chr != Constants.SP) && (chr != Constants.HT)) {                validLine = false;            } else {                eol = false;                // Copying one extra space in the buffer (since there must                // be at least one space inserted between the lines)                buf[realPos] = chr;                realPos++;            }        }        // Set the header value        headerValue.setBytes(buf, start, realPos - start);        return true;    }    // ---------------------------------------------------- InputBuffer Methods    /**     * Read some bytes.     */    public int doRead(ByteChunk chunk, Request req)         throws IOException {        if (lastActiveFilter == -1)            return inputStreamInputBuffer.doRead(chunk, req);        else            return activeFilters[lastActiveFilter].doRead(chunk,req);    }    // ------------------------------------------------------ Protected Methods    /**     * Fill the internal buffer using data from the undelying input stream.     *      * @return false if at end of stream     */    protected boolean fill()        throws IOException {        int nRead = 0;        if (parsingHeader) {            if (lastValid == buf.length) {                throw new IOException                    (sm.getString("iib.requestheadertoolarge.error"));            }            nRead = inputStream.read(buf, pos, buf.length - lastValid);            if (nRead > 0) {                lastValid = pos + nRead;            }        } else {            buf = bodyBuffer;            pos = 0;            lastValid = 0;            nRead = inputStream.read(buf, 0, buf.length);            if (nRead > 0) {                lastValid = nRead;            }        }        return (nRead > 0);    }    // ------------------------------------- InputStreamInputBuffer Inner Class    /**     * This class is an input buffer which will read its data from an input     * stream.     */    protected class InputStreamInputBuffer         implements InputBuffer {        /**         * Read bytes into the specified chunk.         */        public int doRead(ByteChunk chunk, Request req )             throws IOException {            if (pos >= lastValid) {                if (!fill())                    return -1;            }            int length = lastValid - pos;            chunk.setBytes(buf, pos, length);            pos = lastValid;            return (length);        }    }}

⌨️ 快捷键说明

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