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

📄 internalinputbuffer.java

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * $Header: /home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InternalInputBuffer.java,v 1.16 2002/11/05 16:26:38 remm Exp $ * $Revision: 1.16 $ * $Date: 2002/11/05 16:26:38 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation.  All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, if *    any, must include the following acknowlegement: *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowlegement may appear in the software itself, *    if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software *    Foundation" must not be used to endorse or promote products derived *    from this software without prior written permission. For written *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" *    nor may "Apache" appear in their names without prior written *    permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * [Additional notices, if required by prior licensing conditions] * */package org.apache.coyote.http11;import java.io.IOException;import java.io.InputStream;import java.io.EOFException;import org.apache.tomcat.util.buf.ByteChunk;import org.apache.tomcat.util.buf.MessageBytes;import org.apache.tomcat.util.http.MimeHeaders;import org.apache.tomcat.util.res.StringManager;import org.apache.coyote.InputBuffer;import org.apache.coyote.Request;/** * Implementation of InputBuffer which provides HTTP request header parsing as * well as transfer decoding. * * @author <a href="mailto:remm@apache.org">Remy Maucherat</a> */public class InternalInputBuffer implements InputBuffer {    // -------------------------------------------------------------- Constants    // ----------------------------------------------------------- Constructors    /**     * Default constructor.     */    public InternalInputBuffer(Request request) {        this(request, Constants.DEFAULT_HTTP_HEADER_BUFFER_SIZE);    }    /**     * Alternate constructor.     */    public InternalInputBuffer(Request request, int headerBufferSize) {        this.request = request;        headers = request.getMimeHeaders();        headerBuffer1 = new byte[headerBufferSize];        headerBuffer2 = new byte[headerBufferSize];        bodyBuffer = new byte[headerBufferSize];        buf = headerBuffer1;        headerBuffer = new char[headerBufferSize];        ascbuf = headerBuffer;        inputStreamInputBuffer = new InputStreamInputBuffer();        filterLibrary = new InputFilter[0];        activeFilters = new InputFilter[0];        lastActiveFilter = -1;        parsingHeader = true;    }    // -------------------------------------------------------------- Variables    /**     * The string manager for this package.     */    protected static StringManager sm =        StringManager.getManager(Constants.Package);    // ----------------------------------------------------- Instance Variables    /**     * Associated Coyote request.     */    protected Request request;    /**     * Headers of the associated request.     */    protected MimeHeaders headers;    /**     * State.     */    protected boolean parsingHeader;    /**     * Pointer to the current read buffer.     */    protected byte[] buf;    /**     * Pointer to the US-ASCII header buffer.     */    protected char[] ascbuf;    /**     * Last valid byte.     */    protected int lastValid;    /**     * Position in the buffer.     */    protected int pos;    /**     * HTTP header buffer no 1.     */    protected byte[] headerBuffer1;    /**     * HTTP header buffer no 2.     */    protected byte[] headerBuffer2;    /**     * HTTP body buffer.     */    protected byte[] bodyBuffer;    /**     * US-ASCII header buffer.     */    protected char[] headerBuffer;    /**     * Underlying input stream.     */    protected InputStream inputStream;    /**     * Underlying input buffer.     */    protected InputBuffer inputStreamInputBuffer;    /**     * Filter library.     * Note: Filter[0] is always the "chunked" filter.     */    protected InputFilter[] filterLibrary;    /**     * Active filters (in order).     */    protected InputFilter[] activeFilters;    /**     * Index of the last active filter.     */    protected int lastActiveFilter;    // ------------------------------------------------------------- Properties    /**     * Set the underlying socket input stream.     */    public void setInputStream(InputStream inputStream) {        // FIXME: Check for null ?        this.inputStream = inputStream;    }    /**     * Get the underlying socket input stream.     */    public InputStream getInputStream() {        return inputStream;    }    /**     * Add an input filter to the filter library.     */    public void addFilter(InputFilter filter) {        // FIXME: Check for null ?        InputFilter[] newFilterLibrary =             new InputFilter[filterLibrary.length + 1];        for (int i = 0; i < filterLibrary.length; i++) {            newFilterLibrary[i] = filterLibrary[i];        }        newFilterLibrary[filterLibrary.length] = filter;        filterLibrary = newFilterLibrary;        activeFilters = new InputFilter[filterLibrary.length];    }    /**     * Get filters.     */    public InputFilter[] getFilters() {        return filterLibrary;    }    /**     * Clear filters.     */    public void clearFilters() {        filterLibrary = new InputFilter[0];        lastActiveFilter = -1;    }    /**     * Add an input filter to the filter library.     */    public void addActiveFilter(InputFilter filter) {        if (lastActiveFilter == -1) {            filter.setBuffer(inputStreamInputBuffer);        } else {            for (int i = 0; i <= lastActiveFilter; i++) {                if (activeFilters[i] == filter)                    return;            }            filter.setBuffer(activeFilters[lastActiveFilter]);        }        activeFilters[++lastActiveFilter] = filter;        filter.setRequest(request);    }    // --------------------------------------------------------- Public Methods    /**     * Recycle the input buffer. This should be called when closing the      * connection.     */    public void recycle() {        // Recycle Request object        request.recycle();        inputStream = null;        buf = headerBuffer1;        lastValid = 0;        pos = 0;        lastActiveFilter = -1;        parsingHeader = true;    }    /**     * End processing of current HTTP request.     * Note: All bytes of the current request should have been already      * consumed. This method only resets all the pointers so that we are ready     * to parse the next HTTP request.     */    public void nextRequest()        throws IOException {        // Recycle Request object        request.recycle();        // Determine the header buffer used for next request        byte[] newHeaderBuf = null;        if (buf == headerBuffer1) {            newHeaderBuf = headerBuffer2;        } else {            newHeaderBuf = headerBuffer1;        }        // Copy leftover bytes from buf to newHeaderBuf        System.arraycopy(buf, pos, newHeaderBuf, 0, lastValid - pos);        // Swap buffers        buf = newHeaderBuf;        // Recycle filters        for (int i = 0; i <= lastActiveFilter; i++) {            activeFilters[i].recycle();        }        // Reset pointers        lastValid = lastValid - pos;        pos = 0;        lastActiveFilter = -1;        parsingHeader = true;    }    /**     * End request (consumes leftover bytes).     *      * @throws IOException an undelying I/O error occured     */    public void endRequest()        throws IOException {        if (lastActiveFilter != -1) {            int extraBytes = (int) activeFilters[lastActiveFilter].end();            pos = pos - extraBytes;        }    }    /**     * Read the request line. This function is meant to be used during the      * HTTP request header parsing. Do NOT attempt to read the request body      * using it.     *     * @throws IOException If an exception occurs during the underlying socket     * read operations, or if the given buffer is not big enough to accomodate     * the whole line.

⌨️ 快捷键说明

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