diff options
author | Greg Wilkins | 2012-05-09 09:18:20 +0000 |
---|---|---|
committer | Greg Wilkins | 2012-05-09 09:18:20 +0000 |
commit | c1011c54a40b08a59f099c74d80162bde256896a (patch) | |
tree | 5814a1e05ddc6e91f4faa9f594c58afd1a1febc2 | |
parent | 0c81b36e047717c04ace524ece667b9adef2e4df (diff) | |
download | org.eclipse.jetty.project-c1011c54a40b08a59f099c74d80162bde256896a.tar.gz org.eclipse.jetty.project-c1011c54a40b08a59f099c74d80162bde256896a.tar.xz org.eclipse.jetty.project-c1011c54a40b08a59f099c74d80162bde256896a.zip |
jetty-9 work in progress
11 files changed, 189 insertions, 919 deletions
diff --git a/jetty-io/src/main/java/org/eclipse/jetty/io/AsyncConnection.java b/jetty-io/src/main/java/org/eclipse/jetty/io/AsyncConnection.java index 6d1153dc13..a1e6e8ba6d 100644 --- a/jetty-io/src/main/java/org/eclipse/jetty/io/AsyncConnection.java +++ b/jetty-io/src/main/java/org/eclipse/jetty/io/AsyncConnection.java @@ -2,7 +2,6 @@ package org.eclipse.jetty.io; public interface AsyncConnection { - public abstract void onClose(); public abstract AsyncEndPoint getEndPoint(); diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java index 3b23f51cc4..d3596b488c 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractConnector.java @@ -26,12 +26,11 @@ import org.eclipse.jetty.http.HttpScheme; import org.eclipse.jetty.io.AsyncConnection; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.io.EofException; +import org.eclipse.jetty.server.Connector.Statistics; import org.eclipse.jetty.util.component.AggregateLifeCycle; import org.eclipse.jetty.util.component.Dumpable; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; -import org.eclipse.jetty.util.statistic.CounterStatistic; -import org.eclipse.jetty.util.statistic.SampleStatistic; import org.eclipse.jetty.util.thread.ThreadPool; /** @@ -49,7 +48,7 @@ import org.eclipse.jetty.util.thread.ThreadPool; */ public abstract class AbstractConnector extends AggregateLifeCycle implements Connector, Dumpable { - private static final Logger LOG = Log.getLogger(AbstractConnector.class); + static final Logger LOG = Log.getLogger(AbstractConnector.class); private String _name; @@ -57,40 +56,18 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co private ThreadPool _threadPool; private String _host; private int _port = 0; - private String _integralScheme = HttpScheme.HTTPS.toString(); - private int _integralPort = 0; - private String _confidentialScheme = HttpScheme.HTTPS.toString(); - private int _confidentialPort = 0; private int _acceptQueueSize = 0; private int _acceptors = 1; private int _acceptorPriorityOffset = 0; - private boolean _useDNS; - private boolean _forwarded; - private String _hostHeader; - - private String _forwardedHostHeader = HttpHeader.X_FORWARDED_HOST.toString(); - private String _forwardedServerHeader = HttpHeader.X_FORWARDED_SERVER.toString(); - private String _forwardedForHeader = HttpHeader.X_FORWARDED_FOR.toString(); - private String _forwardedProtoHeader = HttpHeader.X_FORWARDED_PROTO.toString(); - private String _forwardedCipherSuiteHeader; - private String _forwardedSslSessionIdHeader; private boolean _reuseAddress = true; + private final Statistics _stats = new ConnectionStatistics(); + protected int _maxIdleTime = 200000; - protected int _lowResourceMaxIdleTime = -1; protected int _soLingerTime = -1; private transient Thread[] _acceptorThreads; - private final AtomicLong _statsStartedAt = new AtomicLong(-1L); - - /** connections to server */ - private final CounterStatistic _connectionStats = new CounterStatistic(); - /** requests per connection */ - private final SampleStatistic _requestStats = new SampleStatistic(); - /** duration of a connection */ - private final SampleStatistic _connectionDurationStats = new SampleStatistic(); - /* ------------------------------------------------------------ */ /** @@ -100,6 +77,13 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co } /* ------------------------------------------------------------ */ + @Override + public Statistics getStatistics() + { + return _stats; + } + + /* ------------------------------------------------------------ */ /* */ @Override @@ -109,7 +93,6 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co } /* ------------------------------------------------------------ */ - @Override public void setServer(Server server) { _server = server; @@ -137,7 +120,6 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co /* ------------------------------------------------------------ */ /** */ - @Override public void setHost(String host) { _host = host; @@ -153,7 +135,6 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co } /* ------------------------------------------------------------ */ - @Override public void setPort(int port) { _port = port; @@ -196,7 +177,6 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co * @param maxIdleTime * The maxIdleTime to set. */ - @Override public void setMaxIdleTime(int maxIdleTime) { _maxIdleTime = maxIdleTime; @@ -204,25 +184,6 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co /* ------------------------------------------------------------ */ /** - * @return Returns the maxIdleTime when resources are low. - */ - public int getLowResourcesMaxIdleTime() - { - return _lowResourceMaxIdleTime; - } - - /* ------------------------------------------------------------ */ - /** - * @param maxIdleTime - * The maxIdleTime to set when resources are low. - */ - public void setLowResourcesMaxIdleTime(int maxIdleTime) - { - _lowResourceMaxIdleTime = maxIdleTime; - } - - /* ------------------------------------------------------------ */ - /** * @return Returns the soLingerTime. */ public int getSoLingerTime() @@ -359,7 +320,7 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co } /* ------------------------------------------------------------ */ - protected void configure(Socket socket) throws IOException + protected void configure(Socket socket) { try { @@ -376,205 +337,6 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co } /* ------------------------------------------------------------ */ - @Override - public void customize(Request request) throws IOException - { - if (isForwarded()) - checkForwardedHeaders(request); - } - - /* ------------------------------------------------------------ */ - protected void checkForwardedHeaders(Request request) throws IOException - { - HttpFields httpFields = request.getConnection().getRequestFields(); - - // Do SSL first - if (getForwardedCipherSuiteHeader()!=null) - { - String cipher_suite=httpFields.getStringField(getForwardedCipherSuiteHeader()); - if (cipher_suite!=null) - request.setAttribute("javax.servlet.request.cipher_suite",cipher_suite); - } - if (getForwardedSslSessionIdHeader()!=null) - { - String ssl_session_id=httpFields.getStringField(getForwardedSslSessionIdHeader()); - if(ssl_session_id!=null) - { - request.setAttribute("javax.servlet.request.ssl_session_id", ssl_session_id); - request.setScheme(HttpScheme.HTTPS.toString()); - } - } - - // Retrieving headers from the request - String forwardedHost = getLeftMostFieldValue(httpFields,getForwardedHostHeader()); - String forwardedServer = getLeftMostFieldValue(httpFields,getForwardedServerHeader()); - String forwardedFor = getLeftMostFieldValue(httpFields,getForwardedForHeader()); - String forwardedProto = getLeftMostFieldValue(httpFields,getForwardedProtoHeader()); - - if (_hostHeader != null) - { - // Update host header - httpFields.put(HttpHeader.HOST.toString(),_hostHeader); - request.setServerName(null); - request.setServerPort(-1); - request.getServerName(); - } - else if (forwardedHost != null) - { - // Update host header - httpFields.put(HttpHeader.HOST.toString(),forwardedHost); - request.setServerName(null); - request.setServerPort(-1); - request.getServerName(); - } - else if (forwardedServer != null) - { - // Use provided server name - request.setServerName(forwardedServer); - } - - if (forwardedFor != null) - { - request.setRemoteAddr(new InetSocketAddress(forwardedFor,request.getRemotePort())); - } - - if (forwardedProto != null) - { - request.setScheme(forwardedProto); - } - } - - /* ------------------------------------------------------------ */ - protected String getLeftMostFieldValue(HttpFields fields, String header) - { - if (header == null) - return null; - - String headerValue = fields.getStringField(header); - - if (headerValue == null) - return null; - - int commaIndex = headerValue.indexOf(','); - - if (commaIndex == -1) - { - // Single value - return headerValue; - } - - // The left-most value is the farthest downstream client - return headerValue.substring(0,commaIndex); - } - - /* ------------------------------------------------------------ */ - @Override - public void persist(EndPoint endpoint) throws IOException - { - } - - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#getConfidentialPort() - */ - @Override - public int getConfidentialPort() - { - return _confidentialPort; - } - - /* ------------------------------------------------------------ */ - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#getConfidentialScheme() - */ - @Override - public String getConfidentialScheme() - { - return _confidentialScheme; - } - - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server .Request) - */ - @Override - public boolean isIntegral(Request request) - { - return false; - } - - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#getConfidentialPort() - */ - @Override - public int getIntegralPort() - { - return _integralPort; - } - - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#getIntegralScheme() - */ - @Override - public String getIntegralScheme() - { - return _integralScheme; - } - - /* ------------------------------------------------------------ */ - /* - * @see org.eclipse.jetty.server.Connector#isConfidential(org.eclipse.jetty.server.Request) - */ - @Override - public boolean isConfidential(Request request) - { - return _forwarded && request.getScheme().equalsIgnoreCase(HttpScheme.HTTPS.toString()); - } - - /* ------------------------------------------------------------ */ - /** - * @param confidentialPort - * The confidentialPort to set. - */ - public void setConfidentialPort(int confidentialPort) - { - _confidentialPort = confidentialPort; - } - - /* ------------------------------------------------------------ */ - /** - * @param confidentialScheme - * The confidentialScheme to set. - */ - public void setConfidentialScheme(String confidentialScheme) - { - _confidentialScheme = confidentialScheme; - } - - /* ------------------------------------------------------------ */ - /** - * @param integralPort - * The integralPort to set. - */ - public void setIntegralPort(int integralPort) - { - _integralPort = integralPort; - } - - /* ------------------------------------------------------------ */ - /** - * @param integralScheme - * The integralScheme to set. - */ - public void setIntegralScheme(String integralScheme) - { - _integralScheme = integralScheme; - } - - /* ------------------------------------------------------------ */ protected abstract void accept(int acceptorID) throws IOException, InterruptedException; /* ------------------------------------------------------------ */ @@ -582,192 +344,6 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co { } - /* ------------------------------------------------------------ */ - @Override - public boolean getResolveNames() - { - return _useDNS; - } - - /* ------------------------------------------------------------ */ - public void setResolveNames(boolean resolve) - { - _useDNS = resolve; - } - - /* ------------------------------------------------------------ */ - /** - * Is reverse proxy handling on? - * - * @return true if this connector is checking the x-forwarded-for/host/server headers - */ - public boolean isForwarded() - { - return _forwarded; - } - - /* ------------------------------------------------------------ */ - /** - * Set reverse proxy handling. If set to true, then the X-Forwarded headers (or the headers set in their place) are looked for to set the request protocol, - * host, server and client ip. - * - * @param check - * true if this connector is checking the x-forwarded-for/host/server headers - * @set {@link #setForwardedForHeader(String)} - * @set {@link #setForwardedHostHeader(String)} - * @set {@link #setForwardedProtoHeader(String)} - * @set {@link #setForwardedServerHeader(String)} - */ - public void setForwarded(boolean check) - { - if (check) - LOG.debug("{} is forwarded",this); - _forwarded = check; - } - - /* ------------------------------------------------------------ */ - public String getHostHeader() - { - return _hostHeader; - } - - /* ------------------------------------------------------------ */ - /** - * Set a forced valued for the host header to control what is returned by {@link ServletRequest#getServerName()} and {@link ServletRequest#getServerPort()}. - * This value is only used if {@link #isForwarded()} is true. - * - * @param hostHeader - * The value of the host header to force. - */ - public void setHostHeader(String hostHeader) - { - _hostHeader = hostHeader; - } - - /* ------------------------------------------------------------ */ - /* - * - * @see #setForwarded(boolean) - */ - public String getForwardedHostHeader() - { - return _forwardedHostHeader; - } - - /* ------------------------------------------------------------ */ - /** - * @param forwardedHostHeader - * The header name for forwarded hosts (default x-forwarded-host) - * @see #setForwarded(boolean) - */ - public void setForwardedHostHeader(String forwardedHostHeader) - { - _forwardedHostHeader = forwardedHostHeader; - } - - /* ------------------------------------------------------------ */ - /** - * @return the header name for forwarded server. - * @see #setForwarded(boolean) - */ - public String getForwardedServerHeader() - { - return _forwardedServerHeader; - } - - /* ------------------------------------------------------------ */ - /** - * @param forwardedServerHeader - * The header name for forwarded server (default x-forwarded-server) - * @see #setForwarded(boolean) - */ - public void setForwardedServerHeader(String forwardedServerHeader) - { - _forwardedServerHeader = forwardedServerHeader; - } - - /* ------------------------------------------------------------ */ - /** - * @see #setForwarded(boolean) - */ - public String getForwardedForHeader() - { - return _forwardedForHeader; - } - - /* ------------------------------------------------------------ */ - /** - * @param forwardedRemoteAddressHeader - * The header name for forwarded for (default x-forwarded-for) - * @see #setForwarded(boolean) - */ - public void setForwardedForHeader(String forwardedRemoteAddressHeader) - { - _forwardedForHeader = forwardedRemoteAddressHeader; - } - - /* ------------------------------------------------------------ */ - /** - * Get the forwardedProtoHeader. - * - * @return the forwardedProtoHeader (default X-Forwarded-For) - * @see #setForwarded(boolean) - */ - public String getForwardedProtoHeader() - { - return _forwardedProtoHeader; - } - - /* ------------------------------------------------------------ */ - /** - * Set the forwardedProtoHeader. - * - * @param forwardedProtoHeader - * the forwardedProtoHeader to set (default X-Forwarded-For) - * @see #setForwarded(boolean) - */ - public void setForwardedProtoHeader(String forwardedProtoHeader) - { - _forwardedProtoHeader = forwardedProtoHeader; - } - - /* ------------------------------------------------------------ */ - /** - * @return The header name holding a forwarded cipher suite (default null) - */ - public String getForwardedCipherSuiteHeader() - { - return _forwardedCipherSuiteHeader; - } - - /* ------------------------------------------------------------ */ - /** - * @param forwardedCipherSuite - * The header name holding a forwarded cipher suite (default null) - */ - public void setForwardedCipherSuiteHeader(String forwardedCipherSuite) - { - _forwardedCipherSuiteHeader = forwardedCipherSuite; - } - - /* ------------------------------------------------------------ */ - /** - * @return The header name holding a forwarded SSL Session ID (default null) - */ - public String getForwardedSslSessionIdHeader() - { - return _forwardedSslSessionIdHeader; - } - - /* ------------------------------------------------------------ */ - /** - * @param forwardedSslSessionId - * The header name holding a forwarded SSL Session ID (default null) - */ - public void setForwardedSslSessionIdHeader(String forwardedSslSessionId) - { - _forwardedSslSessionIdHeader = forwardedSslSessionId; - } /* ------------------------------------------------------------ */ @Override @@ -865,192 +441,31 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co _name = name; } - /* ------------------------------------------------------------ */ - /** - * @return Get the number of requests handled by this connector since last call of statsReset(). If setStatsOn(false) then this is undefined. - */ - @Override - public int getRequests() - { - return (int)_requestStats.getTotal(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Returns the connectionsDurationTotal. - */ - @Override - public long getConnectionsDurationTotal() - { - return _connectionDurationStats.getTotal(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Number of connections accepted by the server since statsReset() called. Undefined if setStatsOn(false). - */ - @Override - public int getConnections() - { - return (int)_connectionStats.getTotal(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Number of connections currently open that were opened since statsReset() called. Undefined if setStatsOn(false). - */ - @Override - public int getConnectionsOpen() - { - return (int)_connectionStats.getCurrent(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Maximum number of connections opened simultaneously since statsReset() called. Undefined if setStatsOn(false). - */ - @Override - public int getConnectionsOpenMax() - { - return (int)_connectionStats.getMax(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Mean duration in milliseconds of open connections since statsReset() called. Undefined if setStatsOn(false). - */ - @Override - public double getConnectionsDurationMean() - { - return _connectionDurationStats.getMean(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Maximum duration in milliseconds of an open connection since statsReset() called. Undefined if setStatsOn(false). - */ - @Override - public long getConnectionsDurationMax() - { - return _connectionDurationStats.getMax(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Standard deviation of duration in milliseconds of open connections since statsReset() called. Undefined if setStatsOn(false). - */ - @Override - public double getConnectionsDurationStdDev() - { - return _connectionDurationStats.getStdDev(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Mean number of requests per connection since statsReset() called. Undefined if setStatsOn(false). - */ - @Override - public double getConnectionsRequestsMean() - { - return _requestStats.getMean(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Maximum number of requests per connection since statsReset() called. Undefined if setStatsOn(false). - */ - @Override - public int getConnectionsRequestsMax() - { - return (int)_requestStats.getMax(); - } - - /* ------------------------------------------------------------ */ - /** - * @return Standard deviation of number of requests per connection since statsReset() called. Undefined if setStatsOn(false). - */ - @Override - public double getConnectionsRequestsStdDev() - { - return _requestStats.getStdDev(); - } - - /* ------------------------------------------------------------ */ - /** - * Reset statistics. - */ - @Override - public void statsReset() - { - updateNotEqual(_statsStartedAt,-1,System.currentTimeMillis()); - - _requestStats.reset(); - _connectionStats.reset(); - _connectionDurationStats.reset(); - } - - /* ------------------------------------------------------------ */ - @Override - public void setStatsOn(boolean on) - { - if (on && _statsStartedAt.get() != -1) - return; - - if (LOG.isDebugEnabled()) - LOG.debug("Statistics on = " + on + " for " + this); - - statsReset(); - _statsStartedAt.set(on?System.currentTimeMillis():-1); - } - - /* ------------------------------------------------------------ */ - /** - * @return True if statistics collection is turned on. - */ - @Override - public boolean getStatsOn() - { - return _statsStartedAt.get() != -1; - } - - /* ------------------------------------------------------------ */ - /** - * @return Timestamp stats were started at. - */ - @Override - public long getStatsOnMs() - { - long start = _statsStartedAt.get(); - - return (start != -1)?(System.currentTimeMillis() - start):0; - } - + + /* ------------------------------------------------------------ */ protected void connectionOpened(AsyncConnection connection) { - if (_statsStartedAt.get() == -1) - return; - - _connectionStats.increment(); + _stats.connectionOpened(); } /* ------------------------------------------------------------ */ protected void connectionUpgraded(AsyncConnection oldConnection, AsyncConnection newConnection) { - _requestStats.set((oldConnection instanceof HttpConnection)?((HttpConnection)oldConnection).getHttpChannel().getRequests():0); + long duration = System.currentTimeMillis() - oldConnection.getEndPoint().getCreatedTimeStamp(); + int requests = (oldConnection instanceof HttpConnection)?((HttpConnection)oldConnection).getHttpChannel().getRequests():0; + _stats.connectionUpgraded(duration,requests,requests); } /* ------------------------------------------------------------ */ protected void connectionClosed(AsyncConnection connection) { - if (_statsStartedAt.get() == -1) - return; - + long duration = System.currentTimeMillis() - connection.getEndPoint().getCreatedTimeStamp(); int requests = (connection instanceof HttpConnection)?((HttpConnection)connection).getHttpChannel().getRequests():0; - _requestStats.set(requests); - _connectionStats.decrement(); - _connectionDurationStats.set(duration); + + _stats.connectionClosed(duration,requests,requests); + } /* ------------------------------------------------------------ */ @@ -1096,7 +511,7 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co /* ------------------------------------------------------------ */ - private void updateNotEqual(AtomicLong valueHolder, long compare, long value) + void updateNotEqual(AtomicLong valueHolder, long compare, long value) { long oldValue = valueHolder.get(); while (compare != oldValue) diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java index 1797239e4e..8f76ef4406 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Connector.java @@ -15,6 +15,7 @@ package org.eclipse.jetty.server; import java.io.IOException; +import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.io.EndPoint; import org.eclipse.jetty.util.component.LifeCycle; @@ -28,12 +29,6 @@ import org.eclipse.jetty.util.component.LifeCycle; * will set itself as both the ThreadPool and the Handler. Note that a connector * can be used without a Server if a thread pool and handler are directly provided. * - * - * - */ -/** - * @author gregw - * */ public interface Connector extends LifeCycle { @@ -54,70 +49,10 @@ public interface Connector extends LifeCycle void close() throws IOException; /* ------------------------------------------------------------ */ - void setServer(Server server); - - /* ------------------------------------------------------------ */ Server getServer(); /* ------------------------------------------------------------ */ - /** - * @return The port to use when redirecting a request if a data constraint of integral is - * required. See {@link org.eclipse.jetty.util.security.Constraint#getDataConstraint()} - */ - int getIntegralPort(); - - /* ------------------------------------------------------------ */ - /** - * @return The schema to use when redirecting a request if a data constraint of integral is - * required. See {@link org.eclipse.jetty.util.security.Constraint#getDataConstraint()} - */ - String getIntegralScheme(); - - /* ------------------------------------------------------------ */ - /** - * @param request A request - * @return true if the request is integral. This normally means the https schema has been used. - */ - boolean isIntegral(Request request); - - /* ------------------------------------------------------------ */ - /** - * @return The port to use when redirecting a request if a data constraint of confidential is - * required. See {@link org.eclipse.jetty.util.security.Constraint#getDataConstraint()} - */ - int getConfidentialPort(); - - - /* ------------------------------------------------------------ */ - /** - * @return The schema to use when redirecting a request if a data constraint of confidential is - * required. See {@link org.eclipse.jetty.util.security.Constraint#getDataConstraint()} - */ - String getConfidentialScheme(); - - /* ------------------------------------------------------------ */ - /** - * @param request A request - * @return true if the request is confidential. This normally means the https schema has been used. - */ - boolean isConfidential(Request request); - - /* ------------------------------------------------------------ */ - /** Customize a request for an endpoint. - * Called on every request to allow customization of the request for - * the particular endpoint (eg security properties from a SSL connection). - * @param request - * @throws IOException - */ - void customize(Request request) throws IOException; - - /* ------------------------------------------------------------ */ - /** Persist an endpoint. - * Called after every request if the connection is to remain open. - * @param endpoint - * @throws IOException - */ - void persist(EndPoint endpoint) throws IOException; + ByteBufferPool getByteBufferPool(); /* ------------------------------------------------------------ */ /** @@ -128,21 +63,6 @@ public interface Connector extends LifeCycle /* ------------------------------------------------------------ */ /** - * Set the hostname of the interface to bind to. - * @param hostname The hostname representing the interface to which - * this connector will bind, or null for all interfaces. - */ - void setHost(String hostname); - - /* ------------------------------------------------------------ */ - /** - * @param port The port fto listen of for connections or 0 if any available - * port may be used. - */ - void setPort(int port); - - /* ------------------------------------------------------------ */ - /** * @return The configured port for the connector or 0 if any available * port may be used. */ @@ -161,124 +81,144 @@ public interface Connector extends LifeCycle */ int getMaxIdleTime(); - /** - * @param ms Max Idle time for connections in milliseconds - */ - void setMaxIdleTime(int ms); - /* ------------------------------------------------------------ */ /** * @return the underlying socket, channel, buffer etc. for the connector. */ Object getConnection(); - - - /* ------------------------------------------------------------ */ - /** - * @return true if names resolution should be done. - */ - boolean getResolveNames(); - - - - /* ------------------------------------------------------------ */ - /** - * @return Get the number of requests handled by this connector - * since last call of statsReset(). If setStatsOn(false) then this - * is undefined. - */ - public int getRequests(); - - /* ------------------------------------------------------------ */ - /** - * @return Returns the connectionsDurationTotal. - */ - public long getConnectionsDurationTotal(); - - /* ------------------------------------------------------------ */ - /** - * @return Number of connections accepted by the server since - * statsReset() called. Undefined if setStatsOn(false). - */ - public int getConnections() ; - - /* ------------------------------------------------------------ */ - /** - * @return Number of connections currently open that were opened - * since statsReset() called. Undefined if setStatsOn(false). - */ - public int getConnectionsOpen() ; - - /* ------------------------------------------------------------ */ - /** - * @return Maximum number of connections opened simultaneously - * since statsReset() called. Undefined if setStatsOn(false). - */ - public int getConnectionsOpenMax() ; - - /* ------------------------------------------------------------ */ - /** - * @return Maximum duration in milliseconds of an open connection - * since statsReset() called. Undefined if setStatsOn(false). - */ - public long getConnectionsDurationMax(); - /* ------------------------------------------------------------ */ - /** - * @return Mean duration in milliseconds of open connections - * since statsReset() called. Undefined if setStatsOn(false). - */ - public double getConnectionsDurationMean() ; - - /* ------------------------------------------------------------ */ - /** - * @return Standard deviation of duration in milliseconds of - * open connections since statsReset() called. Undefined if - * setStatsOn(false). - */ - public double getConnectionsDurationStdDev() ; - - /* ------------------------------------------------------------ */ - /** - * @return Mean number of requests per connection - * since statsReset() called. Undefined if setStatsOn(false). - */ - public double getConnectionsRequestsMean() ; - - /* ------------------------------------------------------------ */ - /** - * @return Standard Deviation of number of requests per connection - * since statsReset() called. Undefined if setStatsOn(false). - */ - public double getConnectionsRequestsStdDev() ; - - /* ------------------------------------------------------------ */ - /** - * @return Maximum number of requests per connection - * since statsReset() called. Undefined if setStatsOn(false). - */ - public int getConnectionsRequestsMax(); - - /* ------------------------------------------------------------ */ - /** Reset statistics. - */ - public void statsReset(); - - /* ------------------------------------------------------------ */ - public void setStatsOn(boolean on); /* ------------------------------------------------------------ */ - /** - * @return True if statistics collection is turned on. - */ - public boolean getStatsOn(); - - /* ------------------------------------------------------------ */ - /** - * @return Timestamp stats were started at. - */ - public long getStatsOnMs(); - - + Statistics getStatistics(); + + + interface Statistics extends LifeCycle + { + /* ------------------------------------------------------------ */ + /** + * @return True if statistics collection is turned on. + */ + boolean getStatsOn(); + + /* ------------------------------------------------------------ */ + /** Reset statistics. + */ + void statsReset(); + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of messages received by this connector + * since last call of statsReset(). If setStatsOn(false) then this + * is undefined. + */ + public int getMessagesIn(); + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of messages sent by this connector + * since last call of statsReset(). If setStatsOn(false) then this + * is undefined. + */ + public int getMessagesOut(); + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of bytes received by this connector + * since last call of statsReset(). If setStatsOn(false) then this + * is undefined. + */ + public int getBytesIn(); + + /* ------------------------------------------------------------ */ + /** + * @return Get the number of bytes sent by this connector + * since last call of statsReset(). If setStatsOn(false) then this + * is undefined. + */ + public int getBytesOut(); + + /* ------------------------------------------------------------ */ + /** + * @return Returns the connectionsDurationTotal. + */ + public long getConnectionsDurationTotal(); + + /* ------------------------------------------------------------ */ + /** + * @return Number of connections accepted by the server since + * statsReset() called. Undefined if setStatsOn(false). + */ + public int getConnections() ; + + /* ------------------------------------------------------------ */ + /** + * @return Number of connections currently open that were opened + * since statsReset() called. Undefined if setStatsOn(false). + */ + public int getConnectionsOpen() ; + + /* ------------------------------------------------------------ */ + /** + * @return Maximum number of connections opened simultaneously + * since statsReset() called. Undefined if setStatsOn(false). + */ + public int getConnectionsOpenMax() ; + + /* ------------------------------------------------------------ */ + /** + * @return Maximum duration in milliseconds of an open connection + * since statsReset() called. Undefined if setStatsOn(false). + */ + public long getConnectionsDurationMax(); + + /* ------------------------------------------------------------ */ + /** + * @return Mean duration in milliseconds of open connections + * since statsReset() called. Undefined if setStatsOn(false). + */ + public double getConnectionsDurationMean() ; + + /* ------------------------------------------------------------ */ + /** + * @return Standard deviation of duration in milliseconds of + * open connections since statsReset() called. Undefined if + * setStatsOn(false). + */ + public double getConnectionsDurationStdDev() ; + + /* ------------------------------------------------------------ */ + /** + * @return Mean number of messages received per connection + * since statsReset() called. Undefined if setStatsOn(false). + */ + public double getConnectionsMessagesInMean() ; + + /* ------------------------------------------------------------ */ + /** + * @return Standard Deviation of number of messages received per connection + * since statsReset() called. Undefined if setStatsOn(false). + */ + public double getConnectionsMessagesInStdDev() ; + + /* ------------------------------------------------------------ */ + /** + * @return Maximum number of messages received per connection + * since statsReset() called. Undefined if setStatsOn(false). + */ + public int getConnectionsMessagesInMax(); + + /* ------------------------------------------------------------ */ + /** + * @return Timestamp stats were started at. + */ + public long getStatsOnMs(); + + void connectionOpened(); + + void connectionUpgraded(long duration, int requests, int requests2); + + void connectionClosed(long duration, int requests, int requests2); + + } } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java index 1ea53843fe..419c2c9217 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpChannel.java @@ -341,7 +341,7 @@ public abstract class HttpChannel if (_async.isInitial()) { _request.setDispatcherType(DispatcherType.REQUEST); - getConnector().customize(_request); + getHttpConnector().customize(_request); server.handle(this); } else @@ -837,9 +837,8 @@ public abstract class HttpChannel } } - - public abstract Connector getConnector(); + public abstract HttpConnector getHttpConnector(); public abstract long getMaxIdleTime(); diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java index cfc55214ae..e468e945c4 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConnection.java @@ -50,7 +50,7 @@ public class HttpConnection extends AbstractAsyncConnection private final Lock _lock = new ReentrantLock(); private final Server _server; - private final Connector _connector; + private final HttpConnector _connector; private final HttpParser _parser; private final HttpGenerator _generator; private final HttpChannel _channel; @@ -81,11 +81,11 @@ public class HttpConnection extends AbstractAsyncConnection /** Constructor * */ - public HttpConnection(Connector connector, AsyncEndPoint endpoint, Server server) + public HttpConnection(HttpConnector connector, AsyncEndPoint endpoint, Server server) { super(endpoint); _connector = connector; - _bufferPool=_connector.getBufferPool(); + _bufferPool=_connector.getByteBufferPool(); _server = server; @@ -611,7 +611,7 @@ public class HttpConnection extends AbstractAsyncConnection } @Override - public Connector getConnector() + public HttpConnector getHttpConnector() { return _connector; } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java index e30ad553bf..8ef86a9f87 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java @@ -1370,7 +1370,7 @@ public class Request implements HttpServletRequest @Override public boolean isSecure() { - return _channel.getConnector().isConfidential(this); + return _channel.getHttpConnector().isConfidential(this); } /* ------------------------------------------------------------ */ diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java index 9dfe46a07a..6c2a0d9d8f 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Server.java @@ -94,7 +94,7 @@ public class Server extends HandlerWrapper implements Attributes { setServer(this); - Connector connector=new SelectChannelConnector(); + SelectChannelConnector connector=new SelectChannelConnector(); connector.setPort(port); setConnectors(new Connector[]{connector}); } @@ -107,7 +107,7 @@ public class Server extends HandlerWrapper implements Attributes { setServer(this); - Connector connector=new SelectChannelConnector(); + SelectChannelConnector connector=new SelectChannelConnector(); connector.setHost(addr.getHostName()); connector.setPort(addr.getPort()); setConnectors(new Connector[]{connector}); @@ -180,7 +180,11 @@ public class Server extends HandlerWrapper implements Attributes if (connectors!=null) { for (int i=0;i<connectors.length;i++) - connectors[i].setServer(this); + { + // TODO review + if (connectors[i] instanceof AbstractConnector) + ((AbstractConnector)connectors[i]).setServer(this); + } } _container.update(this, _connectors, connectors, "connector"); @@ -474,18 +478,6 @@ public class Server extends HandlerWrapper implements Attributes _maxCookieVersion = maxCookieVersion; } - /* ------------------------------------------------------------ */ - /** - * Add a LifeCycle object to be started/stopped - * along with the Server. - * @deprecated Use {@link #addBean(Object)} - * @param c - */ - @Deprecated - public void addLifeCycle (LifeCycle c) - { - addBean(c); - } /* ------------------------------------------------------------ */ /** @@ -507,17 +499,6 @@ public class Server extends HandlerWrapper implements Attributes return false; } - /** - * Remove a LifeCycle object to be started/stopped - * along with the Server - * @deprecated Use {@link #removeBean(Object)} - */ - @Deprecated - public void removeLifeCycle (LifeCycle c) - { - removeBean(c); - } - /* ------------------------------------------------------------ */ /** * Remove an associated bean. @@ -537,8 +518,12 @@ public class Server extends HandlerWrapper implements Attributes /* * @see org.eclipse.util.AttributesMap#clearAttributes() */ + @Override public void clearAttributes() { + Enumeration names = _attributes.getAttributeNames(); + while (names.hasMoreElements()) + removeBean(_attributes.getAttribute((String)names.nextElement())); _attributes.clearAttributes(); } @@ -546,6 +531,7 @@ public class Server extends HandlerWrapper implements Attributes /* * @see org.eclipse.util.AttributesMap#getAttribute(java.lang.String) */ + @Override public Object getAttribute(String name) { return _attributes.getAttribute(name); @@ -555,6 +541,7 @@ public class Server extends HandlerWrapper implements Attributes /* * @see org.eclipse.util.AttributesMap#getAttributeNames() */ + @Override public Enumeration getAttributeNames() { return AttributesMap.getAttributeNamesCopy(_attributes); @@ -564,8 +551,12 @@ public class Server extends HandlerWrapper implements Attributes /* * @see org.eclipse.util.AttributesMap#removeAttribute(java.lang.String) */ + @Override public void removeAttribute(String name) { + Object bean=_attributes.getAttribute(name); + if (bean!=null) + removeBean(bean); _attributes.removeAttribute(name); } @@ -573,8 +564,10 @@ public class Server extends HandlerWrapper implements Attributes /* * @see org.eclipse.util.AttributesMap#setAttribute(java.lang.String, java.lang.Object) */ + @Override public void setAttribute(String name, Object attribute) { + addBean(attribute); _attributes.setAttribute(name, attribute); } @@ -617,7 +610,6 @@ public class Server extends HandlerWrapper implements Attributes dump(out,indent,TypeUtil.asList(getHandlers()),getBeans(),TypeUtil.asList(_connectors)); } - /* ------------------------------------------------------------ */ public boolean isUncheckedPrintWriter() { @@ -630,7 +622,6 @@ public class Server extends HandlerWrapper implements Attributes _uncheckedPrintWriter=unchecked; } - /* ------------------------------------------------------------ */ /* A handler that can be gracefully shutdown. * Called by doStop if a {@link #setGracefulShutdown} period is set. diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java index 31e8c94a9d..ab6303feef 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java @@ -878,7 +878,7 @@ public class ContextHandler extends ScopedHandler implements Attributes, Server. // Check the connector if (_connectors != null && _connectors.size() > 0) { - String connector = HttpChannel.getCurrentHttpChannel().getConnector().getName(); + String connector = HttpChannel.getCurrentHttpChannel().getHttpConnector().getName(); if (connector == null || !_connectors.contains(connector)) return false; } diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/nio/AbstractNIOConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/nio/AbstractNIOConnector.java deleted file mode 100644 index 8192bd9862..0000000000 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/nio/AbstractNIOConnector.java +++ /dev/null @@ -1,47 +0,0 @@ -// ======================================================================== -// Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd. -// ------------------------------------------------------------------------ -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// and Apache License v2.0 which accompanies this distribution. -// The Eclipse Public License is available at -// http://www.eclipse.org/legal/epl-v10.html -// The Apache License v2.0 is available at -// http://www.opensource.org/licenses/apache2.0.php -// You may elect to redistribute this code under either of these licenses. -// ======================================================================== - -/** - * - */ -package org.eclipse.jetty.server.nio; - -import org.eclipse.jetty.server.AbstractConnector; - -public abstract class AbstractNIOConnector extends AbstractConnector implements NIOConnector -{ - public AbstractNIOConnector() - { - _buffers.setRequestBufferType(Type.DIRECT); - _buffers.setRequestHeaderType(Type.INDIRECT); - _buffers.setResponseBufferType(Type.DIRECT); - _buffers.setResponseHeaderType(Type.INDIRECT); - } - - /* ------------------------------------------------------------------------------- */ - public boolean getUseDirectBuffers() - { - return getRequestBufferType()==Type.DIRECT; - } - - /* ------------------------------------------------------------------------------- */ - /** - * @param direct If True (the default), the connector can use NIO direct buffers. - * Some JVMs have memory management issues (bugs) with direct buffers. - */ - public void setUseDirectBuffers(boolean direct) - { - _buffers.setRequestBufferType(direct?Type.DIRECT:Type.INDIRECT); - _buffers.setResponseBufferType(direct?Type.DIRECT:Type.INDIRECT); - } -} diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/nio/SelectChannelConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/nio/SelectChannelConnector.java index d288814984..c9f735e544 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/nio/SelectChannelConnector.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/nio/SelectChannelConnector.java @@ -26,6 +26,7 @@ import org.eclipse.jetty.io.AsyncEndPoint; import org.eclipse.jetty.io.SelectChannelEndPoint; import org.eclipse.jetty.io.SelectorManager; import org.eclipse.jetty.io.SelectorManager.SelectSet; +import org.eclipse.jetty.server.AbstractHttpConnector; import org.eclipse.jetty.server.HttpConnection; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.util.thread.ThreadPool; @@ -56,7 +57,7 @@ import org.eclipse.jetty.util.thread.ThreadPool; * * @org.apache.xbean.XBean element="nioConnector" description="Creates an NIO based socket connector" */ -public class SelectChannelConnector extends AbstractNIOConnector +public class SelectChannelConnector extends AbstractHttpConnector { protected ServerSocketChannel _acceptChannel; private int _lowResourcesConnections; @@ -198,32 +199,6 @@ public class SelectChannelConnector extends AbstractNIOConnector } /* ------------------------------------------------------------ */ - /** - * @return the lowResourcesMaxIdleTime - */ - @Override - public int getLowResourcesMaxIdleTime() - { - return _lowResourcesMaxIdleTime; - } - - /* ------------------------------------------------------------ */ - /** - * Set the period in ms that a connection is allowed to be idle when this there are more - * than {@link #getLowResourcesConnections()} connections. This allows the server to rapidly close idle connections - * in order to gracefully handle high load situations. - * @param lowResourcesMaxIdleTime the period in ms that a connection is allowed to be idle when resources are low. - * @see #setMaxIdleTime(int) - */ - @Override - public void setLowResourcesMaxIdleTime(int lowResourcesMaxIdleTime) - { - _lowResourcesMaxIdleTime=lowResourcesMaxIdleTime; - super.setLowResourcesMaxIdleTime(lowResourcesMaxIdleTime); - } - - - /* ------------------------------------------------------------ */ /* * @see org.eclipse.jetty.server.server.AbstractConnector#doStart() */ @@ -232,8 +207,6 @@ public class SelectChannelConnector extends AbstractNIOConnector { _manager.setSelectSets(getAcceptors()); _manager.setMaxIdleTime(getMaxIdleTime()); - _manager.setLowResourcesConnections(getLowResourcesConnections()); - _manager.setLowResourcesMaxIdleTime(getLowResourcesMaxIdleTime()); super.doStart(); } @@ -249,7 +222,7 @@ public class SelectChannelConnector extends AbstractNIOConnector /* ------------------------------------------------------------------------------- */ protected void endPointClosed(AsyncEndPoint endpoint) { - connectionClosed(endpoint.getSelectableConnection()); + connectionClosed(endpoint.getAsyncConnection()); } /* ------------------------------------------------------------------------------- */ @@ -283,13 +256,13 @@ public class SelectChannelConnector extends AbstractNIOConnector protected void endPointOpened(SelectChannelEndPoint endpoint) { // TODO handle max connections and low resources - connectionOpened(endpoint.getSelectableConnection()); + connectionOpened(endpoint.getAsyncConnection()); } @Override protected void endPointUpgraded(SelectChannelEndPoint endpoint, AsyncConnection oldConnection) { - connectionUpgraded(oldConnection,endpoint.getSelectableConnection()); + connectionUpgraded(oldConnection,endpoint.getAsyncConnection()); } @Override diff --git a/jetty-spdy/spdy-jetty-http/src/main/java/org/eclipse/jetty/spdy/http/ServerHTTPSPDYAsyncConnection.java b/jetty-spdy/spdy-jetty-http/src/main/java/org/eclipse/jetty/spdy/http/ServerHTTPSPDYAsyncConnection.java index c5e7b707ff..3992d74845 100644 --- a/jetty-spdy/spdy-jetty-http/src/main/java/org/eclipse/jetty/spdy/http/ServerHTTPSPDYAsyncConnection.java +++ b/jetty-spdy/spdy-jetty-http/src/main/java/org/eclipse/jetty/spdy/http/ServerHTTPSPDYAsyncConnection.java @@ -418,7 +418,7 @@ public class ServerHTTPSPDYAsyncConnection extends AbstractHttpConnection implem @Override public void completed(Stream pushStream) { - Synchronous pushConnection = new Synchronous(getConnector(), getEndPoint(), getServer(), connection, pushStrategy, pushStream); + Synchronous pushConnection = new Synchronous(getHttpConnector(), getEndPoint(), getServer(), connection, pushStrategy, pushStream); pushConnection.beginRequest(pushHeaders, true); } }); |