billbarker    02/03/09 22:14:37

  Added:       coyote/src/java/org/apache/coyote/tomcat3
                        CoyoteInterceptor.java CoyoteProcessor.java
                        CoyoteRequest.java CoyoteResponse.java
  Log:
  Adding the Tomcat 3.3 Coyote file.
  
  They all compile, which is enough for an initial check-in.  The threading and socket 
handling is all standard 3.3.x stuff.
  
  TODO:
    - Improve the handling of the Response headers.
    - Review (and likely improve) the handling of the Request headers.
    - Create the WAR module to allow this to be plugged in.
  
  Revision  Changes    Path
  1.1                  
jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat3/CoyoteInterceptor.java
  
  Index: CoyoteInterceptor.java
  ===================================================================
  /*
   * ====================================================================
   *
   * 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 [EMAIL PROTECTED]
   *
   * 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.tomcat3;
  
  import java.io.*;
  import java.net.*;
  import java.util.*;
  import java.text.*;
  import org.apache.tomcat.core.*;
  import org.apache.tomcat.util.res.StringManager;
  import org.apache.tomcat.util.buf.*;
  import org.apache.tomcat.util.http.*;
  import org.apache.tomcat.util.net.*;
  import org.apache.tomcat.util.net.ServerSocketFactory;
  import org.apache.tomcat.util.log.*;
  import org.apache.tomcat.util.compat.*;
  import org.apache.tomcat.modules.server.PoolTcpConnector;
  import org.apache.coyote.Adapter;
  import org.apache.coyote.Processor;
  
  /** Standalone http.
   *
   *  Connector properties:
   *  <ul>
   *  <li> secure - will load a SSL socket factory and act as https server</li>
   *  </ul>
   *
   *  Properties passed to the net layer:
   *  <ul>
   *  <li>timeout</li>
   *  <li>backlog</li>
   *  <li>address</li>
   *  <li>port</li>
   *  </ul>
   * Thread pool properties:
   *  <ul>
   *  <li>minSpareThreads</li>
   *  <li>maxSpareThreads</li>
   *  <li>maxThreads</li>
   *  <li>poolOn</li>
   *  </ul>
   * Properties for HTTPS:
   *  <ul>
   *  <li>keystore - certificates - default to ~/.keystore</li>
   *  <li>keypass - password</li>
   *  <li>clientauth - true if the server should authenticate the client using 
certs</li>
   *  </ul>
   * Properties for HTTP:
   *  <ul>
   *  <li>reportedname - name of server sent back to browser (security purposes)</li>
   *  </ul>
   */
  public class CoyoteInterceptor extends PoolTcpConnector
      implements  TcpConnectionHandler
  {
      private int       timeout = 300000;       // 5 minutes as in Apache HTTPD server
      private String reportedname;
      private int socketCloseDelay=-1;
      private String processorClassName="org.apache.coyote.http11.Http11Processor";
  
      public CoyoteInterceptor() {
        super();
          super.setSoLinger( 100 );
        // defaults:
        this.setPort( 8080 );
      }
  
      // -------------------- PoolTcpConnector --------------------
  
      protected void localInit() throws Exception {
        ep.setConnectionHandler( this );
      }
  
      // -------------------- Attributes --------------------
      public void setTimeout( int timeouts ) {
        timeout = timeouts * 1000;
      }
      public void setReportedname( String reportedName) {
        reportedname = reportedName;
      }
  
      public void setSocketCloseDelay( int d ) {
          socketCloseDelay=d;
      }
  
      public void setProperty( String prop, String value ) {
          setAttribute( prop, value );
      }
  
      // -------------------- Handler implementation --------------------
      public void setServer( Object o ) {
        this.cm=(ContextManager)o;
      }
      
      public Object[] init() {
        Object thData[]=new Object[3];
        CoyoteProcessor adaptor = new CoyoteProcessor(cm);
        if( secure )
            adaptor.setSSLImplementation(sslImplementation);
        Processor processor = null;
        try {
            Class processorClass = 
                getClass().getClassLoader().loadClass(processorClassName);
            processor = (Processor)processorClass.newInstance();
        } catch(Exception ex) {
            log("Can't load Processor", ex);
        }
  
        thData[0]=adaptor;
        thData[1]=processor;
        thData[2]=null;
        return  thData;
      }
  
      public void processConnection(TcpConnection connection, Object thData[]) {
        Socket socket=null;
        CoyoteProcessor adaptor=null;
        Processor  processor=null;
        try {
            adaptor=(CoyoteProcessor)thData[0];
            processor=(Processor)thData[1];
            processor.setAdapter(adaptor);
            socket=connection.getSocket();
            socket.setSoTimeout(timeout);
  
            InputStream in = socket.getInputStream();
            OutputStream out = socket.getOutputStream();
            adaptor.setSocket(socket);
            processor.process(in, out);
              // If unread input arrives after the shutdownInput() call
              // below and before or during the socket.close(), an error
              // may be reported to the client.  To help troubleshoot this
              // type of error, provide a configurable delay to give the
              // unread input time to arrive so it can be successfully read
              // and discarded by shutdownInput().
              if( socketCloseDelay >= 0 ) {
                  try {
                      Thread.sleep(socketCloseDelay);
                  } catch (InterruptedException ie) { /* ignore */ }
              }
  
            TcpConnection.shutdownInput( socket );
        } catch(java.net.SocketException e) {
            // SocketExceptions are normal
            log( "SocketException reading request, ignored", null,
                 Log.INFORMATION);
            log( "SocketException reading request:", e, Log.DEBUG);
        } catch (java.io.IOException e) {
            // IOExceptions are normal 
            log( "IOException reading request, ignored", null,
                 Log.INFORMATION);
            log( "IOException reading request:", e, Log.DEBUG);
        }
        // Future developers: if you discover any other
        // rare-but-nonfatal exceptions, catch them here, and log as
        // above.
        catch (Throwable e) {
            // any other exception or error is odd. Here we log it
            // with "ERROR" level, so it will show up even on
            // less-than-verbose logs.
            e.printStackTrace();
            log( "Error reading request, ignored", e, Log.ERROR);
        } finally {
            // recycle kernel sockets ASAP
            try { if (socket != null) socket.close (); }
            catch (IOException e) { /* ignore */ }
          }
      }
   
       /**
         getInfo calls for SSL data
   
         @return the requested data
       */
       public Object getInfo( Context ctx, Request request,
                           int id, String key ) {
         // The following code explicitly assumes that the only
         // attributes hand;ed here are HTTP. If you change that
         // you MUST change the test for sslSupport==null --EKR
   
         CoyoteRequest httpReq;
  
         
         try {
        httpReq=(CoyoteRequest)request;
         } catch (ClassCastException e){
        return null;
         }
   
         if(key!=null && httpReq!=null && httpReq.sslSupport!=null){
          try {
              if(key.equals("javax.servlet.request.cipher_suite"))
                  return httpReq.sslSupport.getCipherSuite();
              if(key.equals("javax.servlet.request.X509Certificate"))
                  return httpReq.sslSupport.getPeerCertificateChain();
          } catch (Exception e){
              log("Exception getting SSL attribute " + key,e,Log.WARNING);
              return null;
          }
         }
         return super.getInfo(ctx,request,id,key);
       }
  }
  
  
  
  
  1.1                  
jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat3/CoyoteProcessor.java
  
  Index: CoyoteProcessor.java
  ===================================================================
  /*
   * ====================================================================
   *
   * 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 [EMAIL PROTECTED]
   *
   * 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.tomcat3;
  
  import java.io.*;
  import java.net.*;
  import java.util.*;
  import java.text.*;
  import org.apache.tomcat.core.*;
  import org.apache.tomcat.util.res.StringManager;
  import org.apache.tomcat.util.buf.*;
  import org.apache.tomcat.util.http.*;
  import org.apache.tomcat.util.net.*;
  import org.apache.tomcat.util.net.ServerSocketFactory;
  import org.apache.tomcat.util.log.*;
  import org.apache.tomcat.util.compat.*;
  import org.apache.coyote.Adapter;
  import org.apache.coyote.Processor;
  
  class CoyoteProcessor implements Adapter {
      private CoyoteRequest reqA;
      private CoyoteResponse resA;
      private ContextManager cm;
      private boolean secure=false;
      private Socket socket=null;
      private SSLImplementation sslImplementation=null;
  
      CoyoteProcessor(ContextManager ctxman) {
        cm   = ctxman;
        reqA=new CoyoteRequest();
        resA=new CoyoteResponse();
        cm.initRequest( reqA, resA );
      }
  
      public void recycle() {
        secure = false;
        sslImplementation=null;
      }
  
      public void setSSLImplementation(SSLImplementation ssl) {
        sslImplementation = ssl;
      }
      public void setSecure(boolean isSecure) {
        secure = isSecure;
      }
      public void setSocket(Socket socket) {
        if( secure ) {
            // Load up the SSLSupport class
            if(sslImplementation != null)
                reqA.setSSLSupport(sslImplementation.getSSLSupport(socket));
        }
      }
      public void service(org.apache.coyote.Request request, 
                        org.apache.coyote.Response response) 
            throws Exception{
        reqA.setCoyoteRequest(request);
        resA.setCoyoteResponse(response);
        if( secure ) {
            reqA.scheme().setString( "https" );
            
                // Load up the SSLSupport class
            if(sslImplementation != null)
                reqA.setSSLSupport(sslImplementation.getSSLSupport(socket));
        }
            
        cm.service( reqA, resA );
  
      }
  }
  
  
  
  1.1                  
jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat3/CoyoteRequest.java
  
  Index: CoyoteRequest.java
  ===================================================================
  /*
   * ====================================================================
   *
   * 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 [EMAIL PROTECTED]
   *
   * 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.tomcat3;
  
  import java.io.*;
  import java.net.*;
  import java.util.*;
  import java.text.*;
  import org.apache.tomcat.core.*;
  import org.apache.tomcat.util.res.StringManager;
  import org.apache.tomcat.util.buf.*;
  import org.apache.tomcat.util.http.*;
  import org.apache.tomcat.util.net.*;
  import org.apache.tomcat.util.net.ServerSocketFactory;
  import org.apache.tomcat.util.log.*;
  import org.apache.tomcat.util.compat.*;
  import org.apache.coyote.Adapter;
  import org.apache.coyote.Processor;
  
  class CoyoteRequest extends Request {
  
      org.apache.coyote.Request coyoteRequest=null;
      SSLSupport sslSupport=null;
      ByteChunk  readChunk = new ByteChunk();
      int  pos=-1;
      int  end=-1;
      byte [] readBuffer = null;
      
      public CoyoteRequest() {
          super();
      }
  
      public void recycle() {
        super.recycle();
        if( coyoteRequest != null) coyoteRequest.recycle();
  
        readChunk.recycle();
        sslSupport=null;
        pos=-1;
        end=-1;
      }
  
      public void setCoyoteRequest(org.apache.coyote.Request cReq) {
        coyoteRequest=cReq;
        // This is really ugly, but fast.
        // I could still be talked out of it.
        schemeMB = coyoteRequest.scheme();
        methodMB = coyoteRequest.method();
        uriMB    = coyoteRequest.requestURI();
        queryMB  = coyoteRequest.query();
        protoMB  = coyoteRequest.protocol();
        headers  = coyoteRequest.getMimeHeaders();
        params.setQuery(queryMB);
        params.setHeaders(headers);
      }
  
  
      public int doRead() throws IOException {
        if( available == 0 ) 
            return -1;
        // #3745
        // if available == -1: unknown length, we'll read until end of stream.
        if( available!= -1 )
            available--;
        if(pos >= end) {
            if(doRead() < 0)
                return -1;
        }
        return readBuffer[pos++] & 0xFF;
      }
  
      public int doRead(byte[] b, int off, int len) throws IOException {
        if( available == 0 )
            return -1;
        // if available == -1: unknown length, we'll read until end of stream.
        if(pos >= end) {
            if(doRead() < 0) 
                return -1;
        }
        int rd = -1;
        if((end - pos) > len) {
            rd = len;
        } else {
            rd = end - pos;
        }
  
          System.arraycopy(readBuffer, pos, b, off, rd);
        pos += rd;
        if( available!= -1 )
            available -= rd;
  
        return rd;
      }
      
      /**
       * Read bytes to the read chunk buffer.
       */
      protected int readBytes()
          throws IOException {
  
          int result = coyoteRequest.doRead(readChunk);
          if (result > 0) {
              readBuffer = readChunk.getBytes();
              end = readChunk.getEnd();
              pos = readChunk.getStart();
          }
          return result;
  
      }
  
  
      // -------------------- override special methods
  
      public MessageBytes remoteAddr() {
        return coyoteRequest.remoteAddr();
      }
  
      public MessageBytes remoteHost() {
        return coyoteRequest.remoteHost();
      }
  
      public String getLocalHost() {
        return coyoteRequest.getLocalHost();
      }
  
      public MessageBytes serverName(){
          return coyoteRequest.serverName();
      }
  
      public int getServerPort(){
          return coyoteRequest.getServerPort();
      }
  
      void setSSLSupport(SSLSupport s){
          sslSupport=s;
      }
   
  }
  
  
  
  1.1                  
