tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From r...@locus.apache.org
Subject cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http DefaultHeaders.java HttpHeader.java HttpProcessor.java HttpRequestImpl.java HttpRequestLine.java
Date Fri, 24 Nov 2000 19:55:21 GMT
remm        00/11/24 11:55:21

  Modified:    catalina/src/share/org/apache/catalina/connector/http
                        HttpHeader.java HttpProcessor.java
                        HttpRequestImpl.java HttpRequestLine.java
  Added:       catalina/src/share/org/apache/catalina/connector/http
                        DefaultHeaders.java
  Log:
  - Start using the new buffers in the request, to test their functionality.
  - Use the modified request in the processor.
  - The request parsing still needs more optimization, and the response hasn't
    been optimized at all. A profiling session would probably be very useful
    before doing any additional work.
  
  Revision  Changes    Path
  1.2       +169 -6    jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpHeader.java
  
  Index: HttpHeader.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpHeader.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HttpHeader.java	2000/11/17 03:30:43	1.1
  +++ HttpHeader.java	2000/11/24 19:55:20	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpHeader.java,v
1.1 2000/11/17 03:30:43 remm Exp $
  - * $Revision: 1.1 $
  - * $Date: 2000/11/17 03:30:43 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpHeader.java,v
1.2 2000/11/24 19:55:20 remm Exp $
  + * $Revision: 1.2 $
  + * $Date: 2000/11/24 19:55:20 $
    *
    * ====================================================================
    *
  @@ -75,7 +75,7 @@
    * HTTP header enum type.
    *
    * @author Remy Maucherat
  - * @version $Revision: 1.1 $ $Date: 2000/11/17 03:30:43 $
  + * @version $Revision: 1.2 $ $Date: 2000/11/24 19:55:20 $
    */
   
   final class HttpHeader {
  @@ -110,6 +110,16 @@
       }
   
   
  +    public HttpHeader(String name, String value) {
  +
  +        this.name = name.toLowerCase().toCharArray();
  +        this.nameEnd = name.length();
  +        this.value = value.toCharArray();
  +        this.valueEnd = value.length();
  +
  +    }
  +
  +
       // ----------------------------------------------------- Instance Variables
   
   
  @@ -117,6 +127,7 @@
       public int nameEnd;
       public char[] value;
       public int valueEnd;
  +    protected int hashCode = 0;
   
   
       // ------------------------------------------------------------- Properties
  @@ -133,20 +144,172 @@
   
           nameEnd = 0;
           valueEnd = 0;
  +        hashCode = 0;
  +
  +    }
  +
  +
  +    /**
  +     * Test if the name of the header is equal to the given char array.
  +     * All the characters must already be lower case.
  +     */
  +    public boolean equals(char[] buf) {
  +        return equals(buf, buf.length);
  +    }
  +
  +
  +    /**
  +     * Test if the name of the header is equal to the given char array.
  +     * All the characters must already be lower case.
  +     */
  +    public boolean equals(char[] buf, int end) {
  +        if (end != nameEnd)
  +            return false;
  +        for (int i=0; i<end; i++) {
  +            if (buf[i] != name[i])
  +                return false;
  +        }
  +        return true;
  +    }
   
  +
  +    /**
  +     * Test if the name of the header is equal to the given string.
  +     * The String given must be made of lower case characters.
  +     */
  +    public boolean equals(String str) {
  +        return equals(str.toCharArray(), str.length());
       }
   
   
  +    /**
  +     * Test if the value of the header is equal to the given char array.
  +     */
  +    public boolean valueEquals(char[] buf) {
  +        return valueEquals(buf, buf.length);
  +    }
  +
  +
  +    /**
  +     * Test if the value of the header is equal to the given char array.
  +     */
  +    public boolean valueEquals(char[] buf, int end) {
  +        if (end != valueEnd)
  +            return false;
  +        for (int i=0; i<end; i++) {
  +            if (buf[i] != value[i])
  +                return false;
  +        }
  +        return true;
  +    }
  +
  +
  +    /**
  +     * Test if the value of the header is equal to the given string.
  +     */
  +    public boolean valueEquals(String str) {
  +        return valueEquals(str.toCharArray(), str.length());
  +    }
  +
  +
  +    /**
  +     * Test if the value of the header includes the given char array.
  +     */
  +    public boolean valueIncludes(char[] buf) {
  +        return valueIncludes(buf, buf.length);
  +    }
  +
  +
  +    /**
  +     * Test if the value of the header includes the given char array.
  +     */
  +    public boolean valueIncludes(char[] buf, int end) {
  +        char firstChar = buf[0];
  +        int pos = 0;
  +        while (pos < valueEnd) {
  +            pos = valueIndexOf(firstChar, pos);
  +            if (pos == -1)
  +                return false;
  +            if ((valueEnd - pos) < end)
  +                return false;
  +            for (int i = 0; i < end; i++) {
  +                if (value[i + pos] != buf[i])
  +                    break;
  +                if (i == (end-1))
  +                    return true;
  +            }
  +            pos++;
  +        }
  +        return false;
  +    }
  +
  +
  +    /**
  +     * Test if the value of the header includes the given string.
  +     */
  +    public boolean valueIncludes(String str) {
  +        return valueIncludes(str.toCharArray(), str.length());
  +    }
  +
  +
  +    /**
  +     * Returns the index of a character in the value.
  +     */
  +    public int valueIndexOf(char c, int start) {
  +        for (int i=start; i<valueEnd; i++) {
  +            if (value[i] == c)
  +                return i;
  +        }
  +        return -1;
  +    }
  +
  +
  +    /**
  +     * Test if the name of the header is equal to the given header.
  +     * All the characters in the name must already be lower case.
  +     */
  +    public boolean equals(HttpHeader header) {
  +        return (equals(header.name, header.nameEnd));
  +    }
  +
  +
  +    /**
  +     * Test if the name and value of the header is equal to the given header.
  +     * All the characters in the name must already be lower case.
  +     */
  +    public boolean headerEquals(HttpHeader header) {
  +        return (equals(header.name, header.nameEnd))
  +            && (valueEquals(header.value, header.valueEnd));
  +    }
  +
  +
       // --------------------------------------------------------- Object Methods
   
   
  +    /**
  +     * Return hash code. The hash code of the HttpHeader object is the same 
  +     * as returned by new String(name, 0, nameEnd).hashCode().
  +     */
       public int hashCode() {
  -        // FIXME
  -        return 0;
  +	int h = hashCode;
  +	if (h == 0) {
  +	    int off = 0;
  +	    char val[] = name;
  +	    int len = nameEnd;
  +            for (int i = 0; i < len; i++)
  +                h = 31*h + val[off++];
  +	    hashCode = h;
  +        }
  +        return h;
       }
   
   
       public boolean equals(Object obj) {
  +        if (obj instanceof String) {
  +            return equals(((String) obj).toLowerCase());
  +        } else if (obj instanceof HttpHeader) {
  +            return equals((HttpHeader) obj);
  +        }
           return false;
       }
   
  
  
  
  1.13      +53 -54    jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java
  
  Index: HttpProcessor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- HttpProcessor.java	2000/11/17 03:30:43	1.12
  +++ HttpProcessor.java	2000/11/24 19:55:20	1.13
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java,v
1.12 2000/11/17 03:30:43 remm Exp $
  - * $Revision: 1.12 $
  - * $Date: 2000/11/17 03:30:43 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpProcessor.java,v
