Author: remm Date: Mon Apr 24 08:32:40 2006 New Revision: 396579 URL: http://svn.apache.org/viewcvs?rev=396579&view=rev Log: - Refactor using the new java.io endpoint. Hopefully, I did not make any mistake. - I will now test a bit, and will attempt to extract superclasses (most likely BaseEndpoint, BaseProtocol, BaseHttpProtocol).
Removed: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11BaseProtocol.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java?rev=396579&r1=396578&r2=396579&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Processor.java Mon Apr 24 08:32:40 2006 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation + * Copyright 1999-2006 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. @@ -22,11 +22,11 @@ import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.StringTokenizer; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -import java.security.AccessController; -import java.security.PrivilegedAction; import org.apache.coyote.ActionCode; import org.apache.coyote.ActionHook; @@ -35,6 +35,7 @@ import org.apache.coyote.Request; import org.apache.coyote.RequestInfo; import org.apache.coyote.Response; +import org.apache.coyote.http11.filters.BufferedInputFilter; import org.apache.coyote.http11.filters.ChunkedInputFilter; import org.apache.coyote.http11.filters.ChunkedOutputFilter; import org.apache.coyote.http11.filters.GzipOutputFilter; @@ -43,17 +44,15 @@ import org.apache.coyote.http11.filters.SavedRequestInputFilter; import org.apache.coyote.http11.filters.VoidInputFilter; import org.apache.coyote.http11.filters.VoidOutputFilter; -import org.apache.coyote.http11.filters.BufferedInputFilter; import org.apache.tomcat.util.buf.Ascii; import org.apache.tomcat.util.buf.ByteChunk; import org.apache.tomcat.util.buf.HexUtils; import org.apache.tomcat.util.buf.MessageBytes; import org.apache.tomcat.util.http.FastHttpDateFormat; import org.apache.tomcat.util.http.MimeHeaders; -import org.apache.tomcat.util.net.PoolTcpEndpoint; +import org.apache.tomcat.util.net.JIoEndpoint; import org.apache.tomcat.util.net.SSLSupport; import org.apache.tomcat.util.res.StringManager; -import org.apache.tomcat.util.threads.ThreadPool; import org.apache.tomcat.util.threads.ThreadWithAttributes; @@ -78,19 +77,13 @@ StringManager.getManager(Constants.Package); - // ----------------------------------------------------------- Constructors + // ------------------------------------------------------------ Constructor - /** - * Default constructor. - */ - public Http11Processor() { - this(Constants.DEFAULT_HTTP_HEADER_BUFFER_SIZE); - } - - - public Http11Processor(int headerBufferSize) { + public Http11Processor(int headerBufferSize, JIoEndpoint endpoint) { + this.endpoint = endpoint; + request = new Request(); inputBuffer = new InternalInputBuffer(request, headerBufferSize); request.setInputBuffer(inputBuffer); @@ -301,15 +294,9 @@ /** - * Associated thread pool. - */ - protected ThreadPool threadPool; - - - /** * Associated endpoint. */ - protected PoolTcpEndpoint endpoint; + protected JIoEndpoint endpoint; /** @@ -367,16 +354,6 @@ } - public void setThreadPool(ThreadPool threadPool) { - this.threadPool = threadPool; - } - - - public void setEndpoint(PoolTcpEndpoint endpoint) { - this.endpoint = endpoint; - } - - /** * Add user-agent for which gzip compression didn't works * The user agent String given will be exactly matched @@ -765,7 +742,7 @@ ThreadWithAttributes thrA= (ThreadWithAttributes)Thread.currentThread(); RequestInfo rp = request.getRequestProcessor(); - thrA.setCurrentStage(threadPool, "parsing http request"); + thrA.setCurrentStage(endpoint, "parsing http request"); rp.setStage(org.apache.coyote.Constants.STAGE_PARSE); // Set the remote address @@ -788,14 +765,8 @@ int soTimeout = socket.getSoTimeout(); int oldSoTimeout = soTimeout; - int threadRatio = 0; - if (threadPool.getCurrentThreadsBusy() > 0) { - threadRatio = (threadPool.getCurrentThreadsBusy() * 100) - / threadPool.getMaxThreads(); - } else { - threadRatio = (endpoint.getCurrentThreadsBusy() * 100) + int threadRatio = (endpoint.getCurrentThreadsBusy() * 100) / endpoint.getMaxThreads(); - } if ((threadRatio > 33) && (threadRatio <= 66)) { soTimeout = soTimeout / 2; } else if ((threadRatio > 66) && (threadRatio <= 90)) { @@ -826,7 +797,7 @@ } inputBuffer.parseRequestLine(); request.setStartTime(System.currentTimeMillis()); - thrA.setParam( threadPool, request.requestURI() ); + thrA.setParam( endpoint, request.requestURI() ); keptAlive = true; if (!disableUploadTimeout) { socket.setSoTimeout(timeout); @@ -845,7 +816,7 @@ } // Setting up filters, and parse some request headers - thrA.setCurrentStage(threadPool, "prepareRequest"); + thrA.setCurrentStage(endpoint, "prepareRequest"); rp.setStage(org.apache.coyote.Constants.STAGE_PREPARE); try { prepareRequest(); @@ -864,7 +835,7 @@ // Process the request in the adapter if (!error) { try { - thrA.setCurrentStage(threadPool, "service"); + thrA.setCurrentStage(endpoint, "service"); rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE); adapter.service(request, response); // Handle when the response was committed before a serious @@ -889,7 +860,7 @@ // Finish the handling of the request try { - thrA.setCurrentStage(threadPool, "endRequestIB"); + thrA.setCurrentStage(endpoint, "endRequestIB"); rp.setStage(org.apache.coyote.Constants.STAGE_ENDINPUT); inputBuffer.endRequest(); } catch (IOException e) { @@ -901,7 +872,7 @@ error = true; } try { - thrA.setCurrentStage(threadPool, "endRequestOB"); + thrA.setCurrentStage(endpoint, "endRequestOB"); rp.setStage(org.apache.coyote.Constants.STAGE_ENDOUTPUT); outputBuffer.endRequest(); } catch (IOException e) { @@ -918,7 +889,7 @@ } request.updateCounters(); - thrA.setCurrentStage(threadPool, "ended"); + thrA.setCurrentStage(endpoint, "ended"); rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE); // Don't reset the param - we'll see it as ended. Next request Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java URL: http://svn.apache.org/viewcvs/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java?rev=396579&r1=396578&r2=396579&view=diff ============================================================================== --- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java (original) +++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java Mon Apr 24 08:32:40 2006 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2004 The Apache Software Foundation + * Copyright 1999-2006 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. @@ -16,14 +16,30 @@ package org.apache.coyote.http11; +import java.net.InetAddress; +import java.net.Socket; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Iterator; +import java.util.concurrent.Executor; + import javax.management.MBeanRegistration; import javax.management.MBeanServer; import javax.management.ObjectName; +import org.apache.coyote.ActionCode; +import org.apache.coyote.ActionHook; +import org.apache.coyote.Adapter; +import org.apache.coyote.ProtocolHandler; +import org.apache.coyote.RequestGroupInfo; import org.apache.coyote.RequestInfo; import org.apache.tomcat.util.modeler.Registry; -import org.apache.tomcat.util.threads.ThreadPool; -import org.apache.tomcat.util.threads.ThreadWithAttributes; +import org.apache.tomcat.util.net.JIoEndpoint; +import org.apache.tomcat.util.net.SSLImplementation; +import org.apache.tomcat.util.net.SSLSupport; +import org.apache.tomcat.util.net.ServerSocketFactory; +import org.apache.tomcat.util.net.JIoEndpoint.Handler; +import org.apache.tomcat.util.res.StringManager; /** @@ -33,38 +49,134 @@ * * @author Remy Maucherat * @author Costin Manolache + * @deprecated */ -public class Http11Protocol extends Http11BaseProtocol implements MBeanRegistration -{ +public class Http11Protocol + implements ProtocolHandler, MBeanRegistration { + + + protected static org.apache.commons.logging.Log log + = org.apache.commons.logging.LogFactory.getLog(Http11Protocol.class); + + /** + * The string manager for this package. + */ + protected static StringManager sm = + StringManager.getManager(Constants.Package); + + + // ------------------------------------------------------------ Constructor + + public Http11Protocol() { + setSoLinger(Constants.DEFAULT_CONNECTION_LINGER); + setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT); + //setServerSoTimeout(Constants.DEFAULT_SERVER_SOCKET_TIMEOUT); + setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY); } + + + // ----------------------------------------------------------------- Fields + + + protected Http11ConnectionHandler cHandler = new Http11ConnectionHandler(this); + protected JIoEndpoint endpoint = new JIoEndpoint(); + + + // * + protected ObjectName tpOname = null; + // * + protected ObjectName rgOname = null; + + + protected ServerSocketFactory socketFactory = null; + protected SSLImplementation sslImplementation = null; + + + // ----------------------------------------- ProtocolHandler Implementation + // * + + + protected HashMap<String, Object> attributes = new HashMap<String, Object>(); + - protected Http11ConnectionHandler createConnectionHandler() { - return new JmxHttp11ConnectionHandler( this ) ; + /** + * Pass config info + */ + public void setAttribute(String name, Object value) { + if (log.isTraceEnabled()) { + log.trace(sm.getString("http11protocol.setattribute", name, value)); + } + attributes.put(name, value); + } + + public Object getAttribute(String key) { + return attributes.get(key); } - ObjectName tpOname; - ObjectName rgOname; + public Iterator getAttributeNames() { + return attributes.keySet().iterator(); + } + + + /** + * The adapter, used to call the connector. + */ + protected Adapter adapter; + public void setAdapter(Adapter adapter) { this.adapter = adapter; } + public Adapter getAdapter() { return adapter; } + + + public void init() throws Exception { + endpoint.setName(getName()); + endpoint.setHandler(cHandler); + + // Verify the validity of the configured socket factory + try { + if (secure) { + sslImplementation = + SSLImplementation.getInstance(sslImplementationName); + socketFactory = sslImplementation.getServerSocketFactory(); + endpoint.setServerSocketFactory(socketFactory); + } else if (socketFactoryName != null) { + socketFactory = (ServerSocketFactory) Class.forName(socketFactoryName).newInstance(); + endpoint.setServerSocketFactory(socketFactory); + } + } catch (Exception ex) { + log.error(sm.getString("http11protocol.socketfactory.initerror"), + ex); + throw ex; + } + + if (socketFactory!=null) { + Iterator<String> attE = attributes.keySet().iterator(); + while( attE.hasNext() ) { + String key = attE.next(); + Object v=attributes.get(key); + socketFactory.setAttribute(key, v); + } + } + + try { + endpoint.init(); + } catch (Exception ex) { + log.error(sm.getString("http11protocol.endpoint.initerror"), ex); + throw ex; + } + if (log.isInfoEnabled()) + log.info(sm.getString("http11protocol.init", getName())); + + } public void start() throws Exception { - if( this.domain != null ) { + if (this.domain != null) { try { - // XXX We should be able to configure it separately - // XXX It should be possible to use a single TP - tpOname=new ObjectName + tpOname = new ObjectName (domain + ":" + "type=ThreadPool,name=" + getName()); - if ("ms".equals(getStrategy())) { - Registry.getRegistry(null, null) - .registerComponent(ep, tpOname, null ); - } else { - Registry.getRegistry(null, null) - .registerComponent(tp, tpOname, null ); - } - tp.setName(getName()); - tp.setDaemon(false); - tp.addThreadPoolListener(new MXPoolListener(this, tp)); + Registry.getRegistry(null, null) + .registerComponent(endpoint, tpOname, null ); } catch (Exception e) { - log.error("Can't register threadpool" ); + log.error("Can't register endpoint"); } rgOname=new ObjectName (domain + ":type=GlobalRequestProcessor,name=" + getName()); @@ -72,92 +184,466 @@ ( cHandler.global, rgOname, null ); } - super.start(); + try { + endpoint.start(); + } catch (Exception ex) { + log.error(sm.getString("http11protocol.endpoint.starterror"), ex); + throw ex; + } + if (log.isInfoEnabled()) + log.info(sm.getString("http11protocol.start", getName())); + } + + public void pause() throws Exception { + try { + endpoint.pause(); + } catch (Exception ex) { + log.error(sm.getString("http11protocol.endpoint.pauseerror"), ex); + throw ex; + } + if (log.isInfoEnabled()) + log.info(sm.getString("http11protocol.pause", getName())); + } + + public void resume() throws Exception { + try { + endpoint.resume(); + } catch (Exception ex) { + log.error(sm.getString("http11protocol.endpoint.resumeerror"), ex); + throw ex; + } + if (log.isInfoEnabled()) + log.info(sm.getString("http11protocol.resume", getName())); } public void destroy() throws Exception { - super.destroy(); - if( tpOname!=null ) + if (log.isInfoEnabled()) + log.info(sm.getString("http11protocol.stop", getName())); + endpoint.destroy(); + if (tpOname!=null) Registry.getRegistry(null, null).unregisterComponent(tpOname); - if( rgOname != null ) + if (rgOname != null) Registry.getRegistry(null, null).unregisterComponent(rgOname); } - // -------------------- Connection handler -------------------- + + // ------------------------------------------------------------- Properties - static class MXPoolListener implements ThreadPool.ThreadPoolListener { - MXPoolListener( Http11Protocol proto, ThreadPool control ) { + + // * + /** + * This field indicates if the protocol is secure from the perspective of + * the client (= https is used). + */ + protected boolean secure; + public boolean getSecure() { return secure; } + public void setSecure(boolean b) { secure = b; } + + + /** + * Name of the socket factory. + */ + protected String socketFactoryName = null; + public String getSocketFactory() { return socketFactoryName; } + public void setSocketFactory(String valueS) { socketFactoryName = valueS; } + + + /** + * Name of the SSL implementation. + */ + protected String sslImplementationName=null; + public String getSSLImplementation() { return sslImplementationName; } + public void setSSLImplementation( String valueS) { + sslImplementationName = valueS; + setSecure(true); + } + + + // HTTP + /** + * Maximum number of requests which can be performed over a keepalive + * connection. The default is the same as for Apache HTTP Server. + */ + protected int maxKeepAliveRequests = 100; + public int getMaxKeepAliveRequests() { return maxKeepAliveRequests; } + public void setMaxKeepAliveRequests(int mkar) { maxKeepAliveRequests = mkar; } + + + // HTTP + /** + * This timeout represents the socket timeout which will be used while + * the adapter execution is in progress, unless disableUploadTimeout + * is set to true. The default is the same as for Apache HTTP Server + * (300 000 milliseconds). + */ + protected int timeout = 300000; + public int getTimeout() { return timeout; } + public void setTimeout(int timeout) { this.timeout = timeout; } + + + // * + /** + * Maximum size of the post which will be saved when processing certain + * requests, such as a POST. + */ + protected int maxSavePostSize = 4 * 1024; + public int getMaxSavePostSize() { return maxSavePostSize; } + public void setMaxSavePostSize(int valueI) { maxSavePostSize = valueI; } + + + // HTTP + /** + * Maximum size of the HTTP message header. + */ + protected int maxHttpHeaderSize = 8 * 1024; + public int getMaxHttpHeaderSize() { return maxHttpHeaderSize; } + public void setMaxHttpHeaderSize(int valueI) { maxHttpHeaderSize = valueI; } + + + // HTTP + /** + * If true, the regular socket timeout will be used for the full duration + * of the connection. + */ + protected boolean disableUploadTimeout = true; + public boolean getDisableUploadTimeout() { return disableUploadTimeout; } + public void setDisableUploadTimeout(boolean isDisabled) { disableUploadTimeout = isDisabled; } + + + // HTTP + /** + * Integrated compression support. + */ + protected String compression = "off"; + public String getCompression() { return compression; } + public void setCompression(String valueS) { compression = valueS; } + + + // HTTP + protected String noCompressionUserAgents = null; + public String getNoCompressionUserAgents() { return noCompressionUserAgents; } + public void setNoCompressionUserAgents(String valueS) { noCompressionUserAgents = valueS; } - } + + // HTTP + protected String compressableMimeTypes = "text/html,text/xml,text/plain"; + public String getCompressableMimeType() { return compressableMimeTypes; } + public void setCompressableMimeType(String valueS) { compressableMimeTypes = valueS; } + + + // HTTP + protected int compressionMinSize = 2048; + public int getCompressionMinSize() { return compressionMinSize; } + public void setCompressionMinSize(int valueI) { compressionMinSize = valueI; } - public void threadStart(ThreadPool tp, Thread t) { - } - public void threadEnd(ThreadPool tp, Thread t) { - // Register our associated processor - // TP uses only TWA - ThreadWithAttributes ta=(ThreadWithAttributes)t; - Object tpData[]=ta.getThreadData(tp); - if( tpData==null ) return; - // Weird artifact - it should be cleaned up, but that may break something - // and it won't gain us too much - if( tpData[1] instanceof Object[] ) { - tpData=(Object [])tpData[1]; - } - ObjectName oname=(ObjectName)tpData[Http11BaseProtocol.THREAD_DATA_OBJECT_NAME]; - if( oname==null ) return; - Registry.getRegistry(null, null).unregisterComponent(oname); - Http11Processor processor = - (Http11Processor) tpData[Http11Protocol.THREAD_DATA_PROCESSOR]; - RequestInfo rp=processor.getRequest().getRequestProcessor(); - rp.setGlobalProcessor(null); - } + // HTTP + /** + * User agents regular expressions which should be restricted to HTTP/1.0 support. + */ + protected String restrictedUserAgents = null; + public String getRestrictedUserAgents() { return restrictedUserAgents; } + public void setRestrictedUserAgents(String valueS) { restrictedUserAgents = valueS; } + + + // HTTP + /** + * Server header. + */ + protected String server; + public void setServer( String server ) { this.server = server; } + public String getServer() { return server; } + + + // --------------------------------------------------------- Public methods + + // * + public Executor getExecutor() { + return endpoint.getExecutor(); + } + + // * + public void setExecutor(Executor executor) { + endpoint.setExecutor(executor); + } + + // * + public int getMaxThreads() { + return endpoint.getMaxThreads(); } - static class JmxHttp11ConnectionHandler extends Http11ConnectionHandler { - Http11Protocol proto; - static int count=0; + // * + public void setMaxThreads( int maxThreads ) { + endpoint.setMaxThreads(maxThreads); + } - JmxHttp11ConnectionHandler( Http11Protocol proto ) { - super(proto); - this.proto = proto ; - } + // * + public void setThreadPriority(int threadPriority) { + endpoint.setThreadPriority(threadPriority); + } + + // * + public int getThreadPriority() { + return endpoint.getThreadPriority(); + } + + // * + public int getBacklog() { + return endpoint.getBacklog(); + } - public void setAttribute( String name, Object value ) { + // * + public void setBacklog( int i ) { + endpoint.setBacklog(i); + } + + // * + public int getPort() { + return endpoint.getPort(); + } + + // * + public void setPort( int port ) { + endpoint.setPort(port); + } + + // * + public InetAddress getAddress() { + return endpoint.getAddress(); + } + + // * + public void setAddress(InetAddress ia) { + endpoint.setAddress( ia ); + } + + // * + public String getName() { + String encodedAddr = ""; + if (getAddress() != null) { + encodedAddr = "" + getAddress(); + if (encodedAddr.startsWith("/")) + encodedAddr = encodedAddr.substring(1); + encodedAddr = URLEncoder.encode(encodedAddr) + "-"; } + return ("http-" + encodedAddr + endpoint.getPort()); + } + + // * + public boolean getTcpNoDelay() { + return endpoint.getTcpNoDelay(); + } - public void setServer( Object o ) { + // * + public void setTcpNoDelay( boolean b ) { + endpoint.setTcpNoDelay( b ); + } + + // * + public int getSoLinger() { + return endpoint.getSoLinger(); + } + + // * + public void setSoLinger( int i ) { + endpoint.setSoLinger( i ); + } + + // * + public int getSoTimeout() { + return endpoint.getSoTimeout(); + } + + // * + public void setSoTimeout( int i ) { + endpoint.setSoTimeout(i); + } + + // HTTP + /** + * Return the Keep-Alive policy for the connection. + */ + public boolean getKeepAlive() { + return ((maxKeepAliveRequests != 0) && (maxKeepAliveRequests != 1)); + } + + // HTTP + /** + * Set the keep-alive policy for this connection. + */ + public void setKeepAlive(boolean keepAlive) { + if (!keepAlive) { + setMaxKeepAliveRequests(1); } + } + + /* + * Note: All the following are JSSE/java.io specific attributes. + */ + + public String getKeystore() { + return (String) getAttribute("keystore"); + } + + public void setKeystore( String k ) { + setAttribute("keystore", k); + } + + public String getKeypass() { + return (String) getAttribute("keypass"); + } + + public void setKeypass( String k ) { + attributes.put("keypass", k); + //setAttribute("keypass", k); + } + + public String getKeytype() { + return (String) getAttribute("keystoreType"); + } - public Object[] init() { + public void setKeytype( String k ) { + setAttribute("keystoreType", k); + } - Object thData[]=super.init(); + public String getClientauth() { + return (String) getAttribute("clientauth"); + } - // was set up by supper - Http11Processor processor = (Http11Processor) - thData[ Http11BaseProtocol.THREAD_DATA_PROCESSOR]; + public void setClientauth( String k ) { + setAttribute("clientauth", k); + } + + public String getProtocols() { + return (String) getAttribute("protocols"); + } - if( proto.getDomain() != null ) { - try { - RequestInfo rp=processor.getRequest().getRequestProcessor(); - rp.setGlobalProcessor(global); - ObjectName rpName=new ObjectName - (proto.getDomain() + ":type=RequestProcessor,worker=" - + proto.getName() +",name=HttpRequest" + count++ ); - Registry.getRegistry(null, null).registerComponent( rp, rpName, null); - thData[Http11BaseProtocol.THREAD_DATA_OBJECT_NAME]=rpName; - } catch( Exception ex ) { - log.warn("Error registering request"); + public void setProtocols(String k) { + setAttribute("protocols", k); + } + + public String getAlgorithm() { + return (String) getAttribute("algorithm"); + } + + public void setAlgorithm( String k ) { + setAttribute("algorithm", k); + } + + public String getCiphers() { + return (String) getAttribute("ciphers"); + } + + public void setCiphers(String ciphers) { + setAttribute("ciphers", ciphers); + } + + public String getKeyAlias() { + return (String) getAttribute("keyAlias"); + } + + public void setKeyAlias(String keyAlias) { + setAttribute("keyAlias", keyAlias); + } + + // ----------------------------------- Http11ConnectionHandler Inner Class + + protected static class Http11ConnectionHandler implements Handler { + protected Http11Protocol protocol; + protected static int count = 0; + protected RequestGroupInfo global = new RequestGroupInfo(); + protected ThreadLocal<Http11Processor> localProcessor = new ThreadLocal<Http11Processor>(); + + Http11ConnectionHandler(Http11Protocol proto) { + this.protocol = proto; + } + + public boolean process(Socket socket) { + Http11Processor processor = null; + try { + processor = localProcessor.get(); + if (processor == null) { + processor = + new Http11Processor(protocol.maxHttpHeaderSize, protocol.endpoint); + processor.setAdapter(protocol.adapter); + processor.setMaxKeepAliveRequests(protocol.maxKeepAliveRequests); + processor.setTimeout(protocol.timeout); + processor.setDisableUploadTimeout(protocol.disableUploadTimeout); + processor.setCompression(protocol.compression); + processor.setCompressionMinSize(protocol.compressionMinSize); + processor.setNoCompressionUserAgents(protocol.noCompressionUserAgents); + processor.setCompressableMimeTypes(protocol.compressableMimeTypes); + processor.setRestrictedUserAgents(protocol.restrictedUserAgents); + processor.setMaxSavePostSize(protocol.maxSavePostSize); + processor.setServer(protocol.server); + localProcessor.set(processor); + if (protocol.getDomain() != null) { + synchronized (this) { + try { + RequestInfo rp = processor.getRequest().getRequestProcessor(); + rp.setGlobalProcessor(global); + ObjectName rpName = new ObjectName + (protocol.getDomain() + ":type=RequestProcessor,worker=" + + protocol.getName() + ",name=HttpRequest" + count++); + Registry.getRegistry(null, null).registerComponent(rp, rpName, null); + } catch (Exception e) { + log.warn("Error registering request"); + } + } + } + } + + if (processor instanceof ActionHook) { + ((ActionHook) processor).action(ActionCode.ACTION_START, null); } + + if (protocol.secure && (protocol.sslImplementation != null)) { + processor.setSSLSupport + (protocol.sslImplementation.getSSLSupport(socket)); + } else { + processor.setSSLSupport(null); + } + + processor.setSocket(socket); + processor.process(socket.getInputStream(), socket.getOutputStream()); + return false; + + } catch(java.net.SocketException e) { + // SocketExceptions are normal + Http11Protocol.log.debug + (sm.getString + ("http11protocol.proto.socketexception.debug"), e); + } catch (java.io.IOException e) { + // IOExceptions are normal + Http11Protocol.log.debug + (sm.getString + ("http11protocol.proto.ioexception.debug"), e); } + // Future developers: if you discover any other + // rare-but-nonfatal exceptions, catch them here, and log as + // above. + catch (Throwable e) { + // any other exception or error is odd. Here we log it + // with "ERROR" level, so it will show up even on + // less-than-verbose logs. + Http11Protocol.log.error + (sm.getString("http11protocol.proto.error"), e); + } finally { + // if(proto.adapter != null) proto.adapter.recycle(); + // processor.recycle(); - return thData; + if (processor instanceof ActionHook) { + ((ActionHook) processor).action(ActionCode.ACTION_STOP, null); + } + } + return false; } } - // -------------------- Various implementation classes -------------------- + // -------------------- JMX related methods -------------------- + // * protected String domain; protected ObjectName oname; protected MBeanServer mserver; @@ -186,5 +672,4 @@ public void postDeregister() { } - } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]