jakarta-tomcat-connectors/coyote/src/java/org/apache/coyote/tomcat3/CoyoteResponse.java
  
  Index: CoyoteResponse.java
  ===================================================================
  /*
   * ====================================================================
   *
   * 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 [EMAIL PROTECTED]
   *
   * 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.tomcat3;
  
  import java.io.*;
  import java.net.*;
  import java.util.*;
  import java.text.*;
  import org.apache.tomcat.core.*;
  import org.apache.tomcat.util.res.StringManager;
  import org.apache.tomcat.util.buf.*;
  import org.apache.tomcat.util.http.*;
  import org.apache.tomcat.util.net.*;
  import org.apache.tomcat.util.net.ServerSocketFactory;
  import org.apache.tomcat.util.log.*;
  import org.apache.tomcat.util.compat.*;
  
  
  
  
  class CoyoteResponse extends  Response {
      String reportedname=null;
      DateFormat dateFormat=null;
      org.apache.coyote.Response coyoteResponse=null;
      ByteChunk outputChunk = new ByteChunk();
      
      public CoyoteResponse() {
          super();
      }
  
      public void setCoyoteResponse(org.apache.coyote.Response cRes) {
        coyoteResponse = cRes;
      }
  
      public void init() {
        super.init();
        dateFormat=new SimpleDateFormat(DateTool.RFC1123_PATTERN,
                                        Locale.US);
        dateFormat.setTimeZone(DateTool.GMT_ZONE);
      }
      
  
      public void recycle() {
        super.recycle();
        if(coyoteResponse != null) coyoteResponse.recycle();
        outputChunk.recycle();
      }
  
      public void setReported(String reported) {
          reportedname = reported;
      }
  
      public void endHeaders()  throws IOException {
        super.endHeaders();
        Enumeration names = getMimeHeaders().names();
        while( names.hasMoreElements() ) {
            String hname = (String)names.nextElement();
            Enumeration values = getMimeHeaders().values(hname);
            while( values.hasMoreElements() ) {
                String hvalue = (String)values.nextElement();
                coyoteResponse.addHeader(hname, hvalue);
            }
        }
        coyoteResponse.sendHeaders();
      }
  
      public void doWrite( byte buffer[], int pos, int count)
        throws IOException
      {
        if( count > 0 ) {
            outputChunk.setBytes(buffer, pos, count);
            coyoteResponse.doWrite( outputChunk );
        }
      }
  }
  
  
  

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

Reply via email to