You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by cr...@locus.apache.org on 2000/05/03 04:12:45 UTC

cvs commit: jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test HttpConnector.java HttpProcessor.java HttpRequestImpl.java HttpResponseImpl.java LocalStrings.properties

craigmcc    00/05/02 19:12:45

  Modified:    proposals/catalina/src/conf server.xml
               proposals/catalina/src/share/org/apache/tomcat/connector/test
                        HttpConnector.java HttpProcessor.java
                        HttpRequestImpl.java HttpResponseImpl.java
                        LocalStrings.properties
  Removed:     proposals/catalina/src/share/org/apache/tomcat/connector
                        ConnectorBase.java
  Log:
  Add debugging output logic to the HttpConnector and HttpProcessor classes,
  and use it to debug some race conditions that could cause hangs.  This also
  seems to improve performance on Solaris, but I haven't tried to do any
  rigorous performance mearuements -- functionality comes first.
  
  Revision  Changes    Path
  1.14      +3 -3      jakarta-tomcat/proposals/catalina/src/conf/server.xml
  
  Index: server.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/proposals/catalina/src/conf/server.xml,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- server.xml	2000/05/01 23:13:41	1.13
  +++ server.xml	2000/05/03 02:12:43	1.14
  @@ -7,8 +7,8 @@
     <!-- Define all the connectors to associate with the following container -->
   
     <Connector className="org.apache.tomcat.connector.test.HttpConnector"
  -             port="8080" acceptCount="10"
  -	     minProcessors="20" maxProcessors="60"/>
  +             port="8080" minProcessors="5" maxProcessors="60"
  +	     acceptCount="10" debug="0"/>
   
     <!-- Define the top level container in our container hierarchy -->
   
  @@ -30,7 +30,7 @@
   
         <!-- Access log processes all requests for this virtual host -->
         <Valve className="org.apache.tomcat.valves.AccessLogValve"
  -             directory="logs" prefix="localhost_access_log." suffix=""
  +             directory="logs" prefix="localhost_access_log." suffix=".txt"
                pattern="common"/>
   
         <!-- Logger shared by all Contexts related to this virtual host -->
  
  
  
  1.6       +94 -80    jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpConnector.java
  
  Index: HttpConnector.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpConnector.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- HttpConnector.java	2000/04/30 21:32:07	1.5
  +++ HttpConnector.java	2000/05/03 02:12:44	1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpConnector.java,v 1.5 2000/04/30 21:32:07 craigmcc Exp $
  - * $Revision: 1.5 $
  - * $Date: 2000/04/30 21:32:07 $
  + * $Header: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpConnector.java,v 1.6 2000/05/03 02:12:44 craigmcc Exp $
  + * $Revision: 1.6 $
  + * $Date: 2000/05/03 02:12:44 $
    *
    * ====================================================================
    *
  @@ -82,7 +82,6 @@
   import org.apache.tomcat.Logger;
   import org.apache.tomcat.Request;
   import org.apache.tomcat.Response;
  -import org.apache.tomcat.connector.ConnectorBase;
   import org.apache.tomcat.util.LifecycleSupport;
   import org.apache.tomcat.util.StringManager;
   
  @@ -92,13 +91,12 @@
    * purposes.  Not intended to be the final solution.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.5 $ $Date: 2000/04/30 21:32:07 $
  + * @version $Revision: 1.6 $ $Date: 2000/05/03 02:12:44 $
    */
   
   
   public final class HttpConnector
  -    extends ConnectorBase
  -    implements Lifecycle, Runnable {
  +    implements Connector, Lifecycle, Runnable {
   
   
       // ----------------------------------------------------- Instance Variables
  @@ -124,6 +122,12 @@
   
   
       /**
  +     * The Container used for processing requests received by this Connector.
  +     */
  +    protected Container container = null;
  +
  +
  +    /**
        * The set of processors that have ever been created.
        */
       private Vector created = new Vector();
  @@ -136,6 +140,12 @@
   
   
       /**
  +     * The debugging detail level for this component.
  +     */
  +    private int debug = 0;
  +
  +
  +    /**
        * Descriptive information about this Connector implementation.
        */
       private static final String info =
  @@ -296,6 +306,30 @@
   
   
       /**
  +     * Return the Container used for processing requests received by this
  +     * Connector.
  +     */
  +    public Container getContainer() {
  +
  +	return (container);
  +
  +    }
  +
  +
  +    /**
  +     * Set the Container used for processing requests received by this
  +     * Connector.
  +     *
  +     * @param container The new Container to use
  +     */
  +    public void setContainer(Container container) {
  +
  +	this.container = container;
  +
  +    }
  +
  +
  +    /**
        * Return the current number of processors that have been created.
        */
       public int getCurProcessors() {
  @@ -306,6 +340,28 @@
   
   
       /**
  +     * Return the debugging detail level for this component.
  +     */
  +    public int getDebug() {
  +
  +        return (debug);
  +
  +    }
  +
  +
  +    /**
  +     * Set the debugging detail level for this component.
  +     *
  +     * @param debug The new debugging detail level
  +     */
  +    public void setDebug(int debug) {
  +
  +        this.debug = debug;
  +
  +    }
  +
  +
  +    /**
        * Return descriptive information about this Connector implementation.
        */
       public String getInfo() {
  @@ -381,37 +437,14 @@
       }
   
   
  -    /**
  -     * Return the thread name of our background thread.
  -     */
  -    public String getThreadName() {
  -
  -	return (threadName);
  -
  -    }
  -
  -
  -    /**
  -     * Set the thread name of our background thread.
  -     *
  -     * @param name The new thread name
  -     */
  -    public void setThreadName(String name) {
  -
  -	this.threadName = name;
  -
  -    }
  -
  -
       // --------------------------------------------------------- Public Methods
   
   
       /**
  -     * Instantiate and return a new Request object suitable for specifying
  -     * the contents of a Request to the responsible Container.  This method
  -     * must be implemented by a subclass.
  +     * Create (or allocate) and return a Request object suitable for
  +     * specifying the contents of a Request to the responsible Container.
        */
  -    public Request newRequest() {
  +    public Request createRequest() {
   
   	HttpRequestImpl request = new HttpRequestImpl();
   	request.setConnector(this);
  @@ -421,11 +454,10 @@
   
   
       /**
  -     * Instantiate and return a new Response object suitable for receiving
  -     * the contents of a Response from the responsible Container.  This method
  -     * must be implemented by a subclass.
  +     * Create (or allocate) and return a Response object suitable for
  +     * receiving the contents of a Response from the responsible Container.
        */
  -    public Response newResponse() {
  +    public Response createResponse() {
   
   	HttpResponseImpl response = new HttpResponseImpl();
   	response.setConnector(this);
  @@ -438,38 +470,14 @@
   
   
       /**
  -     * Recycle the specified Processor.
  +     * Recycle the specified Processor so that it can be used again.
        *
        * @param processor The processor to be recycled
        */
       void recycle(HttpProcessor processor) {
  -
  -	processors.push(processor);
   
  -    }
  -
  -
  -    /**
  -     * Recycle the specified Request.
  -     *
  -     * @param request The request to be recycled
  -     */
  -    void recycle(HttpRequest request) {
  -
  -	requests.push(request);
  -
  -    }
  +        processors.push(processor);
   
  -
  -    /**
  -     * Recycle the specified Response.
  -     *
  -     * @param response The response to be recycled
  -     */
  -    void recycle(HttpResponse response) {
  -
  -	responses.push(response);
  -
       }
   
   
  @@ -488,8 +496,9 @@
   	    if (processors.size() > 0)
   		return ((HttpProcessor) processors.pop());
   	    if ((maxProcessors > 0) && (curProcessors < maxProcessors))
  -		return (newProcessor());
  -	    return (null);
  +	        return (newProcessor());
  +	    else
  +	        return (null);
   	}
   
       }
  @@ -531,17 +540,18 @@
   
   
       /**
  -     * Instantiate and return a new processor suitable for receiving
  -     * and processing HTTP requests.
  +     * Create and return a new processor suitable for processing HTTP
  +     * requests and returning the corresponding responses.
        */
       private HttpProcessor newProcessor() {
   
  -	HttpProcessor processor = new HttpProcessor(this, curProcessors++);
  +        HttpProcessor processor = new HttpProcessor(this, curProcessors++);
   	if (processor instanceof Lifecycle) {
   	    try {
  -		((Lifecycle) processor).start();
  +	        ((Lifecycle) processor).start();
   	    } catch (LifecycleException e) {
  -		log("HttpConnector.newProcessor: ", e);
  +	        log("newProcessor", e);
  +	        return (null);
   	    }
   	}
   	created.addElement(processor);
  @@ -560,8 +570,10 @@
       private ServerSocket open() throws IOException {
   
   	// If no address is specified, open a connection on all addresses
  -	if (address == null)
  +        if (address == null) {
  +	    log(sm.getString("httpConnector.allAddresses"));
   	    return new ServerSocket(port, acceptCount);
  +	}
   
   	// Open a server socket on the specified address
   	InetAddress[] addresses = InetAddress.getAllByName("localhost");
  @@ -590,6 +602,7 @@
        */
       public void run() {
   
  +        // Loop until we receive a shutdown command
   	while (!stopped) {
   
   	    // Accept the next incoming connection from the server socket
  @@ -597,7 +610,7 @@
   	    try {
   		socket = serverSocket.accept();
   	    } catch (IOException e) {
  -		if (!stopped)
  +		if (started && !stopped)
   		    log("accept: ", e);
   		break;
   	    }
  @@ -606,17 +619,20 @@
   	    HttpProcessor processor = createProcessor();
   	    if (processor == null) {
   		try {
  -		    log("select: No processor available");
  +		    log(sm.getString("httpConnector.noProcessor"));
   		    socket.close();
   		} catch (IOException e) {
   		    ;
   		}
   		continue;
   	    }
  -	    processor.process(socket);
  +	    processor.assign(socket);
   
  +	    // The processor will recycle itself when it finishes
  +
   	}
   
  +	// Notify the threadStop() method that we have shut ourselves down
   	synchronized (threadSync) {
   	    threadSync.notifyAll();
   	}
  @@ -628,11 +644,8 @@
        * Start the background processing thread.
        */
       private void threadStart() {
  -
  -	if (threadName == null)
  -	    setThreadName("HttpConnector[" + port + "]");
   
  -	log("Starting");
  +	log(sm.getString("httpConnector.starting"));
   
   	thread = new Thread(this, threadName);
   	thread.setDaemon(true);
  @@ -646,7 +659,7 @@
        */
       private void threadStop() {
   
  -	log("Stopping");
  +	log(sm.getString("httpConnector.stopping"));
   
   	stopped = true;
   	synchronized (threadSync) {
  @@ -699,6 +712,7 @@
   	if (started)
   	    throw new LifecycleException
   		(sm.getString("httpConnector.alreadyStarted"));
  +        threadName = "HttpConnector[" + port + "]";
   	lifecycle.fireLifecycleEvent(START_EVENT, null);
   	started = true;
   
  @@ -706,7 +720,7 @@
   	try {
   	    serverSocket = open();
   	} catch (IOException e) {
  -	    throw new LifecycleException("HttpConnector[" + port + "]", e);
  +	    throw new LifecycleException(threadName + ".open", e);
   	}
   
   	// Start our background thread
  
  
  
  1.6       +123 -50   jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpProcessor.java
  
  Index: HttpProcessor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpProcessor.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- HttpProcessor.java	2000/05/01 23:13:42	1.5
  +++ HttpProcessor.java	2000/05/03 02:12:44	1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpProcessor.java,v 1.5 2000/05/01 23:13:42 craigmcc Exp $
  - * $Revision: 1.5 $
  - * $Date: 2000/05/01 23:13:42 $
  + * $Header: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpProcessor.java,v 1.6 2000/05/03 02:12:44 craigmcc Exp $
  + * $Revision: 1.6 $
  + * $Date: 2000/05/03 02:12:44 $
    *
    * ====================================================================
    *
  @@ -75,6 +75,7 @@
   import java.util.StringTokenizer;
   import javax.servlet.ServletException;
   import javax.servlet.http.Cookie;
  +import javax.servlet.http.HttpServletRequest;
   import javax.servlet.http.HttpServletResponse;
   import org.apache.tomcat.Connector;
   import org.apache.tomcat.Container;
  @@ -98,7 +99,7 @@
    * the request.  When the processor is completed, it will recycle itself.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.5 $ $Date: 2000/05/01 23:13:42 $
  + * @version $Revision: 1.6 $ $Date: 2000/05/03 02:12:44 $
    */
   
   final class HttpProcessor
  @@ -118,9 +119,13 @@
   
   	super();
   	this.connector = connector;
  +	this.debug = connector.getDebug();
   	this.id = id;
  -	request = (HttpRequest) connector.newRequest();
  -	response = (HttpResponse) connector.newResponse();
  +	this.request = (HttpRequest) connector.createRequest();
  +	this.response = (HttpResponse) connector.createResponse();
  +	this.threadName =
  +	  "HttpProcessor[" + connector.getPort() + "][" + id + "]";
  +
       }
   
   
  @@ -128,21 +133,27 @@
   
   
       /**
  +     * Is there a new socket available?
  +     */
  +    private boolean available = false;
  +
  +
  +    /**
        * The HttpConnector with which this processor is associated.
        */
       private HttpConnector connector = null;
   
   
       /**
  -     * The identifier of this processor, unique per connector.
  +     * The debugging detail level for this component.
        */
  -    private int id = 0;
  +    private int debug = 0;
   
   
       /**
  -     * The input stream associated with this request.
  +     * The identifier of this processor, unique per connector.
        */
  -    private InputStream input = null;
  +    private int id = 0;
   
   
       /**
  @@ -159,12 +170,6 @@
   
   
       /**
  -     * The output stream associated with this request.
  -     */
  -    private OutputStream output = null;
  -
  -
  -    /**
        * The HTTP request object we will pass to our associated container.
        */
       private HttpRequest request = null;
  @@ -184,8 +189,8 @@
   
   
       /**
  -     * The socket we are currently processing a request for.  If this is
  -     * <code>null</code>, this processor is available.
  +     * The socket we are currently processing a request for.  This object
  +     * is used for inter-thread communication only.
        */
       private Socket socket = null;
   
  @@ -232,12 +237,23 @@
        *
        * @param socket TCP socket to process
        */
  -    void process(Socket socket) {
  +    synchronized void assign(Socket socket) {
  +
  +        // Wait for the Processor to get the previous Socket
  +        while (available) {
  +	    try {
  +	        wait();
  +	    } catch (InterruptedException e) {
  +	    }
  +        }
   
  +	// Store the newly available Socket and notify our thread
   	this.socket = socket;
  -	synchronized (this) {
  -	    notify();
  -	}
  +	available = true;
  +	notifyAll();
  +
  +	if ((debug >= 1) && (socket != null))
  +	    log(" An incoming request is being assigned");
   
       }
   
  @@ -246,6 +262,34 @@
   
   
       /**
  +     * Await a newly assigned Socket from our Connector, or <code>null</code>
  +     * if we are supposed to shut down.
  +     */
  +    private synchronized Socket await() {
  +
  +        // Wait for the Connector to provide a new Socket
  +        while (!available) {
  +	    try {
  +	        wait();
  +	    } catch (InterruptedException e) {
  +	    }
  +        }
  +
  +	// Notify the Connector that we have received this Socket
  +	Socket socket = this.socket;
  +	available = false;
  +	notifyAll();
  +
  +	if ((debug >= 1) && (socket != null))
  +	    log("  The incoming request has been awaited");
  +
  +	return (socket);
  +
  +    }
  +
  +
  +
  +    /**
        * Log a message on the Logger associated with our Container (if any)
        *
        * @param message Message to be logged
  @@ -277,11 +321,17 @@
       /**
        * Parse and record the connection parameters related to this request.
        *
  +     * @param socket The socket on which we are connected
  +     *
        * @exception IOException if an input/output error occurs
        * @exception ServletException if a parsing error occurs
        */
  -    private void parseConnection() throws IOException, ServletException {
  +    private void parseConnection(Socket socket)
  +        throws IOException, ServletException {
   
  +	if (debug >= 2)
  +	    log("  parseConnection: address=" + socket.getInetAddress() +
  +		", port=" + connector.getPort());
   	((HttpRequestImpl) request).setInet(socket.getInetAddress());
   	request.setServerPort(connector.getPort());
   
  @@ -292,15 +342,18 @@
        * Parse the incoming HTTP request headers, and set the appropriate
        * request headers.
        *
  +     * @param input The input stream connected to our socket
  +     *
        * @exception IOException if an input/output error occurs
        * @exception ServletException if a parsing error occurs
        */
  -    private void parseHeaders() throws IOException, ServletException {
  +    private void parseHeaders(InputStream input)
  +        throws IOException, ServletException {
   
   	while (true) {
   
   	    // Read the next header line
  -	    String line = read();
  +	    String line = read(input);
   	    if ((line == null) || (line.length() < 1))
   		break;
   
  @@ -312,6 +365,8 @@
   	    String name = line.substring(0, colon).trim();
   	    String match = name.toLowerCase();
   	    String value = line.substring(colon + 1).trim();
  +	    if (debug >= 1)
  +	        log(" Header " + name + " = " + value);
   
   	    // Set the corresponding request headers
   	    if (match.equals("authorization")) {
  @@ -329,6 +384,9 @@
   			request.setRequestedSessionId(cookies[i].getValue());
   			request.setRequestedSessionCookie(true);
   			request.setRequestedSessionURL(false);
  +			if (debug >= 1)
  +			  log(" Requested cookie session id is " +
  +			      ((HttpServletRequest) request.getRequest()).getRequestedSessionId());
   		    } else
   			request.addCookie(cookies[i]);
   		}
  @@ -370,13 +428,16 @@
        * Parse the incoming HTTP request and set the corresponding HTTP request
        * properties.
        *
  +     * @param input The input stream attached to our socket
  +     *
        * @exception IOException if an input/output error occurs
        * @exception ServletException if a parsing error occurs
        */
  -    private void parseRequest() throws IOException, ServletException {
  +    private void parseRequest(InputStream input)
  +        throws IOException, ServletException {
   
   	// Parse the incoming request line
  -	String line = read();
  +	String line = read(input);
   	if (line == null)
   	    throw new ServletException
   		(sm.getString("httpProcessor.parseRequest.read"));
  @@ -417,6 +478,9 @@
   	int question = uri.indexOf("?");
   	if (question >= 0) {
   	    request.setQueryString(uri.substring(question + 1));
  +	    if (debug >= 1)
  +	        log(" Query string is " +
  +		    ((HttpServletRequest) request.getRequest()).getQueryString());
   	    uri = uri.substring(0, question);
   	} else
   	    request.setQueryString(null);
  @@ -435,6 +499,9 @@
   	    }
   	    request.setRequestedSessionURL(true);
   	    uri = uri.substring(0, semicolon) + rest;
  +	    if (debug >= 1)
  +	        log(" Requested URL session id is " +
  +		    ((HttpServletRequest) request.getRequest()).getRequestedSessionId());
   	} else {
   	    request.setRequestedSessionId(null);
   	    request.setRequestedSessionURL(false);
  @@ -447,6 +514,9 @@
   	request.setSecure(false);	// No SSL support
   	request.setScheme("http");	// No SSL support
   
  +	if (debug >= 1)
  +	    log(" Request is " + method + " for " + uri);
  +
       }
   
   
  @@ -454,10 +524,14 @@
        * Process an incoming HTTP request on the Socket that has been assigned
        * to this Processor.  Any exceptions that occur during processing must be
        * swallowed and dealt with.
  +     *
  +     * @param socket The socket on which we are connected to the client
        */
  -    private void process() {
  +    private void process(Socket socket) {
   
   	boolean ok = true;
  +	InputStream input = null;
  +	OutputStream output = null;
   
   	// Construct and initialize the objects we will need
   	try {
  @@ -478,10 +552,10 @@
   	// Parse the incoming request
   	try {
   	    if (ok) {
  -		parseConnection();
  -		parseRequest();
  +		parseConnection(socket);
  +		parseRequest(input);
   		if (!request.getRequest().getProtocol().startsWith("HTTP/0"))
  -		    parseHeaders();
  +		    parseHeaders(input);
   	    }
   	} catch (Exception e) {
   	    try {
  @@ -539,13 +613,15 @@
        * Read a line from the specified input stream, and strip off the
        * trailing carriage return and newline (if any).  Return the remaining
        * characters that were read as a String.
  +     *
  +     * @param input The input stream connected to our socket
        *
  -     * @returns The lline that was read, or <code>null</code> if end-of-file
  +     * @returns The line that was read, or <code>null</code> if end-of-file
        *  was encountered
        *
        * @exception IOException if an input/output error occurs
        */
  -    private String read() throws IOException {
  +    private String read(InputStream input) throws IOException {
   
   	StringBuffer sb = new StringBuffer();
   	while (true) {
  @@ -563,6 +639,8 @@
   	    }
   	    sb.append((char) ch);
   	}
  +	if (debug >= 2)
  +	    log("  Read: " + sb.toString());
   	return (sb.toString());
   
       }
  @@ -577,21 +655,16 @@
        */
       public void run() {
   
  +        // Process requests until we receive a shutdown signal
   	while (!stopped) {
   
   	    // Wait for the next socket to be assigned
  -	    synchronized (this) {
  -		try {
  -		    wait();
  -		} catch (InterruptedException e) {
  -		    ;
  -		}
  -	    }
  +	    Socket socket = await();
   	    if (socket == null)
   		continue;
   
   	    // Process the request from this socket
  -	    process();
  +	    process(socket);
   
   	    // Finish up this request
   	    request.recycle();
  @@ -600,6 +673,7 @@
   
   	}
   
  +	// Tell threadStop() we have shut ourselves down successfully
   	synchronized (threadSync) {
   	    threadSync.notifyAll();
   	}
  @@ -612,16 +686,15 @@
        */
       private void threadStart() {
   
  -	if (threadName == null)
  -	    threadName = "HttpProcessor[" + connector.getPort() +
  -		"][" + id + "]";
  +	log(sm.getString("httpProcessor.starting"));
   
  -	log("Starting");
  -
   	thread = new Thread(this, threadName);
   	thread.setDaemon(true);
   	thread.start();
   
  +	if (debug >= 1)
  +	    log(" Background thread has been started");
  +
       }
   
   
  @@ -630,10 +703,10 @@
        */
       private void threadStop() {
   
  -	log("Stopping");
  +	log(sm.getString("httpProcessor.stopping"));
   
   	stopped = true;
  -	process(null);
  +        assign(null);
   	synchronized (threadSync) {
   	    try {
   		threadSync.wait(5000);
  @@ -682,7 +755,7 @@
   
   	if (started)
   	    throw new LifecycleException
  -		(sm.getString("httpProcessor.start"));
  +		(sm.getString("httpProcessor.alreadyStarted"));
   	lifecycle.fireLifecycleEvent(START_EVENT, null);
   	started = true;
   
  @@ -700,7 +773,7 @@
   
   	if (!started)
   	    throw new LifecycleException
  -		(sm.getString("httpProcessor.stop"));
  +		(sm.getString("httpProcessor.notStarted"));
   	lifecycle.fireLifecycleEvent(STOP_EVENT, null);
   	started = false;
   
  
  
  
  1.2       +4 -5      jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpRequestImpl.java
  
  Index: HttpRequestImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpRequestImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HttpRequestImpl.java	2000/04/21 19:50:36	1.1
  +++ HttpRequestImpl.java	2000/05/03 02:12:44	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpRequestImpl.java,v 1.1 2000/04/21 19:50:36 craigmcc Exp $
  - * $Revision: 1.1 $
  - * $Date: 2000/04/21 19:50:36 $
  + * $Header: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpRequestImpl.java,v 1.2 2000/05/03 02:12:44 craigmcc Exp $
  + * $Revision: 1.2 $
  + * $Date: 2000/05/03 02:12:44 $
    *
    * ====================================================================
    *
  @@ -73,7 +73,7 @@
    * Implementation of <b>HttpRequest</b> specific to the HTTP connector.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.1 $ $Date: 2000/04/21 19:50:36 $
  + * @version $Revision: 1.2 $ $Date: 2000/05/03 02:12:44 $
    */
   
   final class HttpRequestImpl
  @@ -146,7 +146,6 @@
   
   	super.recycle();
   	inet = null;
  -	((HttpConnector) connector).recycle(this);
   
       }
   
  
  
  
  1.2       +3 -4      jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpResponseImpl.java
  
  Index: HttpResponseImpl.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpResponseImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HttpResponseImpl.java	2000/04/21 19:50:36	1.1
  +++ HttpResponseImpl.java	2000/05/03 02:12:44	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpResponseImpl.java,v 1.1 2000/04/21 19:50:36 craigmcc Exp $
  - * $Revision: 1.1 $
  - * $Date: 2000/04/21 19:50:36 $
  + * $Header: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/HttpResponseImpl.java,v 1.2 2000/05/03 02:12:44 craigmcc Exp $
  + * $Revision: 1.2 $
  + * $Date: 2000/05/03 02:12:44 $
    *
    * ====================================================================
    *
  @@ -72,7 +72,7 @@
    * Implementation of <b>HttpResponse</b> specific to the HTTP connector.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.1 $ $Date: 2000/04/21 19:50:36 $
  + * @version $Revision: 1.2 $ $Date: 2000/05/03 02:12:44 $
    */
   
   final class HttpResponseImpl
  @@ -114,7 +114,6 @@
       public void recycle() {
   
   	super.recycle();
  -	((HttpConnector) connector).recycle(this);
   
       }
   
  
  
  
  1.4       +10 -3     jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/LocalStrings.properties
  
  Index: LocalStrings.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/proposals/catalina/src/share/org/apache/tomcat/connector/test/LocalStrings.properties,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- LocalStrings.properties	2000/05/01 23:13:42	1.3
  +++ LocalStrings.properties	2000/05/03 02:12:44	1.4
  @@ -1,7 +1,13 @@
   httpConnector.alreadyStarted=HTTP connector has already been started
  -httpConnector.anAddress=Opening server socket on IP address {0}
  -httpConnector.noAddress=No host address matching {0}, opening on all addresses
  +httpConnector.allAddresses=Opening server socket on all host IP addresses
  +httpConnector.anAddress=Opening server socket on host IP address {0}
  +httpConnector.noAddress=No host IP address matching {0}, opening on all addresses
  +httpConnector.noProcessor=No processor available, rejecting this connection
   httpConnector.notStarted=HTTP connector has not yet been started
  +httpConnector.starting=Starting background thread
  +httpConnector.stopping=Stopping background thread
  +httpProcessor.alreadyStarted=HTTP processor has already been started
  +httpProcessor.notStarted=HTTP processor has not yet been started
   httpProcessor.parseHeaders.contentLength=Invalid 'Content-Length' header
   httpProcessor.parseHeaders.colon=Invalid HTTP header format
   httpProcessor.parseHeaders.portNumber=Invalid TCP/IP port number in 'Host' header
  @@ -9,4 +15,5 @@
   httpProcessor.parseRequest.read=Missing HTTP request line
   httpProcessor.parseRequest.uri=Missing HTTP request URI
   httpProcessor.start=HTTP processor has already been started
  -httpProcessor.stop=HTTP processor has already been stopped
  +httpProcessor.starting=Starting background thread
  +httpProcessor.stopping=Stopping background thread