Issue #305 (NPE when notifying the session listener if the channel is closed before a session has been opened)

Added guard against NPE. It was needed since the connection may not
be present if the connect operation failed.
This commit is contained in:
Simone Bordet 2016-03-07 17:00:52 +01:00
parent 3b0f577aed
commit 8af356bc0d
3 changed files with 35 additions and 2 deletions

View File

@ -199,7 +199,9 @@ public class HttpClientTransportOverHTTP2 extends ContainerLifeCycle implements
@Override @Override
public void onFailure(Session session, Throwable failure) public void onFailure(Session session, Throwable failure)
{ {
connection.close(failure); HttpConnectionOverHTTP2 c = connection;
if (c != null)
c.close(failure);
} }
} }
} }

View File

@ -154,7 +154,7 @@ public abstract class AbstractTest
return result.toArray(new ConnectionFactory[result.size()]); return result.toArray(new ConnectionFactory[result.size()]);
} }
private HttpClientTransport provideClientTransport(Transport transport) protected HttpClientTransport provideClientTransport(Transport transport)
{ {
switch (transport) switch (transport)
{ {

View File

@ -20,6 +20,7 @@ package org.eclipse.jetty.http.client;
import java.io.IOException; import java.io.IOException;
import java.io.InterruptedIOException; import java.io.InterruptedIOException;
import java.util.EnumSet;
import java.util.Random; import java.util.Random;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -39,7 +40,10 @@ import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http2.FlowControlStrategy; import org.eclipse.jetty.http2.FlowControlStrategy;
import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test; import org.junit.Test;
public class HttpClientTest extends AbstractTest public class HttpClientTest extends AbstractTest
@ -285,6 +289,33 @@ public class HttpClientTest extends AbstractTest
Assert.assertEquals(response.getStatus(), 200); Assert.assertEquals(response.getStatus(), 200);
} }
@Test(expected = ExecutionException.class)
public void testClientCannotValidateServerCertificate() throws Exception
{
// Only run this test for transports over TLS.
Assume.assumeTrue(EnumSet.of(Transport.HTTPS, Transport.H2).contains(transport));
startServer(new AbstractHandler()
{
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
baseRequest.setHandled(true);
}
});
// Use a default SslContextFactory, requests should fail because the server certificate is unknown.
client = newHttpClient(provideClientTransport(transport), new SslContextFactory());
QueuedThreadPool clientThreads = new QueuedThreadPool();
clientThreads.setName("client");
client.setExecutor(clientThreads);
client.start();
client.newRequest(newURI())
.timeout(5, TimeUnit.SECONDS)
.send();
}
private void sleep(long time) throws IOException private void sleep(long time) throws IOException
{ {
try try