remm        01/12/02 22:09:30

  Modified:    http11/src/java/org/apache/coyote/http11
                        Http11Connector.java InputFilter.java
                        InternalInputBuffer.java InternalOutputBuffer.java
                        OutputFilter.java
               http11/src/java/org/apache/coyote/http11/filters
                        IdentityInputFilter.java IdentityOutputFilter.java
  Log:
  - Continuing development.
  - Change the pattern used by the filters to use a more conventional chain. The
    old machanism was too constraining.
  
  Revision  Changes    Path
  1.3       +48 -7     
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11Connector.java
  
  Index: Http11Connector.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11Connector.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Http11Connector.java      2001/10/01 01:20:42     1.2
  +++ Http11Connector.java      2001/12/03 06:09:30     1.3
  @@ -59,6 +59,8 @@
   
   package org.apache.coyote.http11;
   
  +import java.io.EOFException;
  +import java.io.InterruptedIOException;
   import java.io.InputStream;
   import java.io.IOException;
   import java.io.OutputStream;
  @@ -156,17 +158,56 @@
           inputBuffer.setInputStream(input);
           outputBuffer.setOutputStream(output);
   
  +        // Ok flag
  +        boolean ok = true;
  +        // TEMP
  +        boolean stopped = false;
  +
  +        while (!stopped && ok) {
  +
  +            try {
  +                inputBuffer.parseRequestLine();
  +                // Check for HTTP/0.9
  +                
  +                inputBuffer.parseHeaders();
  +            } catch (EOFException e) {
  +                ok = false;
  +            } catch (InterruptedIOException e) {
  +                //HttpServletResponse.SC_BAD_REQUEST
  +                ok = false;
  +            } catch (Exception e) {
  +                //SC_BAD_REQUEST
  +                ok = false;
  +            }
  +
  +            // Setting up filters, and parse some request headers
  +            prepareRequest();
  +
  +            // Process the request in the adapter
  +            try {
  +                adapter.service(request, response);
  +            } catch (InterruptedIOException e) {
  +                ok = false;
  +            } catch (Throwable t) {
  +                // ISE
  +                ok = false;
  +            }
  +
  +            // Finish the handling of the request
  +            try {
  +                outputBuffer.endRequest();
  +            } catch (IOException e) {
  +                ok = false;
  +            } catch (Throwable t) {
  +                // Problem ...
  +                ok = false;
  +            }
   
  +            // FIXME: Next request
   
  -
  -        try {
  -            adapter.service(request, response);
  -        } catch (Exception e) {
  -            ;
           }
  -
  -
   
  +        // FIXME: Recycle
   
       }
   
  
  
  
  1.3       +6 -0      
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InputFilter.java
  
  Index: InputFilter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InputFilter.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InputFilter.java  2001/09/17 21:27:31     1.2
  +++ InputFilter.java  2001/12/03 06:09:30     1.3
  @@ -107,4 +107,10 @@
       public ByteChunk getEncodingName();
   
   
  +    /**
  +     * Set the next buffer in the filter pipeline.
  +     */
  +    public void setBuffer(InputBuffer buffer);
  +
  +
   }
  
  
  
  1.2       +51 -26    
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InternalInputBuffer.java
  
  Index: InternalInputBuffer.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InternalInputBuffer.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- InternalInputBuffer.java  2001/09/17 06:04:00     1.1
  +++ InternalInputBuffer.java  2001/12/03 06:09:30     1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InternalInputBuffer.java,v
 1.1 2001/09/17 06:04:00 remm Exp $
  - * $Revision: 1.1 $
  - * $Date: 2001/09/17 06:04:00 $
  + * $Header: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InternalInputBuffer.java,v
 1.2 2001/12/03 06:09:30 remm Exp $
  + * $Revision: 1.2 $
  + * $Date: 2001/12/03 06:09:30 $
    *
    * ====================================================================
    *
  @@ -111,6 +111,8 @@
           headerBuffer2 = new byte[headerBufferSize];
           bodyBuffer = new byte[headerBufferSize];
   
  +        inputStreamInputBuffer = new InputStreamInputBuffer();
  +
           filterLibrary = new InputFilter[0];
           activeFilters = new InputFilter[0];
   
  @@ -193,6 +195,12 @@
   
   
       /**
  +     * Underlying input buffer.
  +     */
  +    protected InputBuffer inputStreamInputBuffer;
  +
  +
  +    /**
        * Filter library.
        * Note: Filter[0] is always the "chunked" filter.
        */
  @@ -285,7 +293,13 @@
           // FIXME: Check for null ?
           // FIXME: Check index ?
   
  -        activeFilters[lastActiveFilter++] = filter;
  +        if (lastActiveFilter == 0) {
  +            filter.setBuffer(inputStreamInputBuffer);
  +        } else {
  +            filter.setBuffer(activeFilters[lastActiveFilter]);
  +        }
  +
  +        activeFilters[++lastActiveFilter] = filter;
   
       }
   
  @@ -655,29 +669,8 @@
        */
       public int doRead(ByteChunk chunk) 
           throws IOException {
  -
  -        if (pos >= lastValid) {
  -            if (!fill())
  -                return -1;
  -        }
  -
  -        chunk.setBytes(buf, pos, lastValid - pos);
  -
  -        int n = -1;
  -
  -        if (lastActiveFilter > 0) {
  -            // Parsing through the filter list
  -            for (int i = 0; i < lastActiveFilter; i++) {
  -                int nRead = activeFilters[i].doRead(chunk);
  -                if ((n < 0) && (nRead >= 0)) {
  -                    n = nRead;
  -                }
  -            }
  -        }
  -
  -        pos = pos + n;
   
  -        return n;
  +        return activeFilters[lastActiveFilter].doRead(chunk);
   
       }
   
  @@ -720,6 +713,38 @@
           }
   
           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) 
  +            throws IOException {
  +
  +            if (pos >= lastValid) {
  +                if (!fill())
  +                    return -1;
  +            }
  +
  +            chunk.setBytes(buf, pos, lastValid - pos);
  +
  +            return (lastValid - pos);
  +
  +        }
  +
   
       }
   
  
  
  
  1.3       +44 -36    
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InternalOutputBuffer.java
  
  Index: InternalOutputBuffer.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/InternalOutputBuffer.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InternalOutputBuffer.java 2001/10/01 01:20:42     1.2
  +++ InternalOutputBuffer.java 2001/12/03 06:09:30     1.3
  @@ -105,6 +105,8 @@
           headerBuffer = new byte[headerBufferSize];
           buf = headerBuffer;
   
  +        outputStreamOutputBuffer = new OutputStreamOutputBuffer();
  +
           filterLibrary = new OutputFilter[0];
           activeFilters = new OutputFilter[0];
   
  @@ -169,6 +171,12 @@
   
   
       /**
  +     * Underlying output buffer.
  +     */
  +    protected OutputBuffer outputStreamOutputBuffer;
  +
  +
  +    /**
        * Filter library.
        * Note: Filter[0] is always the "chunked" filter.
        */
  @@ -176,7 +184,7 @@
   
   
       /**
  -     * Active filters (in order).
  +     * Active filter (which is actually the top of the pipeline).
        */
       protected OutputFilter[] activeFilters;
   
  @@ -187,12 +195,6 @@
       protected int lastActiveFilter;
   
   
  -    /**
  -     * Chunk used when closing the response.
  -     */
  -    protected ByteChunk closeChunk = new ByteChunk(4096);
  -
  -
       // ------------------------------------------------------------- Properties
   
   
  @@ -266,8 +268,14 @@
   
           // FIXME: Check for null ?
           // FIXME: Check index ?
  +
  +        if (lastActiveFilter == 0) {
  +            filter.setBuffer(outputStreamOutputBuffer);
  +        } else {
  +            filter.setBuffer(activeFilters[lastActiveFilter]);
  +        }
   
  -        activeFilters[lastActiveFilter++] = filter;
  +        activeFilters[++lastActiveFilter] = filter;
   
       }
   
  @@ -288,7 +296,6 @@
           pos = 0;
           lastActiveFilter = 0;
           committed = false;
  -        closeChunk.recycle();
   
       }
   
  @@ -317,7 +324,6 @@
           pos = 0;
           lastActiveFilter = 0;
           committed = false;
  -        closeChunk.recycle();
   
       }
   
  @@ -341,19 +347,6 @@
   
           }
   
  -        if (lastActiveFilter > 0) {
  -            // Parsing through the filter list
  -            for (int i = 0; i < lastActiveFilter; i++) {
  -                activeFilters[i].close(closeChunk);
  -            }
  -        }
  -
  -        if (closeChunk.getLength() > 0) {
  -            outputStream.write(closeChunk.getBytes(), closeChunk.getStart(), 
  -                               closeChunk.getLength());
  -            outputStream.flush();
  -        }
  -
       }
   
   
  @@ -474,21 +467,9 @@
               commit();
   
           }
  -
  -        int n = -1;
  -
  -        if (lastActiveFilter > 0) {
  -            // Parsing through the filter list
  -            for (int i = 0; i < lastActiveFilter; i++) {
  -                n = activeFilters[i].doWrite(chunk);
  -            }
  -        }
   
  -        outputStream.write(chunk.getBytes(), chunk.getStart(), 
  -                           chunk.getLength());
  +        return activeFilters[lastActiveFilter].doWrite(chunk);
   
  -        return n;
  -
       }
   
   
  @@ -593,6 +574,33 @@
       protected void write(int i) {
   
           write(String.valueOf(i));
  +
  +    }
  +
  +
  +    // ----------------------------------- OutputStreamOutputBuffer Inner Class
  +
  +
  +    /**
  +     * This class is an output buffer which will write data to an output
  +     * stream.
  +     */
  +    protected class OutputStreamOutputBuffer 
  +        implements OutputBuffer {
  +
  +
  +        /**
  +         * Write chunk.
  +         */
  +        public int doWrite(ByteChunk chunk) 
  +            throws IOException {
  +
  +            outputStream.write(chunk.getBuffer(), chunk.getStart(), 
  +                               chunk.getLength());
  +            return chunk.getLength();
  +
  +        }
  +
   
       }
   
  
  
  
  1.3       +14 -4     
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/OutputFilter.java
  
  Index: OutputFilter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/OutputFilter.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- OutputFilter.java 2001/09/17 21:27:31     1.2
  +++ OutputFilter.java 2001/12/03 06:09:30     1.3
  @@ -94,15 +94,19 @@
       /**
        * Flush the internal buffer of the filter (if any).
        */
  -    public int flush(ByteChunk chunk)
  -        throws IOException;
  +    /*
  +      public int flush(ByteChunk chunk)
  +      throws IOException;
  +    */
   
   
       /**
        * Called when ending the request.
        */
  -    public int close(ByteChunk chunk)
  -        throws IOException;
  +    /*
  +      public int close(ByteChunk chunk)
  +      throws IOException;
  +    */
   
   
       /**
  @@ -115,6 +119,12 @@
        * Get the name of the encoding handled by this filter.
        */
       public ByteChunk getEncodingName();
  +
  +
  +    /**
  +     * Set the next buffer in the filter pipeline.
  +     */
  +    public void setBuffer(OutputBuffer buffer);
   
   
   }
  
  
  
  1.2       +16 -0     
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/filters/IdentityInputFilter.java
  
  Index: IdentityInputFilter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/filters/IdentityInputFilter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- IdentityInputFilter.java  2001/09/17 21:27:32     1.1
  +++ IdentityInputFilter.java  2001/12/03 06:09:30     1.2
  @@ -105,6 +105,12 @@
       protected long remaining = -1;
   
   
  +    /**
  +     * Next buffer in the pipeline.
  +     */
  +    protected InputBuffer buffer;
  +
  +
       // ------------------------------------------------------------- Properties
   
   
  @@ -139,6 +145,8 @@
       public int doRead(ByteChunk chunk)
           throws IOException {
   
  +        buffer.doRead(chunk);
  +
           int result = chunk.getLength();
   
           if (result <= 0) {
  @@ -182,6 +190,14 @@
       public void setRequest(Request request) {
           contentLength = request.getContentLength();
           remaining = contentLength;
  +    }
  +
  +
  +    /**
  +     * Set the next buffer in the filter pipeline.
  +     */
  +    public void setBuffer(InputBuffer buffer) {
  +        this.buffer = buffer;
       }
   
   
  
  
  
  1.2       +20 -0     
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java
  
  Index: IdentityOutputFilter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/filters/IdentityOutputFilter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- IdentityOutputFilter.java 2001/09/17 21:27:32     1.1
  +++ IdentityOutputFilter.java 2001/12/03 06:09:30     1.2
  @@ -105,6 +105,12 @@
       protected long remaining = -1;
   
   
  +    /**
  +     * Next buffer in the pipeline.
  +     */
  +    protected OutputBuffer buffer;
  +
  +
       // ------------------------------------------------------------- Properties
   
   
  @@ -162,6 +168,8 @@
               }
           }
   
  +        buffer.doWrite(chunk);
  +
           return result;
   
       }
  @@ -181,18 +189,29 @@
   
   
       /**
  +     * Set the next buffer in the filter pipeline.
  +     */
  +    public void setBuffer(OutputBuffer buffer) {
  +        this.buffer = buffer;
  +    }
  +
  +
  +    /**
        * Don't do anything in particular when flushing.
        */
  +    /*
       public int flush(ByteChunk chunk)
           throws IOException {
           return doWrite(chunk);
       }
  +    */
   
   
       /**
        * Write the remaining bytes, and check that the number of bytes written
        * is correct.
        */
  +    /*
       public int close(ByteChunk chunk)
           throws IOException {
   
  @@ -207,6 +226,7 @@
           return n;
   
       }
  +    */
   
   
       /**
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to