1.13 2000/11/24 19:55:20 remm Exp $
  + * $Revision: 1.13 $
  + * $Date: 2000/11/24 19:55:20 $
    *
    * ====================================================================
    *
  @@ -106,7 +106,7 @@
    *
    * @author Craig R. McClanahan
    * @author Remy Maucherat
  - * @version $Revision: 1.12 $ $Date: 2000/11/17 03:30:43 $
  + * @version $Revision: 1.13 $ $Date: 2000/11/24 19:55:20 $
    */
   
   final class HttpProcessor
  @@ -128,8 +128,8 @@
   	this.connector = connector;
   	this.debug = connector.getDebug();
   	this.id = id;
  -	this.request = (HttpRequest) connector.createRequest();
  -	this.response = (HttpResponse) connector.createResponse();
  +	this.request = (HttpRequestImpl) connector.createRequest();
  +	this.response = (HttpResponseImpl) connector.createResponse();
   	this.threadName =
   	  "HttpProcessor[" + connector.getPort() + "][" + id + "]";
   
  @@ -177,6 +177,12 @@
   
   
       /**
  +     * The match string for identifying a session ID parameter.
  +     */
  +    private static final char[] SESSION_ID = match.toCharArray();
  +
  +
  +    /**
        * The string parser we will use for parsing request lines.
        */
       private StringParser parser = new StringParser();
  @@ -185,13 +191,13 @@
       /**
        * The HTTP request object we will pass to our associated container.
        */
  -    private HttpRequest request = null;
  +    private HttpRequestImpl request = null;
   
   
       /**
        * The HTTP response object we will pass to our associated container.
        */
  -    private HttpResponse response = null;
  +    private HttpResponseImpl response = null;
   
   
       /**
  @@ -275,7 +281,7 @@
       /**
        * Line buffer.
        */
  -    private char[] lineBuffer = new char[4096];
  +    //private char[] lineBuffer = new char[4096];
   
   
       /**
  @@ -284,12 +290,6 @@
       private HttpRequestLine requestLine = new HttpRequestLine();
   
   
  -    /**
  -     * HTTP header.
  -     */
  -    private HttpHeader header = new HttpHeader();
  -
  -
       // -------------------------------------------------------- Package Methods
   
   
  @@ -520,12 +520,10 @@
   
   	while (true) {
   
  -            try {
  -                // Read the next header
  -                input.readHeader(header);
  -            } catch (Throwable t) {
  -                t.printStackTrace();
  -            }
  +            HttpHeader header = request.allocateHeader();
  +
  +            // Read the next header
  +            input.readHeader(header);
               if (header.nameEnd == 0) {
                   if (header.valueEnd == 0) {
                       return;
  @@ -535,19 +533,16 @@
                   }
               }
               
  -	    String name = new String(header.name, 0, header.nameEnd);
  -	    String match = name;
   	    String value = new String(header.value, 0, header.valueEnd);
  -            //System.out.println("  Header:" + name + "_ Value:" + value + "_");
  -	    if (debug >= 1)
  -	        log(" Header " + name + " = " + value);
  +	    //if (debug >= 1)
  +	    //    log(" Header " + name + " = " + value);
               
   	    // Set the corresponding request headers
  -	    if (match.equals("authorization")) {
  -		request.setAuthorization(value);
  -	    } else if (match.equals("accept-language")) {
  -		parseAcceptLanguage(value);
  -	    } else if (match.equals("cookie")) {
  +            if (header.equals(DefaultHeaders.AUTHORIZATION_NAME)) {
  +                request.setAuthorization(value);
  +            } else if (header.equals(DefaultHeaders.ACCEPT_LANGUAGE_NAME)) {
  +                parseAcceptLanguage(value);
  +            } else if (header.equals(DefaultHeaders.COOKIE_NAME)) {
   		Cookie cookies[] = RequestUtil.parseCookieHeader(value);
   		for (int i = 0; i < cookies.length; i++) {
   		    if (cookies[i].getName().equals
  @@ -566,7 +561,7 @@
   		    }
                       request.addCookie(cookies[i]);
   		}
  -	    } else if (match.equals("content-length")) {
  +	    } else if (header.equals(DefaultHeaders.CONTENT_LENGTH_NAME)) {
   		int n = -1;
   		try {
   		    n = Integer.parseInt(value);
  @@ -576,9 +571,9 @@
                            ("httpProcessor.parseHeaders.contentLength"));
   		}
   		request.setContentLength(n);
  -	    } else if (match.equals("content-type")) {
  +	    } else if (header.equals(DefaultHeaders.CONTENT_TYPE_NAME)) {
   		request.setContentType(value);
  -	    } else if (match.equals("host")) {
  +	    } else if (header.equals(DefaultHeaders.HOST_NAME)) {
   		int n = value.indexOf(":");
   		if (n < 0)
   		    request.setServerName(value);
  @@ -594,24 +589,27 @@
   		    }
   		    request.setServerPort(port);
   		}
  -	    } else if (match.equals("connection")) {
  -                if ("close".equalsIgnoreCase(value)) {
  +	    } else if (header.equals(DefaultHeaders.CONNECTION_NAME)) {
  +                if (header.valueEquals
  +                    (DefaultHeaders.CONNECTION_CLOSE_VALUE)) {
                       keepAlive = false;
                   }
  +                //request.setConnection(header);
                   /*
                     if ("keep-alive".equalsIgnoreCase(value)) {
                     keepAlive = true;
                     }
                   */
  -            } else if (match.equals("expect")) {
  -                if ("100-continue".equalsIgnoreCase(value))
  +            } else if (header.equals(DefaultHeaders.EXPECT_NAME)) {
  +                if (header.valueEquals(DefaultHeaders.EXPECT_100_VALUE))
                       sendAck = true;
                   else
                       throw new ServletException
                           (sm.getString
                            ("httpProcessor.parseHeaders.unknownExpectation"));
  +	    } else if (header.equals(DefaultHeaders.TRANSFER_ENCODING_NAME)) {
  +                //request.setTransferEncoding(header);
   	    }
  -	    request.addHeader(name, value);
   	}
   
       }
  @@ -634,9 +632,9 @@
           input.readRequestLine(requestLine);
           String method = 
               new String(requestLine.method, 0, requestLine.methodEnd);
  -        String uri = new String(requestLine.uri, 0, requestLine.uriEnd);
  +        String uri = null;
           String protocol = new String(requestLine.protocol, 0, 
  -                              requestLine.protocolEnd);
  +                                     requestLine.protocolEnd);
           
           //System.out.println(" Method:" + method + "_ Uri:" + uri 
           //                   + "_ Protocol:" + protocol);
  @@ -661,22 +659,25 @@
   	if (method.length() < 1) {
   	    throw new ServletException
   		(sm.getString("httpProcessor.parseRequest.method"));
  -	} else if (uri.length() < 1) {
  +	} else if (requestLine.uriEnd < 1) {
   	    throw new ServletException
   		(sm.getString("httpProcessor.parseRequest.uri"));
   	}
   
   	// Parse any query parameters out of the request URI
  -	int question = uri.indexOf("?");
  +	int question = requestLine.indexOf("?");
   	if (question >= 0) {
  -	    request.setQueryString(uri.substring(question + 1));
  +	    request.setQueryString
  +                (new String(requestLine.uri, 0, question + 1));
   	    if (debug >= 1)
   	        log(" Query string is " +
   		    ((HttpServletRequest) request.getRequest())
                       .getQueryString());
  -	    uri = uri.substring(0, question);
  -	} else
  +	    uri = new String(requestLine.uri, 0, question);
  +	} else {
   	    request.setQueryString(null);
  +	    uri = new String(requestLine.uri, 0, requestLine.uriEnd);
  +        }
   
   	// Parse any requested session ID out of the request URI
   	int semicolon = uri.indexOf(match);
  @@ -781,12 +782,11 @@
                           ackRequest(output);
                           // If the protocol is HTTP/1.1, chunking is allowed.
                           if (connector.isChunkingAllowed())
  -                            ((HttpResponseImpl) response)
  -                                .setAllowChunking(true);
  +                            response.setAllowChunking(true);
                       }
                   }
               } catch (EOFException e) {
  -                //                log("process.parse:  EOFException:  " + e);
  +                //log("process.parse:  EOFException:  " + e);
                   ok = false;
               } catch (Exception e) {
                   try {
  @@ -829,8 +829,8 @@
               // Finish up the handling of the request
               try {
                   if (ok) {
  -                    ((HttpResponseImpl) response).finishResponse();
  -                    ((HttpRequestImpl) request).finishRequest();
  +                    response.finishResponse();
  +                    request.finishRequest();
                   }
                   if (output != null)
                       output.flush();
  @@ -841,12 +841,11 @@
               // We have to check if the connection closure has been requested
               // by the application or the response stream (in case of HTTP/1.0
               // and keep-alive).
  -            if ( "close".equals(((HttpResponseImpl) response)
  -                                .getHeader("Connection")) ) {
  +            if ( "close".equals(response.getHeader("Connection")) ) {
                   keepAlive = false;
               }
               // If the status is an error, the connection is closed
  -            if ( ((HttpResponseImpl) response).getStatus() >= 400 ) {
  +            if (response.getStatus() >= 400) {
                   keepAlive = false;
               }
               
  
  
  
  1.3       +185 -4    jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestImpl.java
  
  Index: HttpRequestImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestImpl.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- HttpRequestImpl.java	2000/10/10 17:09:24	1.2
  +++ HttpRequestImpl.java	2000/11/24 19:55:20	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestImpl.java,v
1.2 2000/10/10 17:09:24 remm Exp $
  - * $Revision: 1.2 $
  - * $Date: 2000/10/10 17:09:24 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestImpl.java,v
1.3 2000/11/24 19:55:20 remm Exp $
  + * $Revision: 1.3 $
  + * $Date: 2000/11/24 19:55:20 $
    *
    * ====================================================================
    *
  @@ -67,21 +67,40 @@
   
   import java.io.IOException;
   import java.net.InetAddress;
  +import java.util.ArrayList;
  +import java.util.Enumeration;
   import javax.servlet.ServletInputStream;
   import org.apache.catalina.connector.HttpRequestBase;
  +import org.apache.catalina.util.Enumerator;
   
   
   /**
    * Implementation of <b>HttpRequest</b> specific to the HTTP connector.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.2 $ $Date: 2000/10/10 17:09:24 $
  + * @author Remy Maucherat
  + * @version $Revision: 1.3 $ $Date: 2000/11/24 19:55:20 $
    */
   
   final class HttpRequestImpl
       extends HttpRequestBase {
   
   
  +    // -------------------------------------------------------------- Constants
  +
  +
  +    /**
  +     * Initial pool size.
  +     */
  +    protected static final int INITIAL_POOL_SIZE = 10;
  +
  +
  +    /**
  +     * Pool size increment.
  +     */
  +    protected static final int POOL_SIZE_INCREMENT = 5;
  +
  +
       // ----------------------------------------------------- Instance Variables
   
   
  @@ -98,6 +117,30 @@
   	"org.apache.catalina.connector.http.HttpRequestImpl/1.0";
   
   
  +    /**
  +     * Headers pool.
  +     */
  +    protected HttpHeader[] headerPool = new HttpHeader[INITIAL_POOL_SIZE];
  +
  +
  +    /**
  +     * Position of the next available header in the pool.
  +     */
  +    protected int nextHeader = 0;
  +
  +
  +    /**
  +     * Connection header.
  +     */
  +    protected HttpHeader connectionHeader = null;
  +
  +
  +    /**
  +     * Transfer encoding header.
  +     */
  +    protected HttpHeader transferEncodingHeader = null;
  +
  +
       // ------------------------------------------------------------- Properties
   
   
  @@ -148,6 +191,8 @@
   
   	super.recycle();
   	inet = null;
  +        nextHeader = 0;
  +        connectionHeader = null;
   
       }
   
  @@ -167,6 +212,84 @@
       }
   
   
  +    /**
  +     * Allocate new header.
  +     * 
  +     * @return an HttpHeader buffer allocated from the pool
  +     */
  +    HttpHeader allocateHeader() {
  +        if (nextHeader == headerPool.length) {
  +            // Grow the pool
  +            HttpHeader[] newHeaderPool = 
  +                new HttpHeader[headerPool.length + POOL_SIZE_INCREMENT];
  +            for (int i = 0; i < nextHeader; i++) {
  +                newHeaderPool[i] = headerPool[i];
  +            }
  +            headerPool = newHeaderPool;
  +        }
  +        if (headerPool[nextHeader] == null)
  +            headerPool[nextHeader] = new HttpHeader();
  +        return headerPool[nextHeader++];
  +    }
  +
  +
  +    /**
  +     * Add a Header to the set of Headers associated with this Request.
  +     *
  +     * @param name The new header name
  +     * @param value The new header value
  +     * @deprecated Don't use
  +     */
  +    public void addHeader(String name, String value) {
  +
  +        if (nextHeader == headerPool.length) {
  +            // Grow the pool
  +            HttpHeader[] newHeaderPool = 
  +                new HttpHeader[headerPool.length + POOL_SIZE_INCREMENT];
  +            for (int i = 0; i < nextHeader; i++) {
  +                newHeaderPool[i] = headerPool[i];
  +            }
  +            headerPool = newHeaderPool;
  +        }
  +        headerPool[nextHeader++] = new HttpHeader(name, value);
  +
  +    }
  +
  +
  +    /**
  +     * Return the first value of the specified header, if any; otherwise,
  +     * return <code>null</code>
  +     *
  +     * @param header Header we want to retrieve
  +     */
  +    public HttpHeader getHeader(HttpHeader header) {
  +
  +        for (int i = 0; i < nextHeader; i++) {
  +            if (headerPool[i].equals(header))
  +                return headerPool[i];
  +        }
  +        return null;
  +
  +    }
  +
  +
  +    /**
  +     * Return the first value of the specified header, if any; otherwise,
  +     * return <code>null</code>
  +     *
  +     * @param headerName Name of the requested header
  +     */
  +    public HttpHeader getHeader(char[] headerName) {
  +
  +        for (int i = 0; i < nextHeader; i++) {
  +            if (headerPool[i].equals(headerName))
  +                return headerPool[i];
  +        }
  +        return null;
  +
  +    }
  +
  +
       // ------------------------------------------------- ServletRequest Methods
   
   
  @@ -193,6 +316,64 @@
   
   
       // --------------------------------------------- HttpServletRequest Methods
  +
  +
  +    /**
  +     * Return the first value of the specified header, if any; otherwise,
  +     * return <code>null</code>
  +     *
  +     * @param name Name of the requested header
  +     */
  +    public String getHeader(String name) {
  +
  +	name = name.toLowerCase();
  +        for (int i = 0; i < nextHeader; i++) {
  +            if (headerPool[i].equals(name))
  +                return new String(headerPool[i].value, 0,
  +                                  headerPool[i].valueEnd);
  +        }
  +        return null;
  +
  +
  +    }
  +
  +
  +    /**
  +     * Return all of the values of the specified header, if any; otherwise,
  +     * return an empty enumeration.
  +     *
  +     * @param name Name of the requested header
  +     */
  +    public Enumeration getHeaders(String name) {
  +
  +        ArrayList tempArrayList = new ArrayList();
  +	name = name.toLowerCase();
  +        for (int i = 0; i < nextHeader; i++) {
  +            if (headerPool[i].equals(name))
  +                tempArrayList.add(new String(headerPool[i].value, 0,
  +                                             headerPool[i].valueEnd));
  +        }
  +        return new Enumerator(tempArrayList);
  +
  +    }
  +
  +
  +    /**
  +     * Return the names of all headers received with this request.
  +     */
  +    public Enumeration getHeaderNames() {
  +
  +        ArrayList tempArrayList = new ArrayList();
  +        for (int i = 0; i < nextHeader; i++) {
  +            tempArrayList.add(new String(headerPool[i].name, 0,
  +                                         headerPool[i].nameEnd));
  +        }
  +        return new Enumerator(tempArrayList);
  +
  +    }
  +
  +
  +
   
   
   }
  
  
  
  1.2       +56 -4     jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestLine.java
  
  Index: HttpRequestLine.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestLine.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HttpRequestLine.java	2000/11/17 03:30:43	1.1
  +++ HttpRequestLine.java	2000/11/24 19:55:20	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestLine.java,v
1.1 2000/11/17 03:30:43 remm Exp $
  - * $Revision: 1.1 $
  - * $Date: 2000/11/17 03:30:43 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/HttpRequestLine.java,v
1.2 2000/11/24 19:55:20 remm Exp $
  + * $Revision: 1.2 $
  + * $Date: 2000/11/24 19:55:20 $
    *
    * ====================================================================
    *
  @@ -75,7 +75,7 @@
    * HTTP request line enum type.
    *
    * @author Remy Maucherat
  - * @version $Revision: 1.1 $ $Date: 2000/11/17 03:30:43 $
  + * @version $Revision: 1.2 $ $Date: 2000/11/24 19:55:20 $
    */
   
   final class HttpRequestLine {
  @@ -144,6 +144,58 @@
           uriEnd = 0;
           protocolEnd = 0;
   
  +    }
  +
  +
  +    /**
  +     * Test if the uri includes the given char array.
  +     */
  +    public int indexOf(char[] buf) {
  +        return indexOf(buf, buf.length);
  +    }
  +
  +
  +    /**
  +     * Test if the value of the header includes the given char array.
  +     */
  +    public int indexOf(char[] buf, int end) {
  +        char firstChar = buf[0];
  +        int pos = 0;
  +        while (pos < uriEnd) {
  +            pos = indexOf(firstChar, pos);
  +            if (pos == -1)
  +                return -1;
  +            if ((uriEnd - pos) < end)
  +                return -1;
  +            for (int i = 0; i < end; i++) {
  +                if (uri[i + pos] != buf[i])
  +                    break;
  +                if (i == (end-1))
  +                    return pos;
  +            }
  +            pos++;
  +        }
  +        return -1;
  +    }
  +
  +
  +    /**
  +     * Test if the value of the header includes the given string.
  +     */
  +    public int indexOf(String str) {
  +        return indexOf(str.toCharArray(), str.length());
  +    }
  +
  +
  +    /**
  +     * Returns the index of a character in the value.
  +     */
  +    public int indexOf(char c, int start) {
  +        for (int i=start; i<uriEnd; i++) {
  +            if (uri[i] == c)
  +                return i;
  +        }
  +        return -1;
       }
   
   
  
  
  
  1.1                  jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/DefaultHeaders.java
  
  Index: DefaultHeaders.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/http/DefaultHeaders.java,v
1.1 2000/11/24 19:55:20 remm Exp $
   * $Revision: 1.1 $
   * $Date: 2000/11/24 19:55:20 $
   *
   * ====================================================================
   *
   * 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.catalina.connector.http;
  
  
  /**
   * HTTP default headers and header names.
   *
   * @author Remy Maucherat
   * @version $Revision: 1.1 $ $Date: 2000/11/24 19:55:20 $
   */
  
  final class DefaultHeaders {
  
  
      // -------------------------------------------------------------- Constants
  
  
      static final char[] AUTHORIZATION_NAME = "authorization".toCharArray();
      static final char[] ACCEPT_LANGUAGE_NAME = "accept-language".toCharArray();
      static final char[] COOKIE_NAME = "cookie".toCharArray();
      static final char[] CONTENT_LENGTH_NAME = "content-length".toCharArray();
      static final char[] CONTENT_TYPE_NAME = "content-type".toCharArray();
      static final char[] HOST_NAME = "host".toCharArray();
      static final char[] CONNECTION_NAME = "connection".toCharArray();
      static final char[] CONNECTION_CLOSE_VALUE = "close".toCharArray();
      static final char[] EXPECT_NAME = "expect".toCharArray();
      static final char[] EXPECT_100_VALUE = "100-continue".toCharArray();
      static final char[] TRANSFER_ENCODING_NAME = 
          "transfer-encoding".toCharArray();
  
  
      static final HttpHeader CONNECTION_CLOSE = 
          new HttpHeader("connection", "close");
      static final HttpHeader EXPECT_CONTINUE = 
          new HttpHeader("expect", "100-continue");
      static final HttpHeader TRANSFER_ENCODING_CHUNKED =
          new HttpHeader("transfer-encoding", "chunked");
  
  
      // ----------------------------------------------------------- Constructors
  
  
      // ----------------------------------------------------- Instance Variables
  
  
      // ------------------------------------------------------------- Properties
  
  
      // --------------------------------------------------------- Public Methods
  
  
      // --------------------------------------------------------- Object Methods
  
  
  }
  
  
  

Mime
View raw message