diff --git a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
index f5897a5ff8f..a284add2dcc 100644
--- a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
+++ b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/LikeJettyXml.java
@@ -22,6 +22,8 @@ import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpServerConnectionFactory;
import org.eclipse.jetty.server.NCSARequestLog;
import org.eclipse.jetty.server.SelectChannelConnector;
import org.eclipse.jetty.server.Server;
@@ -44,7 +46,7 @@ public class LikeJettyXml
// Setup Threadpool
QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setMaxThreads(500);
-
+
Server server = new Server(threadPool);
server.manage(threadPool);
server.setDumpAfterStart(true);
@@ -61,33 +63,35 @@ public class LikeJettyXml
SelectChannelConnector connector = new SelectChannelConnector(server);
connector.setPort(8080);
connector.setIdleTimeout(30000);
- connector.getConnectionFactory().getHttpConfig().setConfidentialPort(8443);
+ HttpConfiguration httpConfiguration = new HttpConfiguration(null, false);
+ httpConfiguration.setConfidentialPort(8443);
+ connector.setDefaultConnectionFactory(new HttpServerConnectionFactory(connector, httpConfiguration));
// TODO connector.setStatsOn(false);
server.setConnectors(new Connector[]
{ connector });
- SelectChannelConnector ssl_connector = new SelectChannelConnector(server,true);
- ssl_connector.setPort(8443);
- SslContextFactory cf = ssl_connector.getConnectionFactory().getSslContextFactory();
- cf.setKeyStorePath(jetty_home + "/etc/keystore");
- cf.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
- cf.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
- cf.setTrustStore(jetty_home + "/etc/keystore");
- cf.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
- cf.setExcludeCipherSuites(
- new String[] {
- "SSL_RSA_WITH_DES_CBC_SHA",
- "SSL_DHE_RSA_WITH_DES_CBC_SHA",
- "SSL_DHE_DSS_WITH_DES_CBC_SHA",
- "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
- "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
- "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
- "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
+ SslContextFactory sslContextFactory = new SslContextFactory();
+ sslContextFactory.setKeyStorePath(jetty_home + "/etc/keystore");
+ sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
+ sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
+ sslContextFactory.setTrustStore(jetty_home + "/etc/keystore");
+ sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
+ sslContextFactory.setExcludeCipherSuites(
+ new String[]{
+ "SSL_RSA_WITH_DES_CBC_SHA",
+ "SSL_DHE_RSA_WITH_DES_CBC_SHA",
+ "SSL_DHE_DSS_WITH_DES_CBC_SHA",
+ "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
+ "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
+ "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
+ "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
});
- // TODO ssl_connector.setStatsOn(false);
- server.addConnector(ssl_connector);
- ssl_connector.open();
+ SelectChannelConnector sslConnector = new SelectChannelConnector(server,sslContextFactory);
+ sslConnector.setPort(8443);
+ // TODO sslConnector.setStatsOn(false);
+ server.addConnector(sslConnector);
+ sslConnector.open();
HandlerCollection handlers = new HandlerCollection();
ContextHandlerCollection contexts = new ContextHandlerCollection();
diff --git a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java
index ddf5a79902e..6017520bcbb 100644
--- a/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java
+++ b/example-jetty-embedded/src/main/java/org/eclipse/jetty/embedded/ManyConnectors.java
@@ -38,17 +38,17 @@ public class ManyConnectors
connector1.setPort(8888);
connector1.setName("admin");
- SelectChannelConnector ssl_connector = new SelectChannelConnector(server,true);
String jetty_home = System.getProperty("jetty.home","../jetty-distribution/target/distribution");
- System.setProperty("jetty.home",jetty_home);
- ssl_connector.setPort(8443);
- SslContextFactory cf = ssl_connector.getConnectionFactory().getSslContextFactory();
- cf.setKeyStorePath(jetty_home + "/etc/keystore");
- cf.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
- cf.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
+ System.setProperty("jetty.home", jetty_home);
+ SslContextFactory sslContextFactory = new SslContextFactory();
+ sslContextFactory.setKeyStorePath(jetty_home + "/etc/keystore");
+ sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
+ sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
+ SelectChannelConnector sslConnector = new SelectChannelConnector(server,sslContextFactory);
+ sslConnector.setPort(8443);
server.setConnectors(new Connector[]
- { connector0, connector1, ssl_connector });
+ { connector0, connector1, sslConnector });
server.setHandler(new HelloHandler());
diff --git a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/test/XmlConfiguredJetty.java b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/test/XmlConfiguredJetty.java
index 395805c151d..9b8abcc23d3 100644
--- a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/test/XmlConfiguredJetty.java
+++ b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/test/XmlConfiguredJetty.java
@@ -36,6 +36,7 @@ import org.eclipse.jetty.deploy.DeploymentManager;
import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.NetworkConnector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
@@ -65,7 +66,7 @@ public class XmlConfiguredJetty
Properties properties = new Properties();
String jettyHomeBase = testdir.getDir().getAbsolutePath();
- // Ensure we have a new (pristene) directory to work with.
+ // Ensure we have a new (pristene) directory to work with.
int idx = 0;
_jettyHome = new File(jettyHomeBase + "#" + idx);
while (_jettyHome.exists())
@@ -412,9 +413,9 @@ public class XmlConfiguredJetty
Connector connectors[] = _server.getConnectors();
for (int i = 0; _serverPort<0 && i < connectors.length; i++)
{
- if (connectors[i] instanceof Connector.NetConnector)
+ if (connectors[i] instanceof NetworkConnector)
{
- int port = ((Connector.NetConnector)connectors[i]).getLocalPort();
+ int port = ((NetworkConnector)connectors[i]).getLocalPort();
if (port>0)
_serverPort=port;
}
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointInterestsTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointInterestsTest.java
index a5dbb8315f9..7b31765e5dd 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointInterestsTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointInterestsTest.java
@@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
@@ -86,7 +87,7 @@ public class SelectChannelEndPointInterestsTest
super.onOpen();
fillInterested();
}
-
+
@Override
public void onFillable()
{
@@ -98,6 +99,19 @@ public class SelectChannelEndPointInterestsTest
selectorManager.start();
}
+ @After
+ public void destroy() throws Exception
+ {
+ if (selectorManager != null)
+ selectorManager.stop();
+ if (connector != null)
+ connector.close();
+ if (scheduler != null)
+ scheduler.shutdownNow();
+ if (threadPool != null)
+ threadPool.stop();
+ }
+
@Test
public void testReadBlockedThenWriteBlockedThenReadableThenWritable() throws Exception
{
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointSslTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointSslTest.java
index d79845914d2..002173895d4 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointSslTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/SelectChannelEndPointSslTest.java
@@ -1,11 +1,5 @@
package org.eclipse.jetty.io;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
@@ -13,7 +7,6 @@ import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.concurrent.TimeUnit;
-
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLEngineResult;
import javax.net.ssl.SSLEngineResult.HandshakeStatus;
@@ -28,6 +21,12 @@ import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
public class SelectChannelEndPointSslTest extends SelectChannelEndPointTest
{
@@ -55,7 +54,7 @@ public class SelectChannelEndPointSslTest extends SelectChannelEndPointTest
@Override
protected Connection newConnection(SocketChannel channel, EndPoint endpoint)
{
- SSLEngine engine = __sslCtxFactory.newSslEngine();
+ SSLEngine engine = __sslCtxFactory.newSSLEngine();
engine.setUseClientMode(false);
SslConnection sslConnection = new SslConnection(__byteBufferPool, _threadPool, endpoint, engine);
@@ -94,7 +93,7 @@ public class SelectChannelEndPointSslTest extends SelectChannelEndPointTest
server.configureBlocking(false);
_manager.accept(server);
- SSLEngine engine = __sslCtxFactory.newSslEngine();
+ SSLEngine engine = __sslCtxFactory.newSSLEngine();
engine.setUseClientMode(true);
engine.beginHandshake();
@@ -263,8 +262,8 @@ public class SelectChannelEndPointSslTest extends SelectChannelEndPointTest
@Test
public void checkSslEngineBehaviour() throws Exception
{
- SSLEngine server = __sslCtxFactory.newSslEngine();
- SSLEngine client = __sslCtxFactory.newSslEngine();
+ SSLEngine server = __sslCtxFactory.newSSLEngine();
+ SSLEngine client = __sslCtxFactory.newSSLEngine();
ByteBuffer netC2S = ByteBuffer.allocate(server.getSession().getPacketBufferSize());
ByteBuffer netS2C = ByteBuffer.allocate(server.getSession().getPacketBufferSize());
diff --git a/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java b/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java
index fcc9c4d73ee..0a11e8904df 100644
--- a/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java
+++ b/jetty-io/src/test/java/org/eclipse/jetty/io/SslConnectionTest.java
@@ -13,12 +13,10 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
-
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLSocket;
import junit.framework.Assert;
-
import org.eclipse.jetty.io.ssl.SslConnection;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.eclipse.jetty.util.BufferUtil;
@@ -52,7 +50,7 @@ public class SslConnectionTest
@Override
public Connection newConnection(SocketChannel channel, EndPoint endpoint, Object attachment)
{
- SSLEngine engine = __sslCtxFactory.newSslEngine();
+ SSLEngine engine = __sslCtxFactory.newSSLEngine();
engine.setUseClientMode(false);
SslConnection sslConnection = new SslConnection(__byteBufferPool, _threadPool, endpoint, engine);
@@ -120,7 +118,7 @@ public class SslConnectionTest
super.onOpen();
fillInterested();
}
-
+
@Override
public void onClose()
{
diff --git a/jetty-security/src/test/java/org/eclipse/jetty/security/DataConstraintsTest.java b/jetty-security/src/test/java/org/eclipse/jetty/security/DataConstraintsTest.java
index 1f1204549e4..d48a20e958b 100644
--- a/jetty-security/src/test/java/org/eclipse/jetty/security/DataConstraintsTest.java
+++ b/jetty-security/src/test/java/org/eclipse/jetty/security/DataConstraintsTest.java
@@ -13,12 +13,8 @@
package org.eclipse.jetty.security;
-import static org.junit.Assert.assertThat;
-import static org.junit.matchers.JUnitMatchers.containsString;
-
import java.io.IOException;
import java.util.Arrays;
-
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -28,6 +24,7 @@ import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.security.authentication.BasicAuthenticator;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpServerConnectionFactory;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
@@ -40,6 +37,9 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import static org.junit.Assert.assertThat;
+import static org.junit.matchers.JUnitMatchers.containsString;
+
/**
* @version $Revision: 1441 $ $Date: 2010-04-02 12:28:17 +0200 (Fri, 02 Apr 2010) $
*/
@@ -57,12 +57,15 @@ public class DataConstraintsTest
_server = new Server();
_connector = new LocalConnector(_server);
_connector.setIdleTimeout(300000);
- _connector.getConnectionFactory().getHttpConfig().setIntegralPort(9998);
- _connector.getConnectionFactory().getHttpConfig().setIntegralScheme("FTP");
- _connector.getConnectionFactory().getHttpConfig().setConfidentialPort(9999);
- _connector.getConnectionFactory().getHttpConfig().setConfidentialScheme("SPDY");
- _connectorS = new LocalConnector(_server,
- new HttpConfiguration(null,false)
+ HttpConfiguration httpConfiguration = new HttpConfiguration(null, false);
+ httpConfiguration.setIntegralPort(9998);
+ httpConfiguration.setIntegralScheme("FTP");
+ httpConfiguration.setConfidentialPort(9999);
+ httpConfiguration.setConfidentialScheme("SPDY");
+ _connector.setDefaultConnectionFactory(new HttpServerConnectionFactory(_connector, httpConfiguration));
+
+ _connectorS = new LocalConnector(_server);
+ _connectorS.setDefaultConnectionFactory(new HttpServerConnectionFactory(_connectorS, new HttpConfiguration(null,false)
{
@Override
public void customize(Request request) throws IOException
@@ -83,7 +86,7 @@ public class DataConstraintsTest
{
return true;
}
- });
+ }));
_server.setConnectors(new Connector[]{_connector,_connectorS});
ContextHandler _context = new ContextHandler();
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 dc9facc845f..56f73ea798d 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
@@ -15,19 +15,16 @@ package org.eclipse.jetty.server;
import java.io.IOException;
import java.net.Socket;
+import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
-import javax.net.ssl.SSLEngine;
-
-import org.eclipse.jetty.io.Connection;
-import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.StandardByteBufferPool;
-import org.eclipse.jetty.io.ssl.SslConnection;
-import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.component.AggregateLifeCycle;
import org.eclipse.jetty.util.component.Dumpable;
import org.eclipse.jetty.util.log.Log;
@@ -35,49 +32,39 @@ import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.ssl.SslContextFactory;
/**
- * Abstract Connector implementation. This abstract implementation of the Connector interface provides:
- *
- *
AbstractLifeCycle implementation
- *
Implementations for connector getters and setters
- *
Buffer management
- *
Socket configuration
- *
Base acceptor thread
- *
Optional reverse proxy headers checking
- *
+ *
Partial implementation of {@link Connector}
*/
public abstract class AbstractConnector extends AggregateLifeCycle implements Connector, Dumpable
{
- protected final Logger LOG = Log.getLogger(getClass());
-
+ protected final Logger logger = Log.getLogger(getClass());
+ // Order is important on server side, so we use a LinkedHashMap
+ private final Map factories = new LinkedHashMap<>();
private final Statistics _stats = new ConnectionStatistics();
- private final ConnectionFactory _connectionFactory;
- private final Thread[] _acceptors;
+ private final Server _server;
+ private final SslContextFactory _sslContextFactory;
private final Executor _executor;
private final ScheduledExecutorService _scheduler;
- private final Server _server;
private final ByteBufferPool _byteBufferPool;
-
+ private final Thread[] _acceptors;
private volatile String _name;
- private volatile int _acceptQueueSize = 128;
- private volatile boolean _reuseAddress = true;
private volatile long _idleTimeout = 200000;
- private volatile int _soLingerTime = -1;
+ private volatile ConnectionFactory defaultConnectionFactory;
- /* ------------------------------------------------------------ */
/**
* @param server The server this connector will be added to. Must not be null.
- * @param connectionFactory ConnectionFactory or null for default
- * @param executor An executor for this connector or null to use the servers executor
+ * @param executor An executor for this connector or null to use the servers executor
* @param scheduler A scheduler for this connector or null to use the servers scheduler
* @param pool A buffer pool for this connector or null to use a default {@link ByteBufferPool}
+ * @param sslContextFactory the SSL context factory to make this connector SSL enabled, or null
* @param acceptors the number of acceptor threads to use, or 0 for a default value.
*/
public AbstractConnector(
- Server server,
- ConnectionFactory connectionFactory,
- Executor executor,
- ScheduledExecutorService scheduler,
- ByteBufferPool pool, int acceptors)
+ Server server,
+ Executor executor,
+ ScheduledExecutorService scheduler,
+ ByteBufferPool pool,
+ SslContextFactory sslContextFactory,
+ int acceptors)
{
_server=server;
_executor=executor!=null?executor:_server.getThreadPool();
@@ -86,23 +73,22 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co
@Override
public Thread newThread(Runnable r)
{
- return new Thread(r, "Timer-" + getName());
+ return new Thread(r, "Scheduler-" + getName());
}
});
_byteBufferPool = pool!=null?pool:new StandardByteBufferPool();
-
- _connectionFactory=connectionFactory!=null?connectionFactory:new ConnectionFactory();
-
+ _sslContextFactory = sslContextFactory;
+
addBean(_server,false);
addBean(_executor,false);
addBean(_scheduler,scheduler==null);
addBean(_byteBufferPool,pool==null);
- addBean(_connectionFactory,connectionFactory!=null);
+ addBean(_sslContextFactory,true);
if (acceptors<=0)
acceptors=Math.max(1,(Runtime.getRuntime().availableProcessors()) / 4);
if (acceptors > 2 * Runtime.getRuntime().availableProcessors())
- LOG.warn("Acceptors should be <= 2*availableProcessors: " + this);
+ logger.warn("Acceptors should be <= 2*availableProcessors: " + this);
_acceptors = new Thread[acceptors];
}
@@ -117,13 +103,7 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co
{
return _server;
}
-
- @Override
- public ConnectionFactory getConnectionFactory()
- {
- return _connectionFactory;
- }
-
+
@Override
public Executor getExecutor()
{
@@ -136,9 +116,11 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co
return _byteBufferPool;
}
- /**
- * @return Returns the maxIdleTime.
- */
+ public SslContextFactory getSslContextFactory()
+ {
+ return _sslContextFactory;
+ }
+
@Override
public long getIdleTimeout()
{
@@ -146,52 +128,23 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co
}
/**
- * Set the maximum Idle time for a connection, which roughly translates to the {@link Socket#setSoTimeout(int)} call, although with NIO implementations
- * other mechanisms may be used to implement the timeout. The max idle time is applied:
+ *
Sets the maximum Idle time for a connection, which roughly translates to the {@link Socket#setSoTimeout(int)}
+ * call, although with NIO implementations other mechanisms may be used to implement the timeout.
+ *
The max idle time is applied:
*
- *
When waiting for a new request to be received on a connection
- *
When reading the headers and content of a request
- *
When writing the headers and content of a response
+ *
When waiting for a new message to be received on a connection
+ *
When waiting for a new message to be sent on a connection
*
- * Jetty interprets this value as the maximum time between some progress being made on the connection. So if a single byte is read or written, then the
- * timeout (if implemented by jetty) is reset. However, in many instances, the reading/writing is delegated to the JVM, and the semantic is more strictly
- * enforced as the maximum time a single read/write operation can take. Note, that as Jetty supports writes of memory mapped file buffers, then a write may
- * take many 10s of seconds for large content written to a slow device.
- *
- * Previously, Jetty supported separate idle timeouts and IO operation timeouts, however the expense of changing the value of soTimeout was significant, so
- * these timeouts were merged. With the advent of NIO, it may be possible to again differentiate these values (if there is demand).
+ *
This value is interpreted as the maximum time between some progress being made on the connection.
+ * So if a single byte is read or written, then the timeout is reset.
*
- * @param idleTimeout The idleTimeout to set.
+ * @param idleTimeout the idle timeout
*/
public void setIdleTimeout(long idleTimeout)
{
_idleTimeout = idleTimeout;
}
- /**
- * @return Returns the soLingerTime.
- */
- public int getSoLingerTime()
- {
- return _soLingerTime;
- }
-
- /**
- * @return Returns the acceptQueueSize.
- */
- public int getAcceptQueueSize()
- {
- return _acceptQueueSize;
- }
-
- /**
- * @param acceptQueueSize The acceptQueueSize to set.
- */
- public void setAcceptQueueSize(int acceptQueueSize)
- {
- _acceptQueueSize = acceptQueueSize;
- }
-
/**
* @return Returns the number of acceptor threads.
*/
@@ -201,72 +154,100 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co
}
- /**
- * @param soLingerTime The soLingerTime to set or -1 to disable.
- */
- public void setSoLingerTime(int soLingerTime)
- {
- _soLingerTime = soLingerTime;
- }
-
@Override
protected void doStart() throws Exception
{
super.doStart();
- // Start selector thread
- synchronized (this)
- {
- for (int i = 0; i < _acceptors.length; i++)
- getExecutor().execute(new Acceptor(i));
- }
+ for (int i = 0; i < _acceptors.length; i++)
+ getExecutor().execute(new Acceptor(i));
- LOG.info("Started {}", this);
+ logger.info("Started {}", this);
}
@Override
protected void doStop() throws Exception
{
- super.doStop();
-
for (Thread thread : _acceptors)
{
if (thread != null)
thread.interrupt();
}
+
+ super.doStop();
+
+ logger.info("Stopped {}", this);
}
public void join() throws InterruptedException
{
- for (Thread thread : _acceptors)
- if (thread != null)
- thread.join();
+ join(0);
}
- protected void configure(Socket socket)
+ public void join(long timeout) throws InterruptedException
{
- try
- {
- socket.setTcpNoDelay(true);
- if (_soLingerTime >= 0)
- socket.setSoLinger(true, _soLingerTime / 1000);
- else
- socket.setSoLinger(false, 0);
- }
- catch (Exception e)
- {
- LOG.ignore(e);
- }
+ for (Thread thread : _acceptors)
+ if (thread != null)
+ thread.join(timeout);
}
protected abstract void accept(int acceptorID) throws IOException, InterruptedException;
- /* ------------------------------------------------------------ */
+ public ConnectionFactory getConnectionFactory(String protocol)
+ {
+ synchronized (factories)
+ {
+ return factories.get(protocol);
+ }
+ }
+
+ public ConnectionFactory putConnectionFactory(String protocol, ConnectionFactory factory)
+ {
+ synchronized (factories)
+ {
+ return factories.put(protocol, factory);
+ }
+ }
+
+ public ConnectionFactory removeConnectionFactory(String protocol)
+ {
+ synchronized (factories)
+ {
+ return factories.remove(protocol);
+ }
+ }
+
+ public Map getConnectionFactories()
+ {
+ synchronized (factories)
+ {
+ return new LinkedHashMap<>(factories);
+ }
+ }
+
+ public void clearConnectionFactories()
+ {
+ synchronized (factories)
+ {
+ factories.clear();
+ }
+ }
+
+ public ConnectionFactory getDefaultConnectionFactory()
+ {
+ return defaultConnectionFactory;
+ }
+
+ public void setDefaultConnectionFactory(ConnectionFactory defaultConnectionFactory)
+ {
+ this.defaultConnectionFactory = defaultConnectionFactory;
+ }
+
private class Acceptor implements Runnable
{
- int _acceptor = 0;
+ private final int _acceptor;
- Acceptor(int id)
+ private Acceptor(int id)
{
_acceptor = id;
}
@@ -275,22 +256,17 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co
public void run()
{
Thread current = Thread.currentThread();
- String name;
+ String name = current.getName();
+ current.setName(name + " Acceptor" + _acceptor + " " + AbstractConnector.this);
+
synchronized (AbstractConnector.this)
{
- if (!isRunning())
- return;
-
_acceptors[_acceptor] = current;
- name = _acceptors[_acceptor].getName();
- current.setName(name + " Acceptor" + _acceptor + " " + AbstractConnector.this);
}
- int old_priority = current.getPriority();
try
{
- current.setPriority(old_priority);
- while (isRunning() && getTransport() != null)
+ while (isRunning())
{
try
{
@@ -298,17 +274,16 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co
}
catch (IOException | InterruptedException e)
{
- LOG.ignore(e);
+ logger.ignore(e);
}
catch (Throwable e)
{
- LOG.warn(e);
+ logger.warn(e);
}
}
}
finally
{
- current.setPriority(old_priority);
current.setName(name);
synchronized (AbstractConnector.this)
@@ -350,22 +325,6 @@ public abstract class AbstractConnector extends AggregateLifeCycle implements Co
_stats.connectionClosed(duration, requests, requests);
}
- /**
- * @return True if the the server socket will be opened in SO_REUSEADDR mode.
- */
- public boolean getReuseAddress()
- {
- return _reuseAddress;
- }
-
- /**
- * @param reuseAddress True if the the server socket will be opened in SO_REUSEADDR mode.
- */
- public void setReuseAddress(boolean reuseAddress)
- {
- _reuseAddress = reuseAddress;
- }
-
public ScheduledExecutorService getScheduler()
{
return _scheduler;
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetworkConnector.java
similarity index 83%
rename from jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetConnector.java
rename to jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetworkConnector.java
index 96aee4a7500..4bb55203944 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNetworkConnector.java
@@ -20,14 +20,17 @@ import java.util.concurrent.ScheduledExecutorService;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.util.ssl.SslContextFactory;
-public abstract class AbstractNetConnector extends AbstractConnector implements Connector.NetConnector
+/**
+ *
Partial implementation of {@link NetworkConnector}.
+ */
+public abstract class AbstractNetworkConnector extends AbstractConnector implements NetworkConnector
{
private volatile String _host;
private volatile int _port = 0;
- public AbstractNetConnector(Server server, ConnectionFactory connectionFactory, Executor executor, ScheduledExecutorService scheduler, ByteBufferPool pool, int acceptors)
+ public AbstractNetworkConnector(Server server, Executor executor, ScheduledExecutorService scheduler, ByteBufferPool pool, SslContextFactory sslContextFactory, int acceptors)
{
- super(server,connectionFactory,executor,scheduler,pool, acceptors);
+ super(server, executor, scheduler, pool, sslContextFactory, acceptors);
}
public void setHost(String host)
@@ -74,14 +77,8 @@ public abstract class AbstractNetConnector extends AbstractConnector implements
@Override
protected void doStop() throws Exception
{
- try
- {
- close();
- }
- catch (IOException e)
- {
- LOG.warn(e);
- }
+ close();
+
super.doStop();
int i = getName().lastIndexOf("/");
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java
index 587ba965fc9..890a7f0cfe3 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionFactory.java
@@ -1,5 +1,5 @@
// ========================================================================
-// Copyright (c) 2004-2012 Mort Bay Consulting Pty. Ltd.
+// Copyright 2011-2012 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
@@ -13,80 +13,22 @@
package org.eclipse.jetty.server;
-import java.io.IOException;
-
-import javax.net.ssl.SSLEngine;
+import java.nio.channels.SocketChannel;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.ssl.SslConnection;
-import org.eclipse.jetty.util.component.AggregateLifeCycle;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-// TODO This is just a place holder for a real factory
-public class ConnectionFactory extends AggregateLifeCycle
+/**
+ *
Factory for {@link Connection}s.
+ */
+public interface ConnectionFactory
{
- private final boolean _ssl;
- private final SslContextFactory _sslContextFactory;
-
-
- // TODO Make this part of pluggable factory
- private final HttpConfiguration _httpConfig;
-
-
- ConnectionFactory()
- {
- this(null,false);
- }
-
- /* ------------------------------------------------------------ */
- /**
- * @param sslContextFactory An SslContextFactory to use or null if no ssl is required or to use default {@link SslContextFactory}
- * @param ssl If true, then new connections will assumed to be SSL. If false, connections can only become SSL if they upgrade and a SslContextFactory is passed.
+ /**
+ *
Creates a new {@link Connection} with the given parameters
+ * @param channel the {@link SocketChannel} associated with the connection
+ * @param endPoint the {@link EndPoint} associated with the connection
+ * @param attachment the attachment associated with the connection
+ * @return a new {@link Connection}
*/
- ConnectionFactory(SslContextFactory sslContextFactory, boolean ssl)
- {
- this(null,sslContextFactory,ssl);
- }
-
- ConnectionFactory(HttpConfiguration httpConfig, SslContextFactory sslContextFactory, boolean ssl)
- {
- _ssl=ssl;
- _sslContextFactory=sslContextFactory!=null?sslContextFactory:(ssl?new SslContextFactory(SslContextFactory.DEFAULT_KEYSTORE_PATH):null);
-
- addBean(_sslContextFactory,sslContextFactory==null);
-
- // TODO make this pluggable
- _httpConfig = httpConfig!=null?httpConfig:new HttpConfiguration(_sslContextFactory,ssl);
- addBean(_httpConfig,httpConfig==null);
-
- }
-
-
- protected Connection newConnection(Connector connector,EndPoint endp) throws IOException
- {
-
- if (_ssl)
- {
- SSLEngine engine = _sslContextFactory.createSSLEngine(endp.getRemoteAddress());
- SslConnection ssl_connection = new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endp, engine);
-
- Connection http_connection = new HttpConnection(_httpConfig,connector,ssl_connection.getDecryptedEndPoint());
- ssl_connection.getDecryptedEndPoint().setConnection(http_connection);
- return ssl_connection;
- }
- return new HttpConnection(_httpConfig,connector,endp);
- }
-
- public SslContextFactory getSslContextFactory()
- {
- return _sslContextFactory;
- }
-
- public HttpConfiguration getHttpConfig()
- {
- return _httpConfig;
- }
-
-
+ public Connection newConnection(SocketChannel channel, EndPoint endPoint, Object attachment);
}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionStatistics.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionStatistics.java
index 534653d2dee..589f2e4ae70 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionStatistics.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ConnectionStatistics.java
@@ -28,14 +28,14 @@ class ConnectionStatistics extends AbstractLifeCycle implements Statistics
private final SampleStatistic _messagesOut = new SampleStatistic();
private final SampleStatistic _connectionDurationStats = new SampleStatistic();
-
+
/* ------------------------------------------------------------ */
@Override
public int getBytesIn()
{
return -1;
}
-
+
/* ------------------------------------------------------------ */
@Override
@@ -185,7 +185,7 @@ class ConnectionStatistics extends AbstractLifeCycle implements Statistics
return (start != -1)?(System.currentTimeMillis() - start):0;
}
-
+
/* ------------------------------------------------------------ */
@Override
public void doStart()
@@ -193,12 +193,12 @@ class ConnectionStatistics extends AbstractLifeCycle implements Statistics
statsReset();
_statsStartedAt.set(System.currentTimeMillis());
}
-
+
/* ------------------------------------------------------------ */
@Override
public void doStop()
{
-
+
}
/* ------------------------------------------------------------ */
@@ -212,7 +212,7 @@ class ConnectionStatistics extends AbstractLifeCycle implements Statistics
_connectionStats.reset();
_connectionDurationStats.reset();
}
-
+
/* ------------------------------------------------------------ */
@Override
public void connectionOpened()
@@ -223,19 +223,19 @@ class ConnectionStatistics extends AbstractLifeCycle implements Statistics
/* ------------------------------------------------------------ */
@Override
- public void connectionUpgraded(long duration, int msgIn, int msgOut)
+ public void connectionUpgraded(long duration, int messagesIn, int messagesOut)
{
- _messagesIn.set(msgIn);
- _messagesOut.set(msgOut);
+ _messagesIn.set(messagesIn);
+ _messagesOut.set(messagesOut);
}
/* ------------------------------------------------------------ */
@Override
- public void connectionClosed(long duration, int msgIn, int msgOut)
+ public void connectionClosed(long duration, int messagesIn, int messagesOut)
{
- _messagesIn.set(msgIn);
- _messagesOut.set(msgOut);
+ _messagesIn.set(messagesIn);
+ _messagesOut.set(messagesOut);
_connectionStats.decrement();
_connectionDurationStats.set(duration);
}
-}
\ No newline at end of file
+}
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 e29f002003d..3cf2cd84274 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
@@ -13,7 +13,6 @@
package org.eclipse.jetty.server;
-import java.io.IOException;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
@@ -21,215 +20,183 @@ import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.util.component.LifeCycle;
import org.eclipse.jetty.util.ssl.SslContextFactory;
-/** HTTP Connector.
- * Implementations of this interface provide connectors for the HTTP protocol.
- * A connector receives requests (normally from a socket) and calls the
- * handle method of the Handler object. These operations are performed using
- * threads from the ThreadPool set on the connector.
- *
- * When a connector is registered with an instance of Server, then the server
- * 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.
- *
+/**
+ *
A {@link Connector} accept connections and data from remote peers,
+ * and allows applications to send data to remote peers, by setting up
+ * the machinery needed to handle such tasks.
*/
public interface Connector extends LifeCycle
{
- /* ------------------------------------------------------------ */
/**
- * @return the name of the connector. Defaults to the HostName:port
+ * @return the name of the connector, defaulting to host:port
*/
- String getName();
+ public String getName();
- /* ------------------------------------------------------------ */
- Server getServer();
-
- /* ------------------------------------------------------------ */
- ConnectionFactory getConnectionFactory();
-
- /* ------------------------------------------------------------ */
- Executor getExecutor();
-
- /* ------------------------------------------------------------ */
- ScheduledExecutorService getScheduler();
-
- /* ------------------------------------------------------------ */
- ByteBufferPool getByteBufferPool();
-
- /* ------------------------------------------------------------ */
/**
- * @return Max Idle time for connections in milliseconds
+ * @return the {@link Server} instance associated with this {@link Connector}
*/
- long getIdleTimeout();
+ public Server getServer();
+
+ /**
+ * @return the {@link Executor} used to submit tasks
+ */
+ public Executor getExecutor();
+
+ /**
+ * @return the {@link ScheduledExecutorService} used to schedule tasks
+ */
+ public ScheduledExecutorService getScheduler();
+
+ /**
+ * @return the {@link ByteBufferPool} to acquire buffers from and release buffers to
+ */
+ public ByteBufferPool getByteBufferPool();
+
+ /**
+ * @return the {@link SslContextFactory} associated with this {@link Connector}
+ */
+ public SslContextFactory getSslContextFactory();
+
+ /**
+ * @return the dle timeout for connections in milliseconds
+ */
+ public long getIdleTimeout();
- /* ------------------------------------------------------------ */
/**
* @return the underlying socket, channel, buffer etc. for the connector.
*/
- Object getTransport();
+ public Object getTransport();
- /* ------------------------------------------------------------ */
- Statistics getStatistics();
+ /**
+ * @return the {@link Statistics} associated with this {@link Connector}
+ */
+ public Statistics getStatistics();
- interface NetConnector extends Connector, AutoCloseable
+ /**
+ *
{@link Connector} statistics.
+ */
+ public interface Statistics extends LifeCycle
{
- /* ------------------------------------------------------------ */
/**
- * Opens the connector
- * @throws IOException
+ * @return true if gathering of statistics is enabled
*/
- void open() throws IOException;
+ public boolean getStatsOn();
- /* ------------------------------------------------------------ */
- void close() throws IOException;
-
- /* ------------------------------------------------------------ */
/**
- * @return The hostname representing the interface to which
- * this connector will bind, or null for all interfaces.
+ *
Resets the statistics.
*/
- String getHost();
+ public void statsReset();
- /* ------------------------------------------------------------ */
/**
- * @return The configured port for the connector or 0 if any available
- * port may be used.
- */
- int getPort();
-
- /* ------------------------------------------------------------ */
- /**
- * @return The actual port the connector is listening on or
- * -1 if it has not been opened, or -2 if it has been closed.
- */
- int getLocalPort();
- }
-
- 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.
+ * @return the number of messages received by this connector
+ * since last call to {@link #statsReset()}.
*/
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.
+ * @return the number of messages sent by this connector
+ * since last call to {@link #statsReset()}.
*/
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.
+ * @return the number of bytes received by this connector
+ * since last call to {@link #statsReset()}.
*/
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.
+ * @return the number of bytes sent by this connector
+ * since last call to {@link #statsReset()}.
*/
public int getBytesOut();
- /* ------------------------------------------------------------ */
/**
- * @return Returns the connectionsDurationTotal.
+ * @return the total time connections have been open, in milliseconds,
+ * since last call to {@link #statsReset()}.
*/
public long getConnectionsDurationTotal();
- /* ------------------------------------------------------------ */
/**
- * @return Number of connections accepted by the server since
- * statsReset() called. Undefined if setStatsOn(false).
+ * @return the number of connections accepted by the server
+ * since last call to {@link #statsReset()}.
*/
public int getConnections() ;
- /* ------------------------------------------------------------ */
/**
- * @return Number of connections currently open that were opened
- * since statsReset() called. Undefined if setStatsOn(false).
+ * @return the number of connections currently open that were opened
+ * since last call to {@link #statsReset()}.
*/
public int getConnectionsOpen() ;
- /* ------------------------------------------------------------ */
/**
- * @return Maximum number of connections opened simultaneously
- * since statsReset() called. Undefined if setStatsOn(false).
+ * @return the max number of connections opened simultaneously
+ * since last call to {@link #statsReset()}.
*/
public int getConnectionsOpenMax() ;
- /* ------------------------------------------------------------ */
/**
- * @return Maximum duration in milliseconds of an open connection
- * since statsReset() called. Undefined if setStatsOn(false).
+ * @return the max time a connection has been open, in milliseconds,
+ * since last call to {@link #statsReset()}.
*/
public long getConnectionsDurationMax();
- /* ------------------------------------------------------------ */
/**
- * @return Mean duration in milliseconds of open connections
- * since statsReset() called. Undefined if setStatsOn(false).
+ * @return the mean time connections have been open, in milliseconds,
+ * since last call to {@link #statsReset()}.
*/
public double getConnectionsDurationMean() ;
- /* ------------------------------------------------------------ */
/**
- * @return Standard deviation of duration in milliseconds of
- * open connections since statsReset() called. Undefined if
- * setStatsOn(false).
+ * @return the standard deviation of the time connections have been open, in milliseconds,
+ * since last call to {@link #statsReset()}.
*/
public double getConnectionsDurationStdDev() ;
- /* ------------------------------------------------------------ */
/**
- * @return Mean number of messages received per connection
- * since statsReset() called. Undefined if setStatsOn(false).
+ * @return the mean number of messages received per connection
+ * since last call to {@link #statsReset()}.
*/
public double getConnectionsMessagesInMean() ;
- /* ------------------------------------------------------------ */
/**
- * @return Standard Deviation of number of messages received per connection
- * since statsReset() called. Undefined if setStatsOn(false).
+ * @return the standard deviation of the number of messages received per connection
+ * since last call to {@link #statsReset()}.
*/
public double getConnectionsMessagesInStdDev() ;
- /* ------------------------------------------------------------ */
/**
- * @return Maximum number of messages received per connection
- * since statsReset() called. Undefined if setStatsOn(false).
+ * @return the max number of messages received by a connection
+ * since last call to {@link #statsReset()}.
*/
public int getConnectionsMessagesInMax();
- /* ------------------------------------------------------------ */
/**
- * @return Timestamp stats were started at.
+ * @return the number of milliseconds the statistics have been started or reset
*/
public long getStatsOnMs();
- void connectionOpened();
+ /**
+ *
Callback method invoked when a new connection is opened.
+ */
+ public void connectionOpened();
- void connectionUpgraded(long duration, int requests, int requests2);
-
- void connectionClosed(long duration, int requests, int requests2);
+ /**
+ *
Callback method invoked when a connection is upgraded.
+ *
+ * @param duration the time the previous connection was opened
+ * @param messagesIn the number of messages received by the previous connection
+ * @param messagesOut the number of messages send by the previous connection
+ */
+ public void connectionUpgraded(long duration, int messagesIn, int messagesOut);
+ /**
+ *
Callback method invoked when a connection is closed.
+ *
+ * @param duration the time the connection was opened
+ * @param messagesIn the number of messages received by the connection
+ * @param messagesOut the number of messages send by the connection
+ */
+ public void connectionClosed(long duration, int messagesIn, int messagesOut);
}
}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java
index 075097af7ca..81fb4793235 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpConfiguration.java
@@ -2,7 +2,6 @@ package org.eclipse.jetty.server;
import java.io.IOException;
import java.net.InetSocketAddress;
-
import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLSession;
import javax.servlet.ServletRequest;
@@ -21,10 +20,10 @@ import org.eclipse.jetty.util.ssl.SslContextFactory;
public class HttpConfiguration extends AggregateLifeCycle
{
static final Logger LOG = Log.getLogger(HttpConfiguration.class);
-
+
private final SslContextFactory _sslContextFactory;
private final boolean _ssl;
-
+
private String _integralScheme = HttpScheme.HTTPS.asString();
private int _integralPort = 0;
private String _confidentialScheme = HttpScheme.HTTPS.asString();
@@ -41,7 +40,7 @@ public class HttpConfiguration extends AggregateLifeCycle
private int _requestBufferSize=16*1024;
private int _responseHeaderSize=6*1024;
private int _responseBufferSize=16*1024;
-
+
public HttpConfiguration(SslContextFactory sslContextFactory,boolean ssl)
{
_sslContextFactory=sslContextFactory!=null?sslContextFactory:ssl?new SslContextFactory(SslContextFactory.DEFAULT_KEYSTORE_PATH):null;
@@ -49,7 +48,7 @@ public class HttpConfiguration extends AggregateLifeCycle
if (_sslContextFactory!=null)
addBean(_sslContextFactory,sslContextFactory==null);
}
-
+
public SslContextFactory getSslContextFactory()
{
return _sslContextFactory;
@@ -121,7 +120,7 @@ public class HttpConfiguration extends AggregateLifeCycle
*
*/
public void customize(Request request) throws IOException
- {
+ {
if (isSecure())
{
request.setScheme(HttpScheme.HTTPS.asString());
@@ -130,7 +129,7 @@ public class HttpConfiguration extends AggregateLifeCycle
SSLEngine sslEngine=sslConnection.getSSLEngine();
SslCertificates.customize(sslEngine,request);
}
-
+
request.setTimeStamp(System.currentTimeMillis());
if (isForwarded())
checkForwardedHeaders(request);
@@ -242,13 +241,13 @@ public class HttpConfiguration extends AggregateLifeCycle
/* ------------------------------------------------------------ */
/**
* The request is integral IFF it is secure AND the server port
- * matches any configured {@link #getIntegralPort()}.
+ * matches any configured {@link #getIntegralPort()}.
* This allows separation of listeners providing INTEGRAL versus
* CONFIDENTIAL constraints, such as one SSL listener configured to require
* client certs providing CONFIDENTIAL, whereas another SSL listener not
* requiring client certs providing mere INTEGRAL constraints.
*
- * The request is secure if it is SSL or it {@link #isForwarded()} is true
+ * The request is secure if it is SSL or it {@link #isForwarded()} is true
* and the scheme matches {@link #getIntegralScheme()()}
*/
public boolean isIntegral(Request request)
@@ -280,13 +279,13 @@ public class HttpConfiguration extends AggregateLifeCycle
/* ------------------------------------------------------------ */
/**
* The request is confidential IFF it is secure AND the server port
- * matches any configured {@link #getConfidentialPort()}.
+ * matches any configured {@link #getConfidentialPort()}.
* This allows separation of listeners providing INTEGRAL versus
* CONFIDENTIAL constraints, such as one SSL listener configured to require
* client certs providing CONFIDENTIAL, whereas another SSL listener not
* requiring client certs providing mere INTEGRAL constraints.
*
- * The request is secure if it is SSL or it {@link #isForwarded()} is true
+ * The request is secure if it is SSL or it {@link #isForwarded()} is true
* and the scheme matches {@link #getConfidentialScheme()}
*/
public boolean isConfidential(Request request)
@@ -510,7 +509,7 @@ public class HttpConfiguration extends AggregateLifeCycle
{
_forwardedSslSessionIdHeader = forwardedSslSessionId;
}
-
+
/* ------------------------------------------------------------ */
@Override
@@ -521,8 +520,8 @@ public class HttpConfiguration extends AggregateLifeCycle
_sslContextFactory.checkKeyStore();
super.doStart();
-
- SSLEngine sslEngine = _sslContextFactory.newSslEngine();
+
+ SSLEngine sslEngine = _sslContextFactory.newSSLEngine();
sslEngine.setUseClientMode(false);
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnectionFactory.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnectionFactory.java
new file mode 100644
index 00000000000..cb4e5157ca2
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnectionFactory.java
@@ -0,0 +1,69 @@
+//========================================================================
+//Copyright 2011-2012 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;
+
+import java.nio.channels.SocketChannel;
+import javax.net.ssl.SSLEngine;
+
+import org.eclipse.jetty.io.Connection;
+import org.eclipse.jetty.io.EndPoint;
+import org.eclipse.jetty.io.ssl.SslConnection;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+public class HttpServerConnectionFactory implements ConnectionFactory
+{
+ private final Connector connector;
+ private final HttpConfiguration configuration;
+
+ public HttpServerConnectionFactory(Connector connector)
+ {
+ this(connector, new HttpConfiguration(connector.getSslContextFactory(), connector.getSslContextFactory() != null));
+ }
+ public HttpServerConnectionFactory(Connector connector, HttpConfiguration configuration)
+ {
+ this.connector = connector;
+ this.configuration = configuration;
+ }
+
+ public Connector getConnector()
+ {
+ return connector;
+ }
+
+ public HttpConfiguration getHttpConfiguration()
+ {
+ return configuration;
+ }
+
+ @Override
+ public Connection newConnection(SocketChannel channel, EndPoint endPoint, Object attachment)
+ {
+ SslContextFactory sslContextFactory = connector.getSslContextFactory();
+ if (sslContextFactory != null)
+ {
+ SSLEngine engine = sslContextFactory.newSSLEngine(endPoint.getRemoteAddress());
+ engine.setUseClientMode(false);
+ SslConnection sslConnection = new SslConnection(connector.getByteBufferPool(), connector.getExecutor(), endPoint, engine);
+ Connection httpConnection = new HttpConnection(getHttpConfiguration(), connector, sslConnection.getDecryptedEndPoint());
+ sslConnection.getDecryptedEndPoint().setConnection(httpConnection);
+ httpConnection.onOpen();
+ return sslConnection;
+ }
+ else
+ {
+ return new HttpConnection(getHttpConfiguration(), getConnector(), endPoint);
+ }
+ }
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnector.java
new file mode 100644
index 00000000000..1692fe1788b
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/HttpServerConnector.java
@@ -0,0 +1,27 @@
+package org.eclipse.jetty.server;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.util.annotation.Name;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+public class HttpServerConnector extends SelectChannelConnector
+{
+ public HttpServerConnector(Server server)
+ {
+ this(server, null);
+ }
+
+ public HttpServerConnector(Server server, SslContextFactory sslContextFactory)
+ {
+ this(server, null, null, null, sslContextFactory, 0, 0);
+ }
+
+ public HttpServerConnector(@Name("server") Server server, @Name("executor") Executor executor, @Name("scheduler") ScheduledExecutorService scheduler, @Name("bufferPool") ByteBufferPool pool, @Name("sslContextFactory") SslContextFactory sslContextFactory, @Name("acceptors") int acceptors, @Name("selectors") int selectors)
+ {
+ super(server, executor, scheduler, pool, sslContextFactory, acceptors, selectors);
+ setDefaultConnectionFactory(new HttpServerConnectionFactory(this));
+ }
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java
index f197e50aa54..f85f9c8d1fa 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/LocalConnector.java
@@ -23,50 +23,34 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.io.ByteArrayEndPoint;
-import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.ByteBufferPool;
+import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.StringUtil;
-import org.eclipse.jetty.util.log.Log;
-import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.ssl.SslContextFactory;
public class LocalConnector extends AbstractConnector
{
- private static final Logger LOG = Log.getLogger(LocalConnector.class);
-
private final BlockingQueue _connects = new LinkedBlockingQueue<>();
-
+
public LocalConnector(Server server)
{
- this(server,null,null,null,null, -1);
- }
-
- public LocalConnector(Server server, boolean ssl)
- {
- this(server,new ConnectionFactory(null,ssl),null,null,null,0);
- manage(getConnectionFactory());
- }
-
- public LocalConnector(Server server, HttpConfiguration httpConfig)
- {
- this(server,new ConnectionFactory(httpConfig,null,false),null,null,null,0);
- manage(getConnectionFactory());
+ this(server,null);
}
public LocalConnector(Server server, SslContextFactory sslContextFactory)
{
- this(server,new ConnectionFactory(sslContextFactory,sslContextFactory!=null),null,null,null,0);
- manage(getConnectionFactory());
+ this(server, null, null, null, sslContextFactory, 0);
}
-
- public LocalConnector(Server server, ConnectionFactory connectionFactory, Executor executor, ScheduledExecutorService scheduler, ByteBufferPool pool,
- int acceptors)
+
+ public LocalConnector(Server server, Executor executor, ScheduledExecutorService scheduler, ByteBufferPool pool,
+ SslContextFactory sslContextFactory, int acceptors)
{
- super(server,connectionFactory,executor,scheduler,pool,acceptors);
+ super(server,executor,scheduler,pool, sslContextFactory, acceptors);
setIdleTimeout(30000);
+ setDefaultConnectionFactory(new HttpServerConnectionFactory(this));
}
-
+
@Override
public Object getTransport()
{
@@ -77,7 +61,7 @@ public class LocalConnector extends AbstractConnector
* Returns all the responses received once the thread activity has
* returned to the level it was before the requests.
*
- * This methods waits until the connection is closed or
+ * This methods waits until the connection is closed or
* is idle for 1s before returning the responses.
* @param requests the requests
* @return the responses
@@ -93,7 +77,7 @@ public class LocalConnector extends AbstractConnector
* Returns all the responses received once the thread activity has
* returned to the level it was before the requests.
*
- * This methods waits until the connection is closed or
+ * This methods waits until the connection is closed or
* an idle period before returning the responses.
* @param requests the requests
* @param idleFor The time the response stream must be idle for before returning
@@ -111,7 +95,7 @@ public class LocalConnector extends AbstractConnector
* Returns all the responses received once the thread activity has
* returned to the level it was before the requests.
*
- * This methods waits until the connection is closed or
+ * This methods waits until the connection is closed or
* is idle for 1s before returning the responses.
* @param requestsBuffer the requests
* @return the responses
@@ -126,7 +110,7 @@ public class LocalConnector extends AbstractConnector
* Returns all the responses received once the thread activity has
* returned to the level it was before the requests.
*
- * This methods waits until the connection is closed or
+ * This methods waits until the connection is closed or
* an idle period before returning the responses.
* @param requestsBuffer the requests
* @param idleFor The time the response stream must be idle for before returning
@@ -136,7 +120,7 @@ public class LocalConnector extends AbstractConnector
*/
public ByteBuffer getResponses(ByteBuffer requestsBuffer,long idleFor,TimeUnit units) throws Exception
{
- LOG.debug("getResponses");
+ logger.debug("getResponses");
LocalEndPoint endp = new LocalEndPoint();
endp.setInput(requestsBuffer);
_connects.add(endp);
@@ -161,16 +145,15 @@ public class LocalConnector extends AbstractConnector
@Override
protected void accept(int acceptorID) throws IOException, InterruptedException
{
- LOG.debug("accepting {}",acceptorID);
+ logger.debug("accepting {}", acceptorID);
LocalEndPoint endp = _connects.take();
- Connection connection=getConnectionFactory().newConnection(LocalConnector.this,endp);
+ Connection connection = getDefaultConnectionFactory().newConnection(null, endp, null);
endp.setConnection(connection);
endp.onOpen();
connection.onOpen();
connectionOpened(connection);
}
-
public class LocalEndPoint extends ByteArrayEndPoint
{
private CountDownLatch _closed = new CountDownLatch(1);
@@ -232,7 +215,7 @@ public class LocalConnector extends AbstractConnector
}
catch(Exception e)
{
- LOG.warn(e);
+ logger.warn(e);
}
}
}
@@ -254,10 +237,10 @@ public class LocalConnector extends AbstractConnector
}
catch(Exception e)
{
- LOG.warn(e);
+ logger.warn(e);
}
}
}
-
+
}
}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkConnector.java
new file mode 100644
index 00000000000..570a32f7fc9
--- /dev/null
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/NetworkConnector.java
@@ -0,0 +1,56 @@
+// ========================================================================
+// Copyright (c) 2004-2012 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;
+
+import java.io.IOException;
+
+/**
+ *
A {@link Connector} that handles network communication.
Performs the activities needed to open the network communication
+ * (for example, to start accepting incoming network connections).
+ *
+ * @throws IOException if this connector cannot be opened
+ * @see #close()
+ */
+ void open() throws IOException;
+
+ /**
+ *
Performs the activities needed to close the network communication
+ * (for example, to stop accepting network connections).
+ * @throws IOException if this connector cannot be closed
+ */
+ void close() throws IOException;
+
+ /**
+ * @return The hostname representing the interface to which
+ * this connector will bind, or null for all interfaces.
+ */
+ String getHost();
+
+ /**
+ * @return The configured port for the connector or 0 if any available
+ * port may be used.
+ */
+ int getPort();
+
+ /**
+ * @return The actual port the connector is listening on, or
+ * -1 if it has not been opened, or -2 if it has been closed.
+ */
+ int getLocalPort();
+}
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/SelectChannelConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/SelectChannelConnector.java
index f2aad4ba14b..fdf4e4e135e 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/SelectChannelConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/SelectChannelConnector.java
@@ -15,7 +15,9 @@ package org.eclipse.jetty.server;
import java.io.IOException;
import java.net.InetSocketAddress;
+import java.net.ServerSocket;
import java.net.Socket;
+import java.net.SocketException;
import java.nio.channels.Channel;
import java.nio.channels.SelectionKey;
import java.nio.channels.ServerSocketChannel;
@@ -23,10 +25,9 @@ import java.nio.channels.SocketChannel;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
-import org.eclipse.jetty.continuation.Continuation;
+import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.Connection;
import org.eclipse.jetty.io.EndPoint;
-import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.SelectChannelEndPoint;
import org.eclipse.jetty.io.SelectorManager;
import org.eclipse.jetty.io.SelectorManager.ManagedSelector;
@@ -34,121 +35,139 @@ import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.ssl.SslContextFactory;
/**
- * Selecting NIO connector.
- *
- * This connector uses efficient NIO buffers with a non blocking threading model. Direct NIO buffers
- * are used and threads are only allocated to connections with requests. Synchronization is used to
- * simulate blocking for the servlet API, and any unflushed content at the end of request handling
- * is written asynchronously.
- *
- *
- * This connector is best used when there are a many connections that have idle periods.
- *
- *
- * When used with {@link org.eclipse.jetty.continuation.Continuation}, threadless waits are supported.
- * If a filter or servlet returns after calling {@link Continuation#suspend()} or when a
- * runtime exception is thrown from a call to {@link Continuation#undispatch()}, Jetty will
- * will not send a response to the client. Instead the thread is released and the Continuation is
- * placed on the timer queue. If the Continuation timeout expires, or it's
- * resume method is called, then the request is again allocated a thread and the request is retried.
- * The limitation of this approach is that request content is not available on the retried request,
- * thus if possible it should be read after the continuation or saved as a request attribute or as the
- * associated object of the Continuation instance.
- *
+ *
Implementation of {@link NetworkConnector} based on NIO classes.
*/
-public class SelectChannelConnector extends AbstractNetConnector
+public class SelectChannelConnector extends AbstractNetworkConnector
{
private final SelectorManager _manager;
- protected ServerSocketChannel _acceptChannel;
- protected boolean _inheritChannel;
- private int _localPort=-1;
-
- /* ------------------------------------------------------------ */
+ private volatile ServerSocketChannel _acceptChannel;
+ private volatile boolean _inheritChannel = false;
+ private volatile int _localPort = -1;
+ private volatile int _acceptQueueSize = 128;
+ private volatile boolean _reuseAddress = true;
+ private volatile int _lingerTime = -1;
+
public SelectChannelConnector(Server server)
{
- this(server,null,null,null,null,0,0);
+ this(server, null);
}
-
- /* ------------------------------------------------------------ */
- public SelectChannelConnector(Server server, boolean ssl)
- {
- this(server,new ConnectionFactory(null,ssl));
- manage(getConnectionFactory());
- }
-
- /* ------------------------------------------------------------ */
+
public SelectChannelConnector(Server server, SslContextFactory sslContextFactory)
{
- this(server,new ConnectionFactory(sslContextFactory,sslContextFactory!=null));
- manage(getConnectionFactory());
+ this(server, null, null, null, sslContextFactory, 0, 0);
}
-
- /* ------------------------------------------------------------ */
- public SelectChannelConnector(Server server, ConnectionFactory connectionFactory)
- {
- this(server,connectionFactory,null,null,null,0,0);
- }
-
- /* ------------------------------------------------------------ */
/**
- * @param server The server this connector will be added to. Must not be null.
- * @param executor An executor for this connector or null to use the servers executor
+ * @param server The server this connector will be added to. Must not be null.
+ * @param executor An executor for this connector or null to use the servers executor
* @param scheduler A scheduler for this connector or null to use the servers scheduler
- * @param pool A buffer pool for this connector or null to use a default {@link ByteBufferPool}
+ * @param pool A buffer pool for this connector or null to use a default {@link ByteBufferPool}
* @param acceptors the number of acceptor threads to use, or 0 for a default value.
*/
- public SelectChannelConnector(
- @Name("server") Server server,
- @Name("connectionFactory") ConnectionFactory connectionFactory,
- @Name("executor") Executor executor,
- @Name("scheduler") ScheduledExecutorService scheduler,
- @Name("bufferPool") ByteBufferPool pool,
- @Name("acceptors") int acceptors,
- @Name("selectors") int selectors)
+ public SelectChannelConnector(
+ @Name("server") Server server,
+ @Name("executor") Executor executor,
+ @Name("scheduler") ScheduledExecutorService scheduler,
+ @Name("bufferPool") ByteBufferPool pool,
+ @Name("sslContextFactory") SslContextFactory sslContextFactory,
+ @Name("acceptors") int acceptors,
+ @Name("selectors") int selectors)
{
- super(server,connectionFactory,executor,scheduler,pool,acceptors);
- _manager=new ConnectorSelectorManager(selectors!=0?selectors:Math.max(1,(Runtime.getRuntime().availableProcessors())/4));
- addBean(_manager,true);
-
- // TODO yuck
- if (getConnectionFactory().getSslContextFactory()!=null)
+ super(server, executor, scheduler, pool, sslContextFactory, acceptors);
+ _manager = new ConnectorSelectorManager(selectors > 0 ? selectors : Math.max(1, (Runtime.getRuntime().availableProcessors()) / 4));
+ addBean(_manager, true);
+
+ // TODO: why we need to set the linger time when in SSL mode ?
+ if (sslContextFactory != null)
setSoLingerTime(30000);
+
+ // TODO: we hardcode HTTP, but this is a generic connector that should not hardcode anything
+ setDefaultConnectionFactory(new HttpServerConnectionFactory(this));
}
-
+ /**
+ * @return whether this connector uses a channel inherited from the JVM.
+ * @see System#inheritedChannel()
+ */
public boolean isInheritChannel()
{
return _inheritChannel;
}
/**
- * If true, the connector first tries to inherit from a channel provided by the system.
- * If there is no inherited channel available, or if the inherited channel provided not usable,
- * then it will fall back upon normal ServerSocketChannel creation.
- *
- * Use it with xinetd/inetd, to launch an instance of Jetty on demand. The port
+ *
Sets whether this connector uses a channel inherited from the JVM.
+ *
If true, the connector first tries to inherit from a channel provided by the system.
+ * If there is no inherited channel available, or if the inherited channel is not usable,
+ * then it will fall back using {@link ServerSocketChannel}.
+ *
Use it with xinetd/inetd, to launch an instance of Jetty on demand. The port
* used to access pages on the Jetty instance is the same as the port used to
- * launch Jetty.
- *
+ * launch Jetty.
+ *
+ * @param inheritChannel whether this connector uses a channel inherited from the JVM.
*/
public void setInheritChannel(boolean inheritChannel)
{
_inheritChannel = inheritChannel;
}
+ @Override
+ public void open() throws IOException
+ {
+ if (_acceptChannel == null)
+ {
+ ServerSocketChannel serverChannel = null;
+ if (isInheritChannel())
+ {
+ Channel channel = System.inheritedChannel();
+ if (channel instanceof ServerSocketChannel)
+ serverChannel = (ServerSocketChannel)channel;
+ else
+ logger.warn("Unable to use System.inheritedChannel() [{}]. Trying a new ServerSocketChannel at {}:{}", channel, getHost(), getPort());
+ }
+
+ if (serverChannel == null)
+ {
+ serverChannel = ServerSocketChannel.open();
+
+ InetSocketAddress bindAddress = getHost() == null ? new InetSocketAddress(getPort()) : new InetSocketAddress(getHost(), getPort());
+ serverChannel.socket().bind(bindAddress, getAcceptQueueSize());
+ serverChannel.socket().setReuseAddress(getReuseAddress());
+
+ _localPort = serverChannel.socket().getLocalPort();
+ if (_localPort <= 0)
+ throw new IOException("Server channel not bound");
+
+ addBean(serverChannel);
+ }
+
+ serverChannel.configureBlocking(true);
+ addBean(serverChannel);
+
+ _acceptChannel = serverChannel;
+ }
+ }
+
+ @Override
+ public void close() throws IOException
+ {
+ ServerSocketChannel serverChannel = _acceptChannel;
+ if (serverChannel != null)
+ {
+ removeBean(serverChannel);
+ if (serverChannel.isOpen())
+ serverChannel.close();
+ }
+ _acceptChannel = null;
+ _localPort = -2;
+ }
+
@Override
public void accept(int acceptorID) throws IOException
{
- ServerSocketChannel server;
- synchronized(this)
+ ServerSocketChannel serverChannel = _acceptChannel;
+ if (serverChannel != null && serverChannel.isOpen())
{
- server = _acceptChannel;
- }
-
- if (server!=null && server.isOpen() && _manager.isStarted())
- {
- SocketChannel channel = server.accept();
+ SocketChannel channel = serverChannel.accept();
channel.configureBlocking(false);
Socket socket = channel.socket();
configure(socket);
@@ -156,19 +175,19 @@ public class SelectChannelConnector extends AbstractNetConnector
}
}
- @Override
- public void close() throws IOException
+ protected void configure(Socket socket)
{
- synchronized(this)
+ try
{
- if (_acceptChannel != null)
- {
- removeBean(_acceptChannel);
- if (_acceptChannel.isOpen())
- _acceptChannel.close();
- }
- _acceptChannel = null;
- _localPort=-2;
+ socket.setTcpNoDelay(true);
+ if (_lingerTime >= 0)
+ socket.setSoLinger(true, _lingerTime / 1000);
+ else
+ socket.setSoLinger(false, 0);
+ }
+ catch (SocketException e)
+ {
+ logger.ignore(e);
}
}
@@ -178,7 +197,7 @@ public class SelectChannelConnector extends AbstractNetConnector
}
@Override
- public synchronized Object getTransport()
+ public Object getTransport()
{
return _acceptChannel;
}
@@ -186,64 +205,12 @@ public class SelectChannelConnector extends AbstractNetConnector
@Override
public int getLocalPort()
{
- synchronized(this)
- {
- return _localPort;
- }
- }
-
- @Override
- public void open() throws IOException
- {
- synchronized(this)
- {
- if (_acceptChannel == null)
- {
- if (_inheritChannel)
- {
- Channel channel = System.inheritedChannel();
- if ( channel instanceof ServerSocketChannel )
- _acceptChannel = (ServerSocketChannel)channel;
- else
- LOG.warn("Unable to use System.inheritedChannel() [" +channel+ "]. Trying a new ServerSocketChannel at " + getHost() + ":" + getPort());
- }
-
- if (_acceptChannel == null)
- {
- // Create a new server socket
- _acceptChannel = ServerSocketChannel.open();
-
- // Bind the server socket to the local host and port
- _acceptChannel.socket().setReuseAddress(getReuseAddress());
- InetSocketAddress addr = getHost()==null?new InetSocketAddress(getPort()):new InetSocketAddress(getHost(),getPort());
- _acceptChannel.socket().bind(addr,getAcceptQueueSize());
-
- _localPort=_acceptChannel.socket().getLocalPort();
- if (_localPort<=0)
- throw new IOException("Server channel not bound");
-
- addBean(_acceptChannel);
- }
-
- _acceptChannel.configureBlocking(true);
- addBean(_acceptChannel);
- }
- }
- }
-
-
- /*
- * @see org.eclipse.jetty.server.server.AbstractConnector#doStart()
- */
- @Override
- protected void doStart() throws Exception
- {
- super.doStart();
+ return _localPort;
}
protected SelectChannelEndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey key) throws IOException
{
- return new SelectChannelEndPoint(channel,selectSet,key, getScheduler(), getIdleTimeout());
+ return new SelectChannelEndPoint(channel, selectSet, key, getScheduler(), getIdleTimeout());
}
protected void endPointClosed(EndPoint endpoint)
@@ -251,12 +218,68 @@ public class SelectChannelConnector extends AbstractNetConnector
connectionClosed(endpoint.getConnection());
}
- /* ------------------------------------------------------------ */
+ protected Connection newConnection(SocketChannel channel, EndPoint endPoint, Object attachment)
+ {
+ return getDefaultConnectionFactory().newConnection(channel, endPoint, attachment);
+ }
+
+ /**
+ * @return the linger time
+ * @see Socket#getSoLinger()
+ */
+ public int getLingerTime()
+ {
+ return _lingerTime;
+ }
+
+ /**
+ * @param lingerTime the linger time. Use -1 to disable.
+ * @see Socket#setSoLinger(boolean, int)
+ */
+ public void setSoLingerTime(int lingerTime)
+ {
+ _lingerTime = lingerTime;
+ }
+
+ /**
+ * @return the accept queue size
+ */
+ public int getAcceptQueueSize()
+ {
+ return _acceptQueueSize;
+ }
+
+ /**
+ * @param acceptQueueSize the accept queue size (also known as accept backlog)
+ */
+ public void setAcceptQueueSize(int acceptQueueSize)
+ {
+ _acceptQueueSize = acceptQueueSize;
+ }
+
+ /**
+ * @return whether the server socket reuses addresses
+ * @see ServerSocket#getReuseAddress()
+ */
+ public boolean getReuseAddress()
+ {
+ return _reuseAddress;
+ }
+
+ /**
+ * @param reuseAddress whether the server socket reuses addresses
+ * @see ServerSocket#setReuseAddress(boolean)
+ */
+ public void setReuseAddress(boolean reuseAddress)
+ {
+ _reuseAddress = reuseAddress;
+ }
+
private final class ConnectorSelectorManager extends SelectorManager
{
- private ConnectorSelectorManager(int selectSets)
+ private ConnectorSelectorManager(int selectors)
{
- super(selectSets);
+ super(selectors);
}
@Override
@@ -266,18 +289,17 @@ public class SelectChannelConnector extends AbstractNetConnector
}
@Override
- protected void endPointClosed(EndPoint endpoint)
+ public void connectionOpened(Connection connection)
{
- SelectChannelConnector.this.connectionClosed(endpoint.getConnection());
- super.endPointClosed(endpoint);
+ super.connectionOpened(connection);
+ SelectChannelConnector.this.connectionOpened(connection);
}
@Override
- protected void endPointOpened(EndPoint endpoint)
+ public void connectionClosed(Connection connection)
{
- // TODO handle max connections and low resources
- super.endPointOpened(endpoint);
- SelectChannelConnector.this.connectionOpened(endpoint.getConnection());
+ super.connectionClosed(connection);
+ SelectChannelConnector.this.connectionClosed(connection);
}
@Override
@@ -290,13 +312,13 @@ public class SelectChannelConnector extends AbstractNetConnector
@Override
protected SelectChannelEndPoint newEndPoint(SocketChannel channel, ManagedSelector selectSet, SelectionKey selectionKey) throws IOException
{
- return SelectChannelConnector.this.newEndPoint(channel,selectSet, selectionKey);
+ return SelectChannelConnector.this.newEndPoint(channel, selectSet, selectionKey);
}
@Override
public Connection newConnection(SocketChannel channel, EndPoint endpoint, Object attachment) throws IOException
{
- return getConnectionFactory().newConnection(SelectChannelConnector.this,endpoint);
+ return SelectChannelConnector.this.newConnection(channel, endpoint, attachment);
}
}
}
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 3e521cb38cb..01567c90d3a 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
@@ -4,7 +4,7 @@
// 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
+// 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
@@ -16,14 +16,12 @@ package org.eclipse.jetty.server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Enumeration;
-
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpGenerator;
import org.eclipse.jetty.http.HttpURI;
-import org.eclipse.jetty.server.Connector.NetConnector;
import org.eclipse.jetty.server.handler.HandlerWrapper;
import org.eclipse.jetty.util.Attributes;
import org.eclipse.jetty.util.AttributesMap;
@@ -117,7 +115,7 @@ public class Server extends HandlerWrapper implements Attributes
addBean(_threadPool,pool==null);
setServer(this);
}
-
+
/* ------------------------------------------------------------ */
public static String getVersion()
@@ -148,15 +146,15 @@ public class Server extends HandlerWrapper implements Attributes
{
//and we weren't stopping before
if (!_stopAtShutdown)
- {
+ {
//only register to stop if we're already started (otherwise we'll do it in doStart())
- if (isStarted())
+ if (isStarted())
ShutdownThread.register(this);
}
}
else
ShutdownThread.deregister(this);
-
+
_stopAtShutdown=stop;
}
@@ -302,8 +300,8 @@ public class Server extends HandlerWrapper implements Attributes
for (int i=_connectors.length;i-->0;)
{
LOG.info("Graceful shutdown {}",_connectors[i]);
- if (_connectors[i] instanceof NetConnector)
- ((NetConnector)_connectors[i]).close();
+ if (_connectors[i] instanceof NetworkConnector)
+ ((NetworkConnector)_connectors[i]).close();
}
}
@@ -457,7 +455,7 @@ public class Server extends HandlerWrapper implements Attributes
}
/* ------------------------------------------------------------ */
- /**
+ /**
*/
@Deprecated
public int getMaxCookieVersion()
@@ -466,7 +464,7 @@ public class Server extends HandlerWrapper implements Attributes
}
/* ------------------------------------------------------------ */
- /**
+ /**
*/
@Deprecated
public void setMaxCookieVersion(int maxCookieVersion)
diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/ssl/SslSelectChannelConnector.java b/jetty-server/src/main/java/org/eclipse/jetty/server/ssl/SslSelectChannelConnector.java
index 28480c3d00c..3af72199c3a 100644
--- a/jetty-server/src/main/java/org/eclipse/jetty/server/ssl/SslSelectChannelConnector.java
+++ b/jetty-server/src/main/java/org/eclipse/jetty/server/ssl/SslSelectChannelConnector.java
@@ -24,10 +24,10 @@ import org.eclipse.jetty.util.ssl.SslContextFactory;
* @deprecated use SelectChannelConnector with {@link SslContextFactory}
* @org.apache.xbean.XBean element="sslConnector" description="Creates an NIO ssl connector"
*/
-public class SslSelectChannelConnector extends SelectChannelConnector
+public class SslSelectChannelConnector extends SelectChannelConnector
{
public SslSelectChannelConnector(Server server)
{
- super(server,true);
+ super(server,new SslContextFactory());
}
}
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/CheckReverseProxyHeadersTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/CheckReverseProxyHeadersTest.java
index 04bcc873713..ac6d802e78a 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/CheckReverseProxyHeadersTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/CheckReverseProxyHeadersTest.java
@@ -13,12 +13,7 @@
package org.eclipse.jetty.server;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
import java.io.IOException;
-
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -26,6 +21,10 @@ import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
/**
*
*/
@@ -94,9 +93,10 @@ public class CheckReverseProxyHeadersTest
{
Server server = new Server();
LocalConnector connector = new LocalConnector(server);
-
// Activate reverse proxy headers checking
- connector.getConnectionFactory().getHttpConfig().setForwarded(true);
+ HttpConfiguration httpConfiguration = new HttpConfiguration(null, false);
+ httpConfiguration.setForwarded(true);
+ connector.setDefaultConnectionFactory(new HttpServerConnectionFactory(connector, httpConfiguration));
server.setConnectors(new Connector[] {connector});
ValidationHandler validationHandler = new ValidationHandler(requestValidator);
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java
index 61952dc3b47..a44fa4c0d35 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpConnectionTest.java
@@ -19,16 +19,9 @@
*/
package org.eclipse.jetty.server;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.startsWith;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.TimeUnit;
-
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -45,6 +38,12 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
/**
*
*/
@@ -61,8 +60,10 @@ public class HttpConnectionTest
server = new Server();
connector = new LocalConnector(server);
server.addConnector(connector);
- connector.getConnectionFactory().getHttpConfig().setRequestHeaderSize(1024);
- connector.getConnectionFactory().getHttpConfig().setResponseHeaderSize(1024);
+ HttpConfiguration httpConfiguration = new HttpConfiguration(null, false);
+ httpConfiguration.setRequestHeaderSize(1024);
+ httpConfiguration.setResponseHeaderSize(1024);
+ connector.setDefaultConnectionFactory(new HttpServerConnectionFactory(connector, httpConfiguration));
server.setHandler(new DumpHandler());
server.start();
}
@@ -135,7 +136,7 @@ public class HttpConnectionTest
offset = checkContains(response,offset,"HTTP/1.1 200");
checkContains(response,offset,"/R1");
}
-
+
@Test
public void testHead() throws Exception
{
@@ -143,15 +144,15 @@ public class HttpConnectionTest
"Host: localhost\015\012"+
"Connection: close\015\012"+
"\015\012");
-
+
String responseHEAD=connector.getResponses("HEAD /R1 HTTP/1.1\015\012"+
"Host: localhost\015\012"+
"Connection: close\015\012"+
"\015\012");
-
+
assertThat(responsePOST,startsWith(responseHEAD.substring(0,responseHEAD.length()-2)));
assertThat(responsePOST.length(),greaterThan(responseHEAD.length()));
-
+
responsePOST=connector.getResponses("POST /R1 HTTP/1.1\015\012"+
"Host: localhost\015\012"+
"Connection: close\015\012"+
@@ -413,7 +414,7 @@ public class HttpConnectionTest
{
String response = null;
int offset = 0;
-
+
StringBuilder request = new StringBuilder();
request.append("GET / HTTP/1.1\n");
request.append("Host: localhost\n");
@@ -422,7 +423,7 @@ public class HttpConnectionTest
request.append(String.format("X-Header-%04d: %08x\n", i, i));
}
request.append("\015\012");
-
+
response = connector.getResponses(request.toString());
checkContains(response, offset, "HTTP/1.1 413");
}
@@ -434,8 +435,8 @@ public class HttpConnectionTest
for (int i=0;i<500;i++)
str+="xxxxxxxxxxxx";
final String longstr = str;
-
- String response = null;
+
+ String response = null;
server.stop();
server.setHandler(new DumpHandler()
{
@@ -488,8 +489,8 @@ public class HttpConnectionTest
for (int i=0;i<500;i++)
str+="xxxxxxxxxxxx";
final String longstr = str;
-
- String response = null;
+
+ String response = null;
server.stop();
server.setHandler(new DumpHandler()
{
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java
index 5e6822a0670..f63f63d4f53 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/HttpServerTestFixture.java
@@ -19,7 +19,6 @@ import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.Socket;
-
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.servlet.ServletException;
@@ -39,9 +38,9 @@ public class HttpServerTestFixture
protected static final long PAUSE=10L;
protected static final int LOOPS=Stress.isEnabled()?250:50;
protected static final String HOST="localhost";
-
+
protected static Server _server;
- protected static Connector.NetConnector _connector;
+ protected static NetworkConnector _connector;
protected String _scheme="http";
protected Socket newSocket(String host,int port) throws Exception
@@ -52,14 +51,14 @@ public class HttpServerTestFixture
socket.setSoLinger(false,0);
return socket;
}
-
+
@BeforeClass
public static void before()
{
_server = new Server();
}
-
- protected static void startServer(Connector.NetConnector connector) throws Exception
+
+ protected static void startServer(NetworkConnector connector) throws Exception
{
_connector = connector;
_server.addConnector(_connector);
@@ -81,20 +80,20 @@ public class HttpServerTestFixture
current.setHandler(handler);
current.start();
}
-
+
protected static class EchoHandler extends AbstractHandler
{
boolean musthavecontent=true;
-
+
public EchoHandler()
{}
-
+
public EchoHandler(boolean content)
{
musthavecontent=false;
}
-
+
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
@@ -111,7 +110,7 @@ public class HttpServerTestFixture
int count=0;
BufferedReader reader=request.getReader();
-
+
if (request.getContentLength()!=0)
{
String line=reader.readLine();
@@ -123,7 +122,7 @@ public class HttpServerTestFixture
line=reader.readLine();
}
}
-
+
if (count==0)
{
if (musthavecontent)
@@ -131,7 +130,7 @@ public class HttpServerTestFixture
writer.println("No content");
}
-
+
// just to be difficult
reader.close();
writer.close();
@@ -171,7 +170,7 @@ public class HttpServerTestFixture
String data = "\u0a870123456789A\u0a87CDEFGHIJKLMNOPQRSTUVWXYZ\u0250bcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
while (data.length() results = new ArrayList();
_handler._checker = new RequestTester()
{
@@ -326,8 +328,8 @@ public class RequestTest
"x-forwarded-for: remote\n"+
"x-forwarded-proto: https\n"+
"\n",10,TimeUnit.SECONDS);
-
-
+
+
int i=0;
assertEquals("0.0.0.0",results.get(i++));
assertEquals("myhost",results.get(i++));
@@ -920,7 +922,7 @@ public class RequestTest
{
((Request)request).setHandled(true);
- if (request.getContentLength()>0
+ if (request.getContentLength()>0
&& !MimeTypes.Type.FORM_ENCODED.asString().equals(request.getContentType())
&& !request.getContentType().startsWith("multipart/form-data"))
_content=IO.toString(request.getInputStream());
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java
index 4c620850869..875bdfa4da9 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/ResponseTest.java
@@ -13,11 +13,6 @@
package org.eclipse.jetty.server;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
@@ -29,7 +24,6 @@ import java.util.Locale;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
-
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
@@ -52,6 +46,11 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
/**
*
*/
@@ -89,7 +88,7 @@ public class ResponseTest
super.onOpen();
fillInterested();
}
-
+
@Override
public void onFillable()
{
@@ -160,7 +159,7 @@ public class ResponseTest
protected void commitResponse(ResponseInfo info, ByteBuffer content) throws IOException
{
}
-
+
@Override
public Connector getConnector()
{
@@ -600,7 +599,7 @@ public class ResponseTest
});
server.start();
- Socket socket = new Socket("localhost",((Connector.NetConnector)server.getConnectors()[0]).getLocalPort());
+ Socket socket = new Socket("localhost",((NetworkConnector)server.getConnectors()[0]).getLocalPort());
socket.getOutputStream().write("HEAD / HTTP/1.1\r\nHost: localhost\r\n\r\n".getBytes());
socket.getOutputStream().write("GET / HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n".getBytes());
socket.getOutputStream().flush();
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/SelectChannelStatisticsTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/SelectChannelStatisticsTest.java
index 5763e00db7c..43861169648 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/SelectChannelStatisticsTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/SelectChannelStatisticsTest.java
@@ -13,9 +13,6 @@
package org.eclipse.jetty.server;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
@@ -23,7 +20,6 @@ import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
-
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -40,12 +36,15 @@ import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
public class SelectChannelStatisticsTest
{
private static final Logger LOG = Log.getLogger(SelectChannelStatisticsTest.class);
private static Server _server;
- private static AbstractNetConnector _connector;
+ private static AbstractNetworkConnector _connector;
private static CyclicBarrier _connect;
private static CountDownLatch _closed;
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/SlowClientWithPipelinedRequestTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/SlowClientWithPipelinedRequestTest.java
index 3548f515f39..3cd3be1cfd7 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/SlowClientWithPipelinedRequestTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/SlowClientWithPipelinedRequestTest.java
@@ -12,16 +12,14 @@ package org.eclipse.jetty.server;
//You may elect to redistribute this code under either of these licenses.
//========================================================================
-import static org.hamcrest.Matchers.lessThan;
-
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
-
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -34,6 +32,8 @@ import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
+import static org.hamcrest.Matchers.lessThan;
+
public class SlowClientWithPipelinedRequestTest
{
private final AtomicInteger handles = new AtomicInteger();
@@ -43,23 +43,24 @@ public class SlowClientWithPipelinedRequestTest
public void startServer(Handler handler) throws Exception
{
server = new Server();
- connector = new SelectChannelConnector(server,new ConnectionFactory()
+ connector = new SelectChannelConnector(server);
+ connector.setDefaultConnectionFactory(new HttpServerConnectionFactory(connector)
{
@Override
- protected Connection newConnection(Connector connector,EndPoint endpoint)
+ public Connection newConnection(SocketChannel channel, EndPoint endPoint, Object attachment)
{
- return new HttpConnection(getHttpConfig(),connector,endpoint)
+ return new HttpConnection(getHttpConfiguration(), getConnector(), endPoint)
{
@Override
- public synchronized void onFillable()
+ public void onFillable()
{
handles.incrementAndGet();
super.onFillable();
}
};
}
- },null,null,null,0,0);
-
+ });
+
server.addConnector(connector);
connector.setPort(0);
server.setHandler(handler);
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/IPAccessHandlerTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/IPAccessHandlerTest.java
index 9e7ee7cbf3b..e441e867f94 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/handler/IPAccessHandlerTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/handler/IPAccessHandlerTest.java
@@ -4,18 +4,15 @@
// 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
+// 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.
+// You may elect to redistribute this code under either of these licenses.
// ========================================================================
package org.eclipse.jetty.server.handler;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.IOException;
@@ -28,13 +25,13 @@ import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.NetworkConnector;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.SelectChannelConnector;
import org.eclipse.jetty.server.Server;
@@ -45,19 +42,22 @@ import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
@RunWith(Parameterized.class)
public class IPAccessHandlerTest
{
private static Server _server;
- private static Connector.NetConnector _connector;
+ private static NetworkConnector _connector;
private static IPAccessHandler _handler;
-
+
private String _white;
private String _black;
private String _host;
private String _uri;
private String _code;
-
+
@BeforeClass
public static void setUp()
throws Exception
@@ -78,7 +78,7 @@ public class IPAccessHandlerTest
_server.setHandler(_handler);
_server.start();
}
-
+
/* ------------------------------------------------------------ */
@AfterClass
public static void tearDown()
@@ -86,7 +86,7 @@ public class IPAccessHandlerTest
{
_server.stop();
}
-
+
/* ------------------------------------------------------------ */
public IPAccessHandlerTest(String white, String black, String host, String uri, String code)
{
@@ -96,7 +96,7 @@ public class IPAccessHandlerTest
_uri = uri;
_code = code;
}
-
+
/* ------------------------------------------------------------ */
@Test
public void testHandler()
@@ -104,7 +104,7 @@ public class IPAccessHandlerTest
{
_handler.setWhite(_white.split(";",-1));
_handler.setBlack(_black.split(";",-1));
-
+
String request = "GET " + _uri + " HTTP/1.1\n" + "Host: "+ _host + "\n\n";
Socket socket = new Socket("127.0.0.1", _connector.getLocalPort());
socket.setSoTimeout(5000);
@@ -231,7 +231,7 @@ public class IPAccessHandlerTest
return builder.toString();
}
}
-
+
/* ------------------------------------------------------------ */
@Parameters
public static Collection