You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2006/07/18 17:38:15 UTC

svn commit: r423119 - /tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java

Author: mturk
Date: Tue Jul 18 08:38:14 2006
New Revision: 423119

URL: http://svn.apache.org/viewvc?rev=423119&view=rev
Log:
Add svn:eol-style:native.
We'll probably need to do that for the entire repository.

Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java   (contents, props changed)

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java?rev=423119&r1=423118&r2=423119&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java Tue Jul 18 08:38:14 2006
@@ -1,1264 +1,1264 @@
-/*
- * Copyright 1999,2004-2005 The Apache Software Foundation.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package org.apache.catalina.connector;
-
-import java.lang.reflect.Method;
-import java.net.URLEncoder;
-import java.util.HashMap;
-
-import javax.management.MBeanRegistration;
-import javax.management.MBeanServer;
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-
-import org.apache.catalina.Container;
-import org.apache.catalina.Lifecycle;
-import org.apache.catalina.LifecycleException;
-import org.apache.catalina.LifecycleListener;
-import org.apache.catalina.Service;
-import org.apache.catalina.core.StandardEngine;
-import org.apache.catalina.util.LifecycleSupport;
-import org.apache.catalina.util.StringManager;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.coyote.Adapter;
-import org.apache.coyote.ProtocolHandler;
-import org.apache.tomcat.util.IntrospectionUtils;
-import org.apache.tomcat.util.http.mapper.Mapper;
-import org.apache.tomcat.util.modeler.Registry;
-
-
-/**
- * Implementation of a Coyote connector for Tomcat 5.x.
- *
- * @author Craig R. McClanahan
- * @author Remy Maucherat
- * @version $Revision: 349505 $ $Date: 2005-11-28 22:14:21 +0100 (lun., 28 nov. 2005) $
- */
-
-
-public class Connector
-    implements Lifecycle, MBeanRegistration
-{
-    private static Log log = LogFactory.getLog(Connector.class);
-
-
-    // ------------------------------------------------------------ Constructor
-
-
-    public Connector()
-        throws Exception {
-        this(null);
-    }
-    
-    public Connector(String protocol) 
-        throws Exception {
-        setProtocol(protocol);
-        // Instantiate protocol handler
-        try {
-            Class clazz = Class.forName(protocolHandlerClassName);
-            this.protocolHandler = (ProtocolHandler) clazz.newInstance();
-        } catch (Exception e) {
-            log.error
-                (sm.getString
-                 ("coyoteConnector.protocolHandlerInstantiationFailed", e));
-        }
-    }
-    
-    
-    // ----------------------------------------------------- Instance Variables
-
-
-    /**
-     * The <code>Service</code> we are associated with (if any).
-     */
-    protected Service service = null;
-
-
-    /**
-     * Do we allow TRACE ?
-     */
-    protected boolean allowTrace = false;
-
-
-    /**
-     * The Container used for processing requests received by this Connector.
-     */
-    protected Container container = null;
-
-
-    /**
-     * Use "/" as path for session cookies ?
-     */
-    protected boolean emptySessionPath = false;
-
-
-    /**
-     * The "enable DNS lookups" flag for this Connector.
-     */
-    protected boolean enableLookups = false;
-
-
-    /*
-     * Is generation of X-Powered-By response header enabled/disabled?
-     */
-    protected boolean xpoweredBy = false;
-
-
-    /**
-     * Descriptive information about this Connector implementation.
-     */
-    protected static final String info =
-        "org.apache.catalina.connector.Connector/2.1";
-
-
-    /**
-     * The lifecycle event support for this component.
-     */
-    protected LifecycleSupport lifecycle = new LifecycleSupport(this);
-
-
-    /**
-     * The port number on which we listen for requests.
-     */
-    protected int port = 0;
-
-
-    /**
-     * The server name to which we should pretend requests to this Connector
-     * were directed.  This is useful when operating Tomcat behind a proxy
-     * server, so that redirects get constructed accurately.  If not specified,
-     * the server name included in the <code>Host</code> header is used.
-     */
-    protected String proxyName = null;
-
-
-    /**
-     * The server port to which we should pretent requests to this Connector
-     * were directed.  This is useful when operating Tomcat behind a proxy
-     * server, so that redirects get constructed accurately.  If not specified,
-     * the port number specified by the <code>port</code> property is used.
-     */
-    protected int proxyPort = 0;
-
-
-    /**
-     * The redirect port for non-SSL to SSL redirects.
-     */
-    protected int redirectPort = 443;
-
-
-    /**
-     * The request scheme that will be set on all requests received
-     * through this connector.
-     */
-    protected String scheme = "http";
-
-
-    /**
-     * The secure connection flag that will be set on all requests received
-     * through this connector.
-     */
-    protected boolean secure = false;
-
-
-    /**
-     * The string manager for this package.
-     */
-    protected StringManager sm =
-        StringManager.getManager(Constants.Package);
-
-
-    /**
-     * Maximum size of a POST which will be automatically parsed by the 
-     * container. 2MB by default.
-     */
-    protected int maxPostSize = 2 * 1024 * 1024;
-
-
-    /**
-     * Maximum size of a POST which will be saved by the container
-     * during authentication. 4kB by default
-     */
-    protected int maxSavePostSize = 4 * 1024;
-
-
-    /**
-     * Has this component been initialized yet?
-     */
-    protected boolean initialized = false;
-
-
-    /**
-     * Has this component been started yet?
-     */
-    protected boolean started = false;
-
-
-    /**
-     * The shutdown signal to our background thread
-     */
-    protected boolean stopped = false;
-
-    /**
-     * Flag to use IP-based virtual hosting.
-     */
-    protected boolean useIPVHosts = false;
-
-    /**
-     * The background thread.
-     */
-    protected Thread thread = null;
-
-
-    /**
-     * Coyote Protocol handler class name.
-     * Defaults to the Coyote HTTP/1.1 protocolHandler.
-     */
-    protected String protocolHandlerClassName =
-        "org.apache.coyote.http11.Http11Protocol";
-
-
-    /**
-     * Coyote protocol handler.
-     */
-    protected ProtocolHandler protocolHandler = null;
-
-
-    /**
-     * Coyote adapter.
-     */
-    protected Adapter adapter = null;
-
-
-     /**
-      * Mapper.
-      */
-     protected Mapper mapper = new Mapper();
-
-
-     /**
-      * Mapper listener.
-      */
-     protected MapperListener mapperListener = new MapperListener(mapper);
-
-
-     /**
-      * URI encoding.
-      */
-     protected String URIEncoding = null;
-
-
-     /**
-      * URI encoding as body.
-      */
-     protected boolean useBodyEncodingForURI = false;
-
-
-     protected static HashMap replacements = new HashMap();
-     static {
-         replacements.put("acceptCount", "backlog");
-         replacements.put("connectionLinger", "soLinger");
-         replacements.put("connectionTimeout", "soTimeout");
-         replacements.put("connectionUploadTimeout", "timeout");
-         replacements.put("clientAuth", "clientauth");
-         replacements.put("keystoreFile", "keystore");
-         replacements.put("randomFile", "randomfile");
-         replacements.put("rootFile", "rootfile");
-         replacements.put("keystorePass", "keypass");
-         replacements.put("keystoreType", "keytype");
-         replacements.put("sslProtocol", "protocol");
-         replacements.put("sslProtocols", "protocols");
-     }
-     
-     
-    // ------------------------------------------------------------- Properties
-
-
-    /**
-     * Return a configured property.
-     */
-    public Object getProperty(String name) {
-        String repl = name;
-        if (replacements.get(name) != null) {
-            repl = (String) replacements.get(name);
-        }
-        return IntrospectionUtils.getProperty(protocolHandler, repl);
-    }
-
-    
-    /**
-     * Set a configured property.
-     */
-    public void setProperty(String name, String value) {
-        String repl = name;
-        if (replacements.get(name) != null) {
-            repl = (String) replacements.get(name);
-        }
-        IntrospectionUtils.setProperty(protocolHandler, repl, value);
-    }
-
-    
-    /**
-     * Return a configured property.
-     */
-    public Object getAttribute(String name) {
-        return getProperty(name);
-    }
-
-    
-    /**
-     * Set a configured property.
-     */
-    public void setAttribute(String name, Object value) {
-        setProperty(name, String.valueOf(value));
-    }
-
-    
-    /** 
-     * remove a configured property.
-     */
-    public void removeProperty(String name) {
-        // FIXME !
-        //protocolHandler.removeAttribute(name);
-    }
-
-    
-    /**
-     * Return the <code>Service</code> with which we are associated (if any).
-     */
-    public Service getService() {
-
-        return (this.service);
-
-    }
-
-
-    /**
-     * Set the <code>Service</code> with which we are associated (if any).
-     *
-     * @param service The service that owns this Engine
-     */
-    public void setService(Service service) {
-
-        this.service = service;
-        // FIXME: setProperty("service", service);
-
-    }
-
-
-    /**
-     * True if the TRACE method is allowed.  Default value is "false".
-     */
-    public boolean getAllowTrace() {
-
-        return (this.allowTrace);
-
-    }
-
-
-    /**
-     * Set the allowTrace flag, to disable or enable the TRACE HTTP method.
-     *
-     * @param allowTrace The new allowTrace flag
-     */
-    public void setAllowTrace(boolean allowTrace) {
-
-        this.allowTrace = allowTrace;
-        setProperty("allowTrace", String.valueOf(allowTrace));
-
-    }
-
-    /**
-     * Is this connector available for processing requests?
-     */
-    public boolean isAvailable() {
-
-        return (started);
-
-    }
-
-
-    /**
-     * Return the input buffer size for this Connector.
-     * 
-     * @deprecated
-     */
-    public int getBufferSize() {
-        return 2048;
-    }
-
-    /**
-     * Set the input buffer size for this Connector.
-     *
-     * @param bufferSize The new input buffer size.
-     * @deprecated
-     */
-    public void setBufferSize(int bufferSize) {
-    }
-
-    
-    /**
-     * Return the Container used for processing requests received by this
-     * Connector.
-     */
-    public Container getContainer() {
-        if( container==null ) {
-            // Lazy - maybe it was added later
-            findContainer();     
-        }
-        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 "empty session path" flag.
-     */
-    public boolean getEmptySessionPath() {
-
-        return (this.emptySessionPath);
-
-    }
-
-
-    /**
-     * Set the "empty session path" flag.
-     *
-     * @param emptySessionPath The new "empty session path" flag value
-     */
-    public void setEmptySessionPath(boolean emptySessionPath) {
-
-        this.emptySessionPath = emptySessionPath;
-        setProperty("emptySessionPath", String.valueOf(emptySessionPath));
-
-    }
-
-
-    /**
-     * Return the "enable DNS lookups" flag.
-     */
-    public boolean getEnableLookups() {
-
-        return (this.enableLookups);
-
-    }
-
-
-    /**
-     * Set the "enable DNS lookups" flag.
-     *
-     * @param enableLookups The new "enable DNS lookups" flag value
-     */
-    public void setEnableLookups(boolean enableLookups) {
-
-        this.enableLookups = enableLookups;
-        setProperty("enableLookups", String.valueOf(enableLookups));
-
-    }
-
-
-    /**
-     * Return descriptive information about this Connector implementation.
-     */
-    public String getInfo() {
-
-        return (info);
-
-    }
-
-
-     /**
-      * Return the mapper.
-      */
-     public Mapper getMapper() {
-
-         return (mapper);
-
-     }
-
-
-    /**
-     * Return the maximum size of a POST which will be automatically
-     * parsed by the container.
-     */
-    public int getMaxPostSize() {
-
-        return (maxPostSize);
-
-    }
-
-
-    /**
-     * Set the maximum size of a POST which will be automatically
-     * parsed by the container.
-     *
-     * @param maxPostSize The new maximum size in bytes of a POST which will 
-     * be automatically parsed by the container
-     */
-    public void setMaxPostSize(int maxPostSize) {
-
-        this.maxPostSize = maxPostSize;
-    }
-
-
-    /**
-     * Return the maximum size of a POST which will be saved by the container
-     * during authentication.
-     */
-    public int getMaxSavePostSize() {
-
-        return (maxSavePostSize);
-
-    }
-
-
-    /**
-     * Set the maximum size of a POST which will be saved by the container
-     * during authentication.
-     *
-     * @param maxSavePostSize The new maximum size in bytes of a POST which will
-     * be saved by the container during authentication.
-     */
-    public void setMaxSavePostSize(int maxSavePostSize) {
-
-        this.maxSavePostSize = maxSavePostSize;
-        setProperty("maxSavePostSize", String.valueOf(maxSavePostSize));
-    }
-
-
-    /**
-     * Return the port number on which we listen for requests.
-     */
-    public int getPort() {
-
-        return (this.port);
-
-    }
-
-
-    /**
-     * Set the port number on which we listen for requests.
-     *
-     * @param port The new port number
-     */
-    public void setPort(int port) {
-
-        this.port = port;
-        setProperty("port", String.valueOf(port));
-
-    }
-
-
-    /**
-     * Return the Coyote protocol handler in use.
-     */
-    public String getProtocol() {
-
-        if ("org.apache.coyote.http11.Http11Protocol".equals
-            (getProtocolHandlerClassName())
-            || "org.apache.coyote.http11.Http11AprProtocol".equals
-            (getProtocolHandlerClassName())) {
-            return "HTTP/1.1";
-        } else if ("org.apache.jk.server.JkCoyoteHandler".equals
-                   (getProtocolHandlerClassName())
-                   || "org.apache.coyote.ajp.AjpAprProtocol".equals
-                   (getProtocolHandlerClassName())) {
-            return "AJP/1.3";
-        }
-        return getProtocolHandlerClassName();
-
-    }
-
-
-    /**
-     * Set the Coyote protocol which will be used by the connector.
-     *
-     * @param protocol The Coyote protocol name
-     */
-    public void setProtocol(String protocol) {
-
-        // Test APR support
-        boolean apr = false;
-        try {
-            String methodName = "initialize";
-            Class paramTypes[] = new Class[1];
-            paramTypes[0] = String.class;
-            Object paramValues[] = new Object[1];
-            paramValues[0] = null;
-            Method method = Class.forName("org.apache.tomcat.jni.Library")
-                .getMethod(methodName, paramTypes);
-            method.invoke(null, paramValues);
-            apr = true;
-        } catch (Throwable t) {
-            // Ignore
-        }
-
-        if (apr) {
-            if ("HTTP/1.1".equals(protocol)) {
-                setProtocolHandlerClassName
-                    ("org.apache.coyote.http11.Http11AprProtocol");
-            } else if ("AJP/1.3".equals(protocol)) {
-                setProtocolHandlerClassName
-                    ("org.apache.coyote.ajp.AjpAprProtocol");
-            } else if (protocol != null) {
-                setProtocolHandlerClassName(protocol);
-            } else {
-                setProtocolHandlerClassName
-                    ("org.apache.coyote.http11.Http11AprProtocol");
-            }
-        } else {
-            if ("HTTP/1.1".equals(protocol)) {
-                setProtocolHandlerClassName
-                    ("org.apache.coyote.http11.Http11Protocol");
-            } else if ("AJP/1.3".equals(protocol)) {
-                setProtocolHandlerClassName
-                    ("org.apache.jk.server.JkCoyoteHandler");
-            } else if (protocol != null) {
-                setProtocolHandlerClassName(protocol);
-            }
-        }
-
-    }
-
-
-    /**
-     * Return the class name of the Coyote protocol handler in use.
-     */
-    public String getProtocolHandlerClassName() {
-
-        return (this.protocolHandlerClassName);
-
-    }
-
-
-    /**
-     * Set the class name of the Coyote protocol handler which will be used
-     * by the connector.
-     *
-     * @param protocolHandlerClassName The new class name
-     */
-    public void setProtocolHandlerClassName(String protocolHandlerClassName) {
-
-        this.protocolHandlerClassName = protocolHandlerClassName;
-
-    }
-
-
-    /**
-     * Return the protocol handler associated with the connector.
-     */
-    public ProtocolHandler getProtocolHandler() {
-
-        return (this.protocolHandler);
-
-    }
-
-
-    /**
-     * Return the proxy server name for this Connector.
-     */
-    public String getProxyName() {
-
-        return (this.proxyName);
-
-    }
-
-
-    /**
-     * Set the proxy server name for this Connector.
-     *
-     * @param proxyName The new proxy server name
-     */
-    public void setProxyName(String proxyName) {
-
-        if(proxyName != null && proxyName.length() > 0) {
-            this.proxyName = proxyName;
-            setProperty("proxyName", proxyName);
-        } else {
-            this.proxyName = null;
-            removeProperty("proxyName");
-        }
-
-    }
-
-
-    /**
-     * Return the proxy server port for this Connector.
-     */
-    public int getProxyPort() {
-
-        return (this.proxyPort);
-
-    }
-
-
-    /**
-     * Set the proxy server port for this Connector.
-     *
-     * @param proxyPort The new proxy server port
-     */
-    public void setProxyPort(int proxyPort) {
-
-        this.proxyPort = proxyPort;
-        setProperty("proxyPort", String.valueOf(proxyPort));
-
-    }
-
-
-    /**
-     * Return the port number to which a request should be redirected if
-     * it comes in on a non-SSL port and is subject to a security constraint
-     * with a transport guarantee that requires SSL.
-     */
-    public int getRedirectPort() {
-
-        return (this.redirectPort);
-
-    }
-
-
-    /**
-     * Set the redirect port number.
-     *
-     * @param redirectPort The redirect port number (non-SSL to SSL)
-     */
-    public void setRedirectPort(int redirectPort) {
-
-        this.redirectPort = redirectPort;
-        setProperty("redirectPort", String.valueOf(redirectPort));
-
-    }
-
-    
-    /**
-     * Return the scheme that will be assigned to requests received
-     * through this connector.  Default value is "http".
-     */
-    public String getScheme() {
-
-        return (this.scheme);
-
-    }
-
-
-    /**
-     * Set the scheme that will be assigned to requests received through
-     * this connector.
-     *
-     * @param scheme The new scheme
-     */
-    public void setScheme(String scheme) {
-
-        this.scheme = scheme;
-
-    }
-
-
-    /**
-     * Return the secure connection flag that will be assigned to requests
-     * received through this connector.  Default value is "false".
-     */
-    public boolean getSecure() {
-
-        return (this.secure);
-
-    }
-
-
-    /**
-     * Set the secure connection flag that will be assigned to requests
-     * received through this connector.
-     *
-     * @param secure The new secure connection flag
-     */
-    public void setSecure(boolean secure) {
-
-        this.secure = secure;
-        setProperty("secure", Boolean.toString(secure));
-    }
-
-     /**
-      * Return the character encoding to be used for the URI.
-      */
-     public String getURIEncoding() {
-
-         return (this.URIEncoding);
-
-     }
-
-
-     /**
-      * Set the URI encoding to be used for the URI.
-      *
-      * @param URIEncoding The new URI character encoding.
-      */
-     public void setURIEncoding(String URIEncoding) {
-
-         this.URIEncoding = URIEncoding;
-         setProperty("uRIEncoding", URIEncoding);
-
-     }
-
-
-     /**
-      * Return the true if the entity body encoding should be used for the URI.
-      */
-     public boolean getUseBodyEncodingForURI() {
-
-         return (this.useBodyEncodingForURI);
-
-     }
-
-
-     /**
-      * Set if the entity body encoding should be used for the URI.
-      *
-      * @param useBodyEncodingForURI The new value for the flag.
-      */
-     public void setUseBodyEncodingForURI(boolean useBodyEncodingForURI) {
-
-         this.useBodyEncodingForURI = useBodyEncodingForURI;
-         setProperty
-             ("useBodyEncodingForURI", String.valueOf(useBodyEncodingForURI));
-
-     }
-
-
-    /**
-     * Indicates whether the generation of an X-Powered-By response header for
-     * servlet-generated responses is enabled or disabled for this Connector.
-     *
-     * @return true if generation of X-Powered-By response header is enabled,
-     * false otherwise
-     */
-    public boolean getXpoweredBy() {
-        return xpoweredBy;
-    }
-
-
-    /**
-     * Enables or disables the generation of an X-Powered-By header (with value
-     * Servlet/2.4) for all servlet-generated responses returned by this
-     * Connector.
-     *
-     * @param xpoweredBy true if generation of X-Powered-By response header is
-     * to be enabled, false otherwise
-     */
-    public void setXpoweredBy(boolean xpoweredBy) {
-        this.xpoweredBy = xpoweredBy;
-        setProperty("xpoweredBy", String.valueOf(xpoweredBy));
-    }
-
-    /**
-     * Enable the use of IP-based virtual hosting.
-     *
-     * @param useIPVHosts <code>true</code> if Hosts are identified by IP,
-     *                    <code>false/code> if Hosts are identified by name.
-     */
-    public void setUseIPVHosts(boolean useIPVHosts) {
-        this.useIPVHosts = useIPVHosts;
-        setProperty("useIPVHosts", String.valueOf(useIPVHosts));
-    }
-
-    /**
-     * Test if IP-based virtual hosting is enabled.
-     */
-    public boolean getUseIPVHosts() {
-        return useIPVHosts;
-    }
-
-    // --------------------------------------------------------- Public Methods
-
-
-    /**
-     * Create (or allocate) and return a Request object suitable for
-     * specifying the contents of a Request to the responsible Container.
-     */
-    public Request createRequest() {
-
-        Request request = new Request();
-        request.setConnector(this);
-        return (request);
-
-    }
-
-
-    /**
-     * Create (or allocate) and return a Response object suitable for
-     * receiving the contents of a Response from the responsible Container.
-     */
-    public Response createResponse() {
-
-        Response response = new Response();
-        response.setConnector(this);
-        return (response);
-
-    }
-
-
-    // ------------------------------------------------------ Lifecycle Methods
-
-
-    /**
-     * Add a lifecycle event listener to this component.
-     *
-     * @param listener The listener to add
-     */
-    public void addLifecycleListener(LifecycleListener listener) {
-
-        lifecycle.addLifecycleListener(listener);
-
-    }
-
-
-    /**
-     * Get the lifecycle listeners associated with this lifecycle. If this
-     * Lifecycle has no listeners registered, a zero-length array is returned.
-     */
-    public LifecycleListener[] findLifecycleListeners() {
-
-        return lifecycle.findLifecycleListeners();
-
-    }
-
-
-    /**
-     * Remove a lifecycle event listener from this component.
-     *
-     * @param listener The listener to add
-     */
-    public void removeLifecycleListener(LifecycleListener listener) {
-
-        lifecycle.removeLifecycleListener(listener);
-
-    }
-
-    
-    protected ObjectName createObjectName(String domain, String type)
-            throws MalformedObjectNameException {
-        String encodedAddr = null;
-        if (getProperty("address") != null) {
-            encodedAddr = URLEncoder.encode(getProperty("address").toString());
-        }
-        String addSuffix = (getProperty("address") == null) ? "" : ",address="
-                + encodedAddr;
-        ObjectName _oname = new ObjectName(domain + ":type=" + type + ",port="
-                + getPort() + addSuffix);
-        return _oname;
-    }
-    
-    /**
-     * Initialize this connector (create ServerSocket here!)
-     */
-    public void initialize()
-        throws LifecycleException
-    {
-        if (initialized) {
-            if(log.isInfoEnabled())
-                log.info(sm.getString("coyoteConnector.alreadyInitialized"));
-           return;
-        }
-
-        this.initialized = true;
-
-        if( oname == null && (container instanceof StandardEngine)) {
-            try {
-                // we are loaded directly, via API - and no name was given to us
-                StandardEngine cb=(StandardEngine)container;
-                oname = createObjectName(cb.getName(), "Connector");
-                Registry.getRegistry(null, null)
-                    .registerComponent(this, oname, null);
-                controller=oname;
-            } catch (Exception e) {
-                log.error( "Error registering connector ", e);
-            }
-            if(log.isDebugEnabled())
-                log.debug("Creating name for connector " + oname);
-        }
-
-        // Initializa adapter
-        adapter = new CoyoteAdapter(this);
-        protocolHandler.setAdapter(adapter);
-
-        IntrospectionUtils.setProperty(protocolHandler, "jkHome",
-                                       System.getProperty("catalina.base"));
-
-        try {
-            protocolHandler.init();
-        } catch (Exception e) {
-            throw new LifecycleException
-                (sm.getString
-                 ("coyoteConnector.protocolHandlerInitializationFailed", e));
-        }
-    }
-
-
-    /**
-     * Pause the connector.
-     */
-    public void pause()
-        throws LifecycleException {
-        try {
-            protocolHandler.pause();
-        } catch (Exception e) {
-            log.error(sm.getString
-                      ("coyoteConnector.protocolHandlerPauseFailed"), e);
-        }
-    }
-
-
-    /**
-     * Pause the connector.
-     */
-    public void resume()
-        throws LifecycleException {
-        try {
-            protocolHandler.resume();
-        } catch (Exception e) {
-            log.error(sm.getString
-                      ("coyoteConnector.protocolHandlerResumeFailed"), e);
-        }
-    }
-
-
-    /**
-     * Begin processing requests via this Connector.
-     *
-     * @exception LifecycleException if a fatal startup error occurs
-     */
-    public void start() throws LifecycleException {
-        if( !initialized )
-            initialize();
-
-        // Validate and update our current state
-        if (started ) {
-            if(log.isInfoEnabled())
-                log.info(sm.getString("coyoteConnector.alreadyStarted"));
-            return;
-        }
-        lifecycle.fireLifecycleEvent(START_EVENT, null);
-        started = true;
-
-        // We can't register earlier - the JMX registration of this happens
-        // in Server.start callback
-        if ( this.oname != null ) {
-            // We are registred - register the adapter as well.
-            try {
-                Registry.getRegistry(null, null).registerComponent
-                    (protocolHandler, createObjectName(this.domain,"ProtocolHandler"), null);
-            } catch (Exception ex) {
-                log.error(sm.getString
-                          ("coyoteConnector.protocolRegistrationFailed"), ex);
-            }
-        } else {
-            if(log.isInfoEnabled())
-                log.info(sm.getString
-                     ("coyoteConnector.cannotRegisterProtocol"));
-        }
-
-        try {
-            protocolHandler.start();
-        } catch (Exception e) {
-            String errPrefix = "";
-            if(this.service != null) {
-                errPrefix += "service.getName(): \"" + this.service.getName() + "\"; ";
-            }
-
-            throw new LifecycleException
-                (errPrefix + " " + sm.getString
-                 ("coyoteConnector.protocolHandlerStartFailed", e));
-        }
-
-        if( this.domain != null ) {
-            mapperListener.setDomain( domain );
-            //mapperListener.setEngine( service.getContainer().getName() );
-            mapperListener.init();
-            try {
-                ObjectName mapperOname = createObjectName(this.domain,"Mapper");
-                if (log.isDebugEnabled())
-                    log.debug(sm.getString(
-                            "coyoteConnector.MapperRegistration", mapperOname));
-                Registry.getRegistry(null, null).registerComponent
-                    (mapper, mapperOname, "Mapper");
-            } catch (Exception ex) {
-                log.error(sm.getString
-                        ("coyoteConnector.protocolRegistrationFailed"), ex);
-            }
-        }
-    }
-
-
-    /**
-     * Terminate processing requests via this Connector.
-     *
-     * @exception LifecycleException if a fatal shutdown error occurs
-     */
-    public void stop() throws LifecycleException {
-
-        // Validate and update our current state
-        if (!started) {
-            log.error(sm.getString("coyoteConnector.notStarted"));
-            return;
-
-        }
-        lifecycle.fireLifecycleEvent(STOP_EVENT, null);
-        started = false;
-
-        try {
-            mapperListener.destroy();
-            Registry.getRegistry(null, null).unregisterComponent
-                (createObjectName(this.domain,"Mapper"));
-            Registry.getRegistry(null, null).unregisterComponent
-                (createObjectName(this.domain,"ProtocolHandler"));
-        } catch (MalformedObjectNameException e) {
-            log.error( sm.getString
-                    ("coyoteConnector.protocolUnregistrationFailed"), e);
-        }
-        try {
-            protocolHandler.destroy();
-        } catch (Exception e) {
-            throw new LifecycleException
-                (sm.getString
-                 ("coyoteConnector.protocolHandlerDestroyFailed", e));
-        }
-
-    }
-
-
-    // -------------------- JMX registration  --------------------
-    protected String domain;
-    protected ObjectName oname;
-    protected MBeanServer mserver;
-    ObjectName controller;
-
-    public ObjectName getController() {
-        return controller;
-    }
-
-    public void setController(ObjectName controller) {
-        this.controller = controller;
-    }
-
-    public ObjectName getObjectName() {
-        return oname;
-    }
-
-    public String getDomain() {
-        return domain;
-    }
-
-    public ObjectName preRegister(MBeanServer server,
-                                  ObjectName name) throws Exception {
-        oname=name;
-        mserver=server;
-        domain=name.getDomain();
-        return name;
-    }
-
-    public void postRegister(Boolean registrationDone) {
-    }
-
-    public void preDeregister() throws Exception {
-    }
-
-    public void postDeregister() {
-        try {
-            if( started ) {
-                stop();
-            }
-        } catch( Throwable t ) {
-            log.error( "Unregistering - can't stop", t);
-        }
-    }
-    
-    protected void findContainer() {
-        try {
-            // Register to the service
-            ObjectName parentName=new ObjectName( domain + ":" +
-                    "type=Service");
-            
-            if(log.isDebugEnabled())
-                log.debug("Adding to " + parentName );
-            if( mserver.isRegistered(parentName )) {
-                mserver.invoke(parentName, "addConnector", new Object[] { this },
-                        new String[] {"org.apache.catalina.connector.Connector"});
-                // As a side effect we'll get the container field set
-                // Also initialize will be called
-                //return;
-            }
-            // XXX Go directly to the Engine
-            // initialize(); - is called by addConnector
-            ObjectName engName=new ObjectName( domain + ":" + "type=Engine");
-            if( mserver.isRegistered(engName )) {
-                Object obj=mserver.getAttribute(engName, "managedResource");
-                if(log.isDebugEnabled())
-                      log.debug("Found engine " + obj + " " + obj.getClass());
-                container=(Container)obj;
-                
-                // Internal initialize - we now have the Engine
-                initialize();
-                
-                if(log.isDebugEnabled())
-                    log.debug("Initialized");
-                // As a side effect we'll get the container field set
-                // Also initialize will be called
-                return;
-            }
-        } catch( Exception ex ) {
-            log.error( "Error finding container " + ex);
-        }
-    }
-
-    public void init() throws Exception {
-
-        if( this.getService() != null ) {
-            if(log.isDebugEnabled())
-                 log.debug( "Already configured" );
-            return;
-        }
-        if( container==null ) {
-            findContainer();
-        }
-    }
-
-    public void destroy() throws Exception {
-        if( oname!=null && controller==oname ) {
-            if(log.isDebugEnabled())
-                 log.debug("Unregister itself " + oname );
-            Registry.getRegistry(null, null).unregisterComponent(oname);
-        }
-        if( getService() == null)
-            return;
-        getService().removeConnector(this);
-    }
-
-}
+/*
+ * Copyright 1999,2004-2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.catalina.connector;
+
+import java.lang.reflect.Method;
+import java.net.URLEncoder;
+import java.util.HashMap;
+
+import javax.management.MBeanRegistration;
+import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.apache.catalina.Container;
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.Service;
+import org.apache.catalina.core.StandardEngine;
+import org.apache.catalina.util.LifecycleSupport;
+import org.apache.catalina.util.StringManager;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.coyote.Adapter;
+import org.apache.coyote.ProtocolHandler;
+import org.apache.tomcat.util.IntrospectionUtils;
+import org.apache.tomcat.util.http.mapper.Mapper;
+import org.apache.tomcat.util.modeler.Registry;
+
+
+/**
+ * Implementation of a Coyote connector for Tomcat 5.x.
+ *
+ * @author Craig R. McClanahan
+ * @author Remy Maucherat
+ * @version $Revision: 349505 $ $Date: 2005-11-28 22:14:21 +0100 (lun., 28 nov. 2005) $
+ */
+
+
+public class Connector
+    implements Lifecycle, MBeanRegistration
+{
+    private static Log log = LogFactory.getLog(Connector.class);
+
+
+    // ------------------------------------------------------------ Constructor
+
+
+    public Connector()
+        throws Exception {
+        this(null);
+    }
+    
+    public Connector(String protocol) 
+        throws Exception {
+        setProtocol(protocol);
+        // Instantiate protocol handler
+        try {
+            Class clazz = Class.forName(protocolHandlerClassName);
+            this.protocolHandler = (ProtocolHandler) clazz.newInstance();
+        } catch (Exception e) {
+            log.error
+                (sm.getString
+                 ("coyoteConnector.protocolHandlerInstantiationFailed", e));
+        }
+    }
+    
+    
+    // ----------------------------------------------------- Instance Variables
+
+
+    /**
+     * The <code>Service</code> we are associated with (if any).
+     */
+    protected Service service = null;
+
+
+    /**
+     * Do we allow TRACE ?
+     */
+    protected boolean allowTrace = false;
+
+
+    /**
+     * The Container used for processing requests received by this Connector.
+     */
+    protected Container container = null;
+
+
+    /**
+     * Use "/" as path for session cookies ?
+     */
+    protected boolean emptySessionPath = false;
+
+
+    /**
+     * The "enable DNS lookups" flag for this Connector.
+     */
+    protected boolean enableLookups = false;
+
+
+    /*
+     * Is generation of X-Powered-By response header enabled/disabled?
+     */
+    protected boolean xpoweredBy = false;
+
+
+    /**
+     * Descriptive information about this Connector implementation.
+     */
+    protected static final String info =
+        "org.apache.catalina.connector.Connector/2.1";
+
+
+    /**
+     * The lifecycle event support for this component.
+     */
+    protected LifecycleSupport lifecycle = new LifecycleSupport(this);
+
+
+    /**
+     * The port number on which we listen for requests.
+     */
+    protected int port = 0;
+
+
+    /**
+     * The server name to which we should pretend requests to this Connector
+     * were directed.  This is useful when operating Tomcat behind a proxy
+     * server, so that redirects get constructed accurately.  If not specified,
+     * the server name included in the <code>Host</code> header is used.
+     */
+    protected String proxyName = null;
+
+
+    /**
+     * The server port to which we should pretent requests to this Connector
+     * were directed.  This is useful when operating Tomcat behind a proxy
+     * server, so that redirects get constructed accurately.  If not specified,
+     * the port number specified by the <code>port</code> property is used.
+     */
+    protected int proxyPort = 0;
+
+
+    /**
+     * The redirect port for non-SSL to SSL redirects.
+     */
+    protected int redirectPort = 443;
+
+
+    /**
+     * The request scheme that will be set on all requests received
+     * through this connector.
+     */
+    protected String scheme = "http";
+
+
+    /**
+     * The secure connection flag that will be set on all requests received
+     * through this connector.
+     */
+    protected boolean secure = false;
+
+
+    /**
+     * The string manager for this package.
+     */
+    protected StringManager sm =
+        StringManager.getManager(Constants.Package);
+
+
+    /**
+     * Maximum size of a POST which will be automatically parsed by the 
+     * container. 2MB by default.
+     */
+    protected int maxPostSize = 2 * 1024 * 1024;
+
+
+    /**
+     * Maximum size of a POST which will be saved by the container
+     * during authentication. 4kB by default
+     */
+    protected int maxSavePostSize = 4 * 1024;
+
+
+    /**
+     * Has this component been initialized yet?
+     */
+    protected boolean initialized = false;
+
+
+    /**
+     * Has this component been started yet?
+     */
+    protected boolean started = false;
+
+
+    /**
+     * The shutdown signal to our background thread
+     */
+    protected boolean stopped = false;
+
+    /**
+     * Flag to use IP-based virtual hosting.
+     */
+    protected boolean useIPVHosts = false;
+
+    /**
+     * The background thread.
+     */
+    protected Thread thread = null;
+
+
+    /**
+     * Coyote Protocol handler class name.
+     * Defaults to the Coyote HTTP/1.1 protocolHandler.
+     */
+    protected String protocolHandlerClassName =
+        "org.apache.coyote.http11.Http11Protocol";
+
+
+    /**
+     * Coyote protocol handler.
+     */
+    protected ProtocolHandler protocolHandler = null;
+
+
+    /**
+     * Coyote adapter.
+     */
+    protected Adapter adapter = null;
+
+
+     /**
+      * Mapper.
+      */
+     protected Mapper mapper = new Mapper();
+
+
+     /**
+      * Mapper listener.
+      */
+     protected MapperListener mapperListener = new MapperListener(mapper);
+
+
+     /**
+      * URI encoding.
+      */
+     protected String URIEncoding = null;
+
+
+     /**
+      * URI encoding as body.
+      */
+     protected boolean useBodyEncodingForURI = false;
+
+
+     protected static HashMap replacements = new HashMap();
+     static {
+         replacements.put("acceptCount", "backlog");
+         replacements.put("connectionLinger", "soLinger");
+         replacements.put("connectionTimeout", "soTimeout");
+         replacements.put("connectionUploadTimeout", "timeout");
+         replacements.put("clientAuth", "clientauth");
+         replacements.put("keystoreFile", "keystore");
+         replacements.put("randomFile", "randomfile");
+         replacements.put("rootFile", "rootfile");
+         replacements.put("keystorePass", "keypass");
+         replacements.put("keystoreType", "keytype");
+         replacements.put("sslProtocol", "protocol");
+         replacements.put("sslProtocols", "protocols");
+     }
+     
+     
+    // ------------------------------------------------------------- Properties
+
+
+    /**
+     * Return a configured property.
+     */
+    public Object getProperty(String name) {
+        String repl = name;
+        if (replacements.get(name) != null) {
+            repl = (String) replacements.get(name);
+        }
+        return IntrospectionUtils.getProperty(protocolHandler, repl);
+    }
+
+    
+    /**
+     * Set a configured property.
+     */
+    public void setProperty(String name, String value) {
+        String repl = name;
+        if (replacements.get(name) != null) {
+            repl = (String) replacements.get(name);
+        }
+        IntrospectionUtils.setProperty(protocolHandler, repl, value);
+    }
+
+    
+    /**
+     * Return a configured property.
+     */
+    public Object getAttribute(String name) {
+        return getProperty(name);
+    }
+
+    
+    /**
+     * Set a configured property.
+     */
+    public void setAttribute(String name, Object value) {
+        setProperty(name, String.valueOf(value));
+    }
+
+    
+    /** 
+     * remove a configured property.
+     */
+    public void removeProperty(String name) {
+        // FIXME !
+        //protocolHandler.removeAttribute(name);
+    }
+
+    
+    /**
+     * Return the <code>Service</code> with which we are associated (if any).
+     */
+    public Service getService() {
+
+        return (this.service);
+
+    }
+
+
+    /**
+     * Set the <code>Service</code> with which we are associated (if any).
+     *
+     * @param service The service that owns this Engine
+     */
+    public void setService(Service service) {
+
+        this.service = service;
+        // FIXME: setProperty("service", service);
+
+    }
+
+
+    /**
+     * True if the TRACE method is allowed.  Default value is "false".
+     */
+    public boolean getAllowTrace() {
+
+        return (this.allowTrace);
+
+    }
+
+
+    /**
+     * Set the allowTrace flag, to disable or enable the TRACE HTTP method.
+     *
+     * @param allowTrace The new allowTrace flag
+     */
+    public void setAllowTrace(boolean allowTrace) {
+
+        this.allowTrace = allowTrace;
+        setProperty("allowTrace", String.valueOf(allowTrace));
+
+    }
+
+    /**
+     * Is this connector available for processing requests?
+     */
+    public boolean isAvailable() {
+
+        return (started);
+
+    }
+
+
+    /**
+     * Return the input buffer size for this Connector.
+     * 
+     * @deprecated
+     */
+    public int getBufferSize() {
+        return 2048;
+    }
+
+    /**
+     * Set the input buffer size for this Connector.
+     *
+     * @param bufferSize The new input buffer size.
+     * @deprecated
+     */
+    public void setBufferSize(int bufferSize) {
+    }
+
+    
+    /**
+     * Return the Container used for processing requests received by this
+     * Connector.
+     */
+    public Container getContainer() {
+        if( container==null ) {
+            // Lazy - maybe it was added later
+            findContainer();     
+        }
+        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 "empty session path" flag.
+     */
+    public boolean getEmptySessionPath() {
+
+        return (this.emptySessionPath);
+
+    }
+
+
+    /**
+     * Set the "empty session path" flag.
+     *
+     * @param emptySessionPath The new "empty session path" flag value
+     */
+    public void setEmptySessionPath(boolean emptySessionPath) {
+
+        this.emptySessionPath = emptySessionPath;
+        setProperty("emptySessionPath", String.valueOf(emptySessionPath));
+
+    }
+
+
+    /**
+     * Return the "enable DNS lookups" flag.
+     */
+    public boolean getEnableLookups() {
+
+        return (this.enableLookups);
+
+    }
+
+
+    /**
+     * Set the "enable DNS lookups" flag.
+     *
+     * @param enableLookups The new "enable DNS lookups" flag value
+     */
+    public void setEnableLookups(boolean enableLookups) {
+
+        this.enableLookups = enableLookups;
+        setProperty("enableLookups", String.valueOf(enableLookups));
+
+    }
+
+
+    /**
+     * Return descriptive information about this Connector implementation.
+     */
+    public String getInfo() {
+
+        return (info);
+
+    }
+
+
+     /**
+      * Return the mapper.
+      */
+     public Mapper getMapper() {
+
+         return (mapper);
+
+     }
+
+
+    /**
+     * Return the maximum size of a POST which will be automatically
+     * parsed by the container.
+     */
+    public int getMaxPostSize() {
+
+        return (maxPostSize);
+
+    }
+
+
+    /**
+     * Set the maximum size of a POST which will be automatically
+     * parsed by the container.
+     *
+     * @param maxPostSize The new maximum size in bytes of a POST which will 
+     * be automatically parsed by the container
+     */
+    public void setMaxPostSize(int maxPostSize) {
+
+        this.maxPostSize = maxPostSize;
+    }
+
+
+    /**
+     * Return the maximum size of a POST which will be saved by the container
+     * during authentication.
+     */
+    public int getMaxSavePostSize() {
+
+        return (maxSavePostSize);
+
+    }
+
+
+    /**
+     * Set the maximum size of a POST which will be saved by the container
+     * during authentication.
+     *
+     * @param maxSavePostSize The new maximum size in bytes of a POST which will
+     * be saved by the container during authentication.
+     */
+    public void setMaxSavePostSize(int maxSavePostSize) {
+
+        this.maxSavePostSize = maxSavePostSize;
+        setProperty("maxSavePostSize", String.valueOf(maxSavePostSize));
+    }
+
+
+    /**
+     * Return the port number on which we listen for requests.
+     */
+    public int getPort() {
+
+        return (this.port);
+
+    }
+
+
+    /**
+     * Set the port number on which we listen for requests.
+     *
+     * @param port The new port number
+     */
+    public void setPort(int port) {
+
+        this.port = port;
+        setProperty("port", String.valueOf(port));
+
+    }
+
+
+    /**
+     * Return the Coyote protocol handler in use.
+     */
+    public String getProtocol() {
+
+        if ("org.apache.coyote.http11.Http11Protocol".equals
+            (getProtocolHandlerClassName())
+            || "org.apache.coyote.http11.Http11AprProtocol".equals
+            (getProtocolHandlerClassName())) {
+            return "HTTP/1.1";
+        } else if ("org.apache.jk.server.JkCoyoteHandler".equals
+                   (getProtocolHandlerClassName())
+                   || "org.apache.coyote.ajp.AjpAprProtocol".equals
+                   (getProtocolHandlerClassName())) {
+            return "AJP/1.3";
+        }
+        return getProtocolHandlerClassName();
+
+    }
+
+
+    /**
+     * Set the Coyote protocol which will be used by the connector.
+     *
+     * @param protocol The Coyote protocol name
+     */
+    public void setProtocol(String protocol) {
+
+        // Test APR support
+        boolean apr = false;
+        try {
+            String methodName = "initialize";
+            Class paramTypes[] = new Class[1];
+            paramTypes[0] = String.class;
+            Object paramValues[] = new Object[1];
+            paramValues[0] = null;
+            Method method = Class.forName("org.apache.tomcat.jni.Library")
+                .getMethod(methodName, paramTypes);
+            method.invoke(null, paramValues);
+            apr = true;
+        } catch (Throwable t) {
+            // Ignore
+        }
+
+        if (apr) {
+            if ("HTTP/1.1".equals(protocol)) {
+                setProtocolHandlerClassName
+                    ("org.apache.coyote.http11.Http11AprProtocol");
+            } else if ("AJP/1.3".equals(protocol)) {
+                setProtocolHandlerClassName
+                    ("org.apache.coyote.ajp.AjpAprProtocol");
+            } else if (protocol != null) {
+                setProtocolHandlerClassName(protocol);
+            } else {
+                setProtocolHandlerClassName
+                    ("org.apache.coyote.http11.Http11AprProtocol");
+            }
+        } else {
+            if ("HTTP/1.1".equals(protocol)) {
+                setProtocolHandlerClassName
+                    ("org.apache.coyote.http11.Http11Protocol");
+            } else if ("AJP/1.3".equals(protocol)) {
+                setProtocolHandlerClassName
+                    ("org.apache.jk.server.JkCoyoteHandler");
+            } else if (protocol != null) {
+                setProtocolHandlerClassName(protocol);
+            }
+        }
+
+    }
+
+
+    /**
+     * Return the class name of the Coyote protocol handler in use.
+     */
+    public String getProtocolHandlerClassName() {
+
+        return (this.protocolHandlerClassName);
+
+    }
+
+
+    /**
+     * Set the class name of the Coyote protocol handler which will be used
+     * by the connector.
+     *
+     * @param protocolHandlerClassName The new class name
+     */
+    public void setProtocolHandlerClassName(String protocolHandlerClassName) {
+
+        this.protocolHandlerClassName = protocolHandlerClassName;
+
+    }
+
+
+    /**
+     * Return the protocol handler associated with the connector.
+     */
+    public ProtocolHandler getProtocolHandler() {
+
+        return (this.protocolHandler);
+
+    }
+
+
+    /**
+     * Return the proxy server name for this Connector.
+     */
+    public String getProxyName() {
+
+        return (this.proxyName);
+
+    }
+
+
+    /**
+     * Set the proxy server name for this Connector.
+     *
+     * @param proxyName The new proxy server name
+     */
+    public void setProxyName(String proxyName) {
+
+        if(proxyName != null && proxyName.length() > 0) {
+            this.proxyName = proxyName;
+            setProperty("proxyName", proxyName);
+        } else {
+            this.proxyName = null;
+            removeProperty("proxyName");
+        }
+
+    }
+
+
+    /**
+     * Return the proxy server port for this Connector.
+     */
+    public int getProxyPort() {
+
+        return (this.proxyPort);
+
+    }
+
+
+    /**
+     * Set the proxy server port for this Connector.
+     *
+     * @param proxyPort The new proxy server port
+     */
+    public void setProxyPort(int proxyPort) {
+
+        this.proxyPort = proxyPort;
+        setProperty("proxyPort", String.valueOf(proxyPort));
+
+    }
+
+
+    /**
+     * Return the port number to which a request should be redirected if
+     * it comes in on a non-SSL port and is subject to a security constraint
+     * with a transport guarantee that requires SSL.
+     */
+    public int getRedirectPort() {
+
+        return (this.redirectPort);
+
+    }
+
+
+    /**
+     * Set the redirect port number.
+     *
+     * @param redirectPort The redirect port number (non-SSL to SSL)
+     */
+    public void setRedirectPort(int redirectPort) {
+
+        this.redirectPort = redirectPort;
+        setProperty("redirectPort", String.valueOf(redirectPort));
+
+    }
+
+    
+    /**
+     * Return the scheme that will be assigned to requests received
+     * through this connector.  Default value is "http".
+     */
+    public String getScheme() {
+
+        return (this.scheme);
+
+    }
+
+
+    /**
+     * Set the scheme that will be assigned to requests received through
+     * this connector.
+     *
+     * @param scheme The new scheme
+     */
+    public void setScheme(String scheme) {
+
+        this.scheme = scheme;
+
+    }
+
+
+    /**
+     * Return the secure connection flag that will be assigned to requests
+     * received through this connector.  Default value is "false".
+     */
+    public boolean getSecure() {
+
+        return (this.secure);
+
+    }
+
+
+    /**
+     * Set the secure connection flag that will be assigned to requests
+     * received through this connector.
+     *
+     * @param secure The new secure connection flag
+     */
+    public void setSecure(boolean secure) {
+
+        this.secure = secure;
+        setProperty("secure", Boolean.toString(secure));
+    }
+
+     /**
+      * Return the character encoding to be used for the URI.
+      */
+     public String getURIEncoding() {
+
+         return (this.URIEncoding);
+
+     }
+
+
+     /**
+      * Set the URI encoding to be used for the URI.
+      *
+      * @param URIEncoding The new URI character encoding.
+      */
+     public void setURIEncoding(String URIEncoding) {
+
+         this.URIEncoding = URIEncoding;
+         setProperty("uRIEncoding", URIEncoding);
+
+     }
+
+
+     /**
+      * Return the true if the entity body encoding should be used for the URI.
+      */
+     public boolean getUseBodyEncodingForURI() {
+
+         return (this.useBodyEncodingForURI);
+
+     }
+
+
+     /**
+      * Set if the entity body encoding should be used for the URI.
+      *
+      * @param useBodyEncodingForURI The new value for the flag.
+      */
+     public void setUseBodyEncodingForURI(boolean useBodyEncodingForURI) {
+
+         this.useBodyEncodingForURI = useBodyEncodingForURI;
+         setProperty
+             ("useBodyEncodingForURI", String.valueOf(useBodyEncodingForURI));
+
+     }
+
+
+    /**
+     * Indicates whether the generation of an X-Powered-By response header for
+     * servlet-generated responses is enabled or disabled for this Connector.
+     *
+     * @return true if generation of X-Powered-By response header is enabled,
+     * false otherwise
+     */
+    public boolean getXpoweredBy() {
+        return xpoweredBy;
+    }
+
+
+    /**
+     * Enables or disables the generation of an X-Powered-By header (with value
+     * Servlet/2.4) for all servlet-generated responses returned by this
+     * Connector.
+     *
+     * @param xpoweredBy true if generation of X-Powered-By response header is
+     * to be enabled, false otherwise
+     */
+    public void setXpoweredBy(boolean xpoweredBy) {
+        this.xpoweredBy = xpoweredBy;
+        setProperty("xpoweredBy", String.valueOf(xpoweredBy));
+    }
+
+    /**
+     * Enable the use of IP-based virtual hosting.
+     *
+     * @param useIPVHosts <code>true</code> if Hosts are identified by IP,
+     *                    <code>false/code> if Hosts are identified by name.
+     */
+    public void setUseIPVHosts(boolean useIPVHosts) {
+        this.useIPVHosts = useIPVHosts;
+        setProperty("useIPVHosts", String.valueOf(useIPVHosts));
+    }
+
+    /**
+     * Test if IP-based virtual hosting is enabled.
+     */
+    public boolean getUseIPVHosts() {
+        return useIPVHosts;
+    }
+
+    // --------------------------------------------------------- Public Methods
+
+
+    /**
+     * Create (or allocate) and return a Request object suitable for
+     * specifying the contents of a Request to the responsible Container.
+     */
+    public Request createRequest() {
+
+        Request request = new Request();
+        request.setConnector(this);
+        return (request);
+
+    }
+
+
+    /**
+     * Create (or allocate) and return a Response object suitable for
+     * receiving the contents of a Response from the responsible Container.
+     */
+    public Response createResponse() {
+
+        Response response = new Response();
+        response.setConnector(this);
+        return (response);
+
+    }
+
+
+    // ------------------------------------------------------ Lifecycle Methods
+
+
+    /**
+     * Add a lifecycle event listener to this component.
+     *
+     * @param listener The listener to add
+     */
+    public void addLifecycleListener(LifecycleListener listener) {
+
+        lifecycle.addLifecycleListener(listener);
+
+    }
+
+
+    /**
+     * Get the lifecycle listeners associated with this lifecycle. If this
+     * Lifecycle has no listeners registered, a zero-length array is returned.
+     */
+    public LifecycleListener[] findLifecycleListeners() {
+
+        return lifecycle.findLifecycleListeners();
+
+    }
+
+
+    /**
+     * Remove a lifecycle event listener from this component.
+     *
+     * @param listener The listener to add
+     */
+    public void removeLifecycleListener(LifecycleListener listener) {
+
+        lifecycle.removeLifecycleListener(listener);
+
+    }
+
+    
+    protected ObjectName createObjectName(String domain, String type)
+            throws MalformedObjectNameException {
+        String encodedAddr = null;
+        if (getProperty("address") != null) {
+            encodedAddr = URLEncoder.encode(getProperty("address").toString());
+        }
+        String addSuffix = (getProperty("address") == null) ? "" : ",address="
+                + encodedAddr;
+        ObjectName _oname = new ObjectName(domain + ":type=" + type + ",port="
+                + getPort() + addSuffix);
+        return _oname;
+    }
+    
+    /**
+     * Initialize this connector (create ServerSocket here!)
+     */
+    public void initialize()
+        throws LifecycleException
+    {
+        if (initialized) {
+            if(log.isInfoEnabled())
+                log.info(sm.getString("coyoteConnector.alreadyInitialized"));
+           return;
+        }
+
+        this.initialized = true;
+
+        if( oname == null && (container instanceof StandardEngine)) {
+            try {
+                // we are loaded directly, via API - and no name was given to us
+                StandardEngine cb=(StandardEngine)container;
+                oname = createObjectName(cb.getName(), "Connector");
+                Registry.getRegistry(null, null)
+                    .registerComponent(this, oname, null);
+                controller=oname;
+            } catch (Exception e) {
+                log.error( "Error registering connector ", e);
+            }
+            if(log.isDebugEnabled())
+                log.debug("Creating name for connector " + oname);
+        }
+
+        // Initializa adapter
+        adapter = new CoyoteAdapter(this);
+        protocolHandler.setAdapter(adapter);
+
+        IntrospectionUtils.setProperty(protocolHandler, "jkHome",
+                                       System.getProperty("catalina.base"));
+
+        try {
+            protocolHandler.init();
+        } catch (Exception e) {
+            throw new LifecycleException
+                (sm.getString
+                 ("coyoteConnector.protocolHandlerInitializationFailed", e));
+        }
+    }
+
+
+    /**
+     * Pause the connector.
+     */
+    public void pause()
+        throws LifecycleException {
+        try {
+            protocolHandler.pause();
+        } catch (Exception e) {
+            log.error(sm.getString
+                      ("coyoteConnector.protocolHandlerPauseFailed"), e);
+        }
+    }
+
+
+    /**
+     * Pause the connector.
+     */
+    public void resume()
+        throws LifecycleException {
+        try {
+            protocolHandler.resume();
+        } catch (Exception e) {
+            log.error(sm.getString
+                      ("coyoteConnector.protocolHandlerResumeFailed"), e);
+        }
+    }
+
+
+    /**
+     * Begin processing requests via this Connector.
+     *
+     * @exception LifecycleException if a fatal startup error occurs
+     */
+    public void start() throws LifecycleException {
+        if( !initialized )
+            initialize();
+
+        // Validate and update our current state
+        if (started ) {
+            if(log.isInfoEnabled())
+                log.info(sm.getString("coyoteConnector.alreadyStarted"));
+            return;
+        }
+        lifecycle.fireLifecycleEvent(START_EVENT, null);
+        started = true;
+
+        // We can't register earlier - the JMX registration of this happens
+        // in Server.start callback
+        if ( this.oname != null ) {
+            // We are registred - register the adapter as well.
+            try {
+                Registry.getRegistry(null, null).registerComponent
+                    (protocolHandler, createObjectName(this.domain,"ProtocolHandler"), null);
+            } catch (Exception ex) {
+                log.error(sm.getString
+                          ("coyoteConnector.protocolRegistrationFailed"), ex);
+            }
+        } else {
+            if(log.isInfoEnabled())
+                log.info(sm.getString
+                     ("coyoteConnector.cannotRegisterProtocol"));
+        }
+
+        try {
+            protocolHandler.start();
+        } catch (Exception e) {
+            String errPrefix = "";
+            if(this.service != null) {
+                errPrefix += "service.getName(): \"" + this.service.getName() + "\"; ";
+            }
+
+            throw new LifecycleException
+                (errPrefix + " " + sm.getString
+                 ("coyoteConnector.protocolHandlerStartFailed", e));
+        }
+
+        if( this.domain != null ) {
+            mapperListener.setDomain( domain );
+            //mapperListener.setEngine( service.getContainer().getName() );
+            mapperListener.init();
+            try {
+                ObjectName mapperOname = createObjectName(this.domain,"Mapper");
+                if (log.isDebugEnabled())
+                    log.debug(sm.getString(
+                            "coyoteConnector.MapperRegistration", mapperOname));
+                Registry.getRegistry(null, null).registerComponent
+                    (mapper, mapperOname, "Mapper");
+            } catch (Exception ex) {
+                log.error(sm.getString
+                        ("coyoteConnector.protocolRegistrationFailed"), ex);
+            }
+        }
+    }
+
+
+    /**
+     * Terminate processing requests via this Connector.
+     *
+     * @exception LifecycleException if a fatal shutdown error occurs
+     */
+    public void stop() throws LifecycleException {
+
+        // Validate and update our current state
+        if (!started) {
+            log.error(sm.getString("coyoteConnector.notStarted"));
+            return;
+
+        }
+        lifecycle.fireLifecycleEvent(STOP_EVENT, null);
+        started = false;
+
+        try {
+            mapperListener.destroy();
+            Registry.getRegistry(null, null).unregisterComponent
+                (createObjectName(this.domain,"Mapper"));
+            Registry.getRegistry(null, null).unregisterComponent
+                (createObjectName(this.domain,"ProtocolHandler"));
+        } catch (MalformedObjectNameException e) {
+            log.error( sm.getString
+                    ("coyoteConnector.protocolUnregistrationFailed"), e);
+        }
+        try {
+            protocolHandler.destroy();
+        } catch (Exception e) {
+            throw new LifecycleException
+                (sm.getString
+                 ("coyoteConnector.protocolHandlerDestroyFailed", e));
+        }
+
+    }
+
+
+    // -------------------- JMX registration  --------------------
+    protected String domain;
+    protected ObjectName oname;
+    protected MBeanServer mserver;
+    ObjectName controller;
+
+    public ObjectName getController() {
+        return controller;
+    }
+
+    public void setController(ObjectName controller) {
+        this.controller = controller;
+    }
+
+    public ObjectName getObjectName() {
+        return oname;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public ObjectName preRegister(MBeanServer server,
+                                  ObjectName name) throws Exception {
+        oname=name;
+        mserver=server;
+        domain=name.getDomain();
+        return name;
+    }
+
+    public void postRegister(Boolean registrationDone) {
+    }
+
+    public void preDeregister() throws Exception {
+    }
+
+    public void postDeregister() {
+        try {
+            if( started ) {
+                stop();
+            }
+        } catch( Throwable t ) {
+            log.error( "Unregistering - can't stop", t);
+        }
+    }
+    
+    protected void findContainer() {
+        try {
+            // Register to the service
+            ObjectName parentName=new ObjectName( domain + ":" +
+                    "type=Service");
+            
+            if(log.isDebugEnabled())
+                log.debug("Adding to " + parentName );
+            if( mserver.isRegistered(parentName )) {
+                mserver.invoke(parentName, "addConnector", new Object[] { this },
+                        new String[] {"org.apache.catalina.connector.Connector"});
+                // As a side effect we'll get the container field set
+                // Also initialize will be called
+                //return;
+            }
+            // XXX Go directly to the Engine
+            // initialize(); - is called by addConnector
+            ObjectName engName=new ObjectName( domain + ":" + "type=Engine");
+            if( mserver.isRegistered(engName )) {
+                Object obj=mserver.getAttribute(engName, "managedResource");
+                if(log.isDebugEnabled())
+                      log.debug("Found engine " + obj + " " + obj.getClass());
+                container=(Container)obj;
+                
+                // Internal initialize - we now have the Engine
+                initialize();
+                
+                if(log.isDebugEnabled())
+                    log.debug("Initialized");
+                // As a side effect we'll get the container field set
+                // Also initialize will be called
+                return;
+            }
+        } catch( Exception ex ) {
+            log.error( "Error finding container " + ex);
+        }
+    }
+
+    public void init() throws Exception {
+
+        if( this.getService() != null ) {
+            if(log.isDebugEnabled())
+                 log.debug( "Already configured" );
+            return;
+        }
+        if( container==null ) {
+            findContainer();
+        }
+    }
+
+    public void destroy() throws Exception {
+        if( oname!=null && controller==oname ) {
+            if(log.isDebugEnabled())
+                 log.debug("Unregister itself " + oname );
+            Registry.getRegistry(null, null).unregisterComponent(oname);
+        }
+        if( getService() == null)
+            return;
+        getService().removeConnector(this);
+    }
+
+}

Propchange: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java
------------------------------------------------------------------------------
    svn:eol-style = native



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r423119 - /tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java

Posted by Mladen Turk <mt...@apache.org>.
Rainer Jung wrote:
> 
> Maybe we need to set everything to native, checkout, convert those that 
> have the wrong endings and commit?
>

No need for co/commit.
svn propset will convert current line endings to the virtual
one I suppose, and then each client depending on the platform
will have correct EOL.

tc5.5.x branch has that resolved, and the svn:eol-style is
set correctly for all source/resource non-binary files.
Even all image types have svn:mime-type:application/octet-stream
although they should have svn:mime-type:image/gif, etc...

Regards,
Mladen.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r423119 - /tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java

Posted by Rainer Jung <ra...@kippdata.de>.
In

http://www.apache.org/dev/version-control.html

the ASF suggests:

Committers will need to properly configure their svn client. One 
particular issue is OS-specific line-endings for text files. When you 
add a new text file, especially when applying patches from Bugzilla, 
first ensure that the line-endings are appropriate for your system, then 
do ...

svn add test.txt
svn propset svn:eol-style native test.txt

Your svn client can be configured to do that automatically for some 
common file types. Add the list to your ~/.subversion/config file.

The last line links to:

http://www.apache.org/dev/svn-eol-style.txt

I used this and up to now had no problems with new files in connectors.

But: when I check out the TC6 files, I get a funny mix of line ending 
types. So I think at the moment htey are not very consistent in the 
repository. I remember Filip also having some trouble.

Maybe we need to set everything to native, checkout, convert those that 
have the wrong endings and commit?

Rainer

Mladen Turk wrote:
> Remy Maucherat wrote:
> 
>> mturk@apache.org wrote:
>>
>>> Author: mturk
>>> Date: Tue Jul 18 08:38:14 2006
>>> New Revision: 423119
>>>
>>> URL: http://svn.apache.org/viewvc?rev=423119&view=rev
>>> Log:
>>> Add svn:eol-style:native.
>>> We'll probably need to do that for the entire repository.
>>
>>
>> -1. This will screw up diffs, which will create much bigger problems.
>>
> 
> ???
> Are you sure?
> I think that the current situation is screwing the diffs.
> All .txt files should have svn:eol-style:native
> All .sh files should have svn:eol-style:native;svn:executable
> etc...
> 
> Anyhow see:
> http://svnbook.red-bean.com/en/1.0/ch07s02.html#svn-ch-7-sect-2.3.5
> 
> -- 
> Mladen.
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r423119 - /tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java

Posted by Mladen Turk <mt...@apache.org>.
Remy Maucherat wrote:
> mturk@apache.org wrote:
>> Author: mturk
>> Date: Tue Jul 18 08:38:14 2006
>> New Revision: 423119
>>
>> URL: http://svn.apache.org/viewvc?rev=423119&view=rev
>> Log:
>> Add svn:eol-style:native.
>> We'll probably need to do that for the entire repository.
> 
> -1. This will screw up diffs, which will create much bigger problems.
> 

???
Are you sure?
I think that the current situation is screwing the diffs.
All .txt files should have svn:eol-style:native
All .sh files should have svn:eol-style:native;svn:executable
etc...

Anyhow see:
http://svnbook.red-bean.com/en/1.0/ch07s02.html#svn-ch-7-sect-2.3.5

--
Mladen.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r423119 - /tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Connector.java

Posted by Remy Maucherat <re...@apache.org>.
mturk@apache.org wrote:
> Author: mturk
> Date: Tue Jul 18 08:38:14 2006
> New Revision: 423119
> 
> URL: http://svn.apache.org/viewvc?rev=423119&view=rev
> Log:
> Add svn:eol-style:native.
> We'll probably need to do that for the entire repository.

-1. This will screw up diffs, which will create much bigger problems.

Rémy

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org