Issue #2114 Fix NPE in JettyHttpServerProvider
Signed-off-by: Jan Bartel <janb@webtide.com>
This commit is contained in:
parent
298580625e
commit
8d11b02760
|
@ -17,6 +17,12 @@
|
||||||
<artifactId>jetty-test-helper</artifactId>
|
<artifactId>jetty-test-helper</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-client</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.sun.net.httpserver</groupId>
|
<groupId>com.sun.net.httpserver</groupId>
|
||||||
<artifactId>http</artifactId>
|
<artifactId>http</artifactId>
|
||||||
|
|
|
@ -106,10 +106,16 @@ public class JettyHttpServer extends com.sun.net.httpserver.HttpServer
|
||||||
ServerConnector connector = new ServerConnector(_server);
|
ServerConnector connector = new ServerConnector(_server);
|
||||||
connector.setPort(addr.getPort());
|
connector.setPort(addr.getPort());
|
||||||
connector.setHost(addr.getHostName());
|
connector.setHost(addr.getHostName());
|
||||||
|
|
||||||
_server.addConnector(connector);
|
_server.addConnector(connector);
|
||||||
|
|
||||||
_connectors.put(addr.getHostName() + addr.getPort(), connector);
|
_connectors.put(addr.getHostName() + addr.getPort(), connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Server getServer()
|
||||||
|
{
|
||||||
|
return _server;
|
||||||
|
}
|
||||||
|
|
||||||
protected ServerConnector newServerConnector(InetSocketAddress addr,int backlog)
|
protected ServerConnector newServerConnector(InetSocketAddress addr,int backlog)
|
||||||
{
|
{
|
||||||
|
|
|
@ -66,7 +66,8 @@ public class JettyHttpServerProvider extends HttpServerProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
JettyHttpServer jettyHttpServer = new JettyHttpServer(server, shared);
|
JettyHttpServer jettyHttpServer = new JettyHttpServer(server, shared);
|
||||||
jettyHttpServer.bind(addr, backlog);
|
if (addr != null)
|
||||||
|
jettyHttpServer.bind(addr, backlog);
|
||||||
return jettyHttpServer;
|
return jettyHttpServer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,13 +18,26 @@
|
||||||
|
|
||||||
package org.eclipse.jetty.http.spi;
|
package org.eclipse.jetty.http.spi;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.client.HttpClient;
|
||||||
|
import org.eclipse.jetty.client.api.ContentResponse;
|
||||||
|
import org.eclipse.jetty.client.api.Request;
|
||||||
|
import org.eclipse.jetty.client.util.BasicAuthentication;
|
||||||
|
import org.eclipse.jetty.server.NetworkConnector;
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.net.InetAddress;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.URI;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import com.sun.net.httpserver.BasicAuthenticator;
|
import com.sun.net.httpserver.BasicAuthenticator;
|
||||||
import com.sun.net.httpserver.Headers;
|
import com.sun.net.httpserver.Headers;
|
||||||
import com.sun.net.httpserver.HttpContext;
|
import com.sun.net.httpserver.HttpContext;
|
||||||
|
@ -32,57 +45,182 @@ import com.sun.net.httpserver.HttpExchange;
|
||||||
import com.sun.net.httpserver.HttpHandler;
|
import com.sun.net.httpserver.HttpHandler;
|
||||||
import com.sun.net.httpserver.HttpServer;
|
import com.sun.net.httpserver.HttpServer;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class TestSPIServer
|
public class TestSPIServer
|
||||||
{
|
{
|
||||||
public static void main(String[] args) throws Exception
|
|
||||||
|
/**
|
||||||
|
* Create a server that has a null InetSocketAddress, then
|
||||||
|
* bind before using.
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testUnboundHttpServer() throws Exception
|
||||||
{
|
{
|
||||||
String host="localhost";
|
|
||||||
int port = 8080;
|
HttpServer server = null;
|
||||||
|
|
||||||
HttpServer server = new JettyHttpServerProvider().createHttpServer(new
|
try
|
||||||
InetSocketAddress(host, port), 10);
|
|
||||||
server.start();
|
|
||||||
|
|
||||||
final HttpContext httpContext = server.createContext("/",
|
|
||||||
new HttpHandler()
|
|
||||||
{
|
{
|
||||||
|
//ensure no InetSocketAddress is passed
|
||||||
|
server = new JettyHttpServerProvider().createHttpServer(null, 10);
|
||||||
|
|
||||||
public void handle(HttpExchange exchange) throws IOException
|
final HttpContext httpContext = server.createContext("/",
|
||||||
|
new HttpHandler()
|
||||||
{
|
{
|
||||||
Headers responseHeaders = exchange.getResponseHeaders();
|
|
||||||
responseHeaders.set("Content-Type","text/plain");
|
|
||||||
exchange.sendResponseHeaders(200,0);
|
|
||||||
|
|
||||||
OutputStream responseBody = exchange.getResponseBody();
|
public void handle(HttpExchange exchange) throws IOException
|
||||||
Headers requestHeaders = exchange.getRequestHeaders();
|
|
||||||
Set<String> keySet = requestHeaders.keySet();
|
|
||||||
Iterator<String> iter = keySet.iterator();
|
|
||||||
while (iter.hasNext())
|
|
||||||
{
|
{
|
||||||
String key = iter.next();
|
Headers responseHeaders = exchange.getResponseHeaders();
|
||||||
List values = requestHeaders.get(key);
|
responseHeaders.set("Content-Type","text/plain");
|
||||||
String s = key + " = " + values.toString() + "\n";
|
exchange.sendResponseHeaders(200,0);
|
||||||
responseBody.write(s.getBytes());
|
|
||||||
}
|
|
||||||
responseBody.close();
|
|
||||||
|
|
||||||
}
|
OutputStream responseBody = exchange.getResponseBody();
|
||||||
});
|
Headers requestHeaders = exchange.getRequestHeaders();
|
||||||
|
Set<String> keySet = requestHeaders.keySet();
|
||||||
httpContext.setAuthenticator(new BasicAuthenticator("Test")
|
Iterator<String> iter = keySet.iterator();
|
||||||
{
|
while (iter.hasNext())
|
||||||
@Override
|
{
|
||||||
public boolean checkCredentials(String username, String password)
|
String key = iter.next();
|
||||||
|
List values = requestHeaders.get(key);
|
||||||
|
String s = key + " = " + values.toString() + "\n";
|
||||||
|
responseBody.write(s.getBytes());
|
||||||
|
}
|
||||||
|
responseBody.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
httpContext.setAuthenticator(new BasicAuthenticator("Test")
|
||||||
{
|
{
|
||||||
if ("username".equals(username) && password.equals("password"))
|
@Override
|
||||||
return true;
|
public boolean checkCredentials(String username, String password)
|
||||||
return false;
|
{
|
||||||
|
if ("username".equals(username) && password.equals("password"))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//now bind one. Use port '0' to let jetty pick the
|
||||||
|
//address to bind so this test isn't port-specific
|
||||||
|
//and thus is portable and can be run concurrently on CI
|
||||||
|
//environments
|
||||||
|
server.bind(new InetSocketAddress("localhost", 0), 10);
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
|
||||||
|
//find out the port jetty picked
|
||||||
|
Server jetty = ((JettyHttpServer)server).getServer();
|
||||||
|
int port = ((NetworkConnector)jetty.getConnectors()[0]).getLocalPort();
|
||||||
|
|
||||||
|
HttpClient client = new HttpClient();
|
||||||
|
client.start();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Request request = client.newRequest("http://localhost:" + port + "/");
|
||||||
|
client.getAuthenticationStore().addAuthentication(new BasicAuthentication(URI.create("http://localhost:"+port), "Test", "username", "password"));
|
||||||
|
ContentResponse response = request.send();
|
||||||
|
assertEquals(HttpServletResponse.SC_OK,response.getStatus());
|
||||||
}
|
}
|
||||||
});
|
finally
|
||||||
|
{
|
||||||
|
client.stop();
|
||||||
Thread.sleep(10000000);
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (server != null)
|
||||||
|
server.stop(5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test using a server that is created with a given InetSocketAddress
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testBoundHttpServer() throws Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
HttpServer server = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//use an InetSocketAddress, but use port value of '0' to allow
|
||||||
|
//jetty to pick a free port. Ensures test is not tied to specific port number
|
||||||
|
//for test portability and concurrency.
|
||||||
|
server = new JettyHttpServerProvider().createHttpServer(new
|
||||||
|
InetSocketAddress("localhost", 0), 10);
|
||||||
|
|
||||||
|
final HttpContext httpContext = server.createContext("/",
|
||||||
|
new HttpHandler()
|
||||||
|
{
|
||||||
|
|
||||||
|
public void handle(HttpExchange exchange) throws IOException
|
||||||
|
{
|
||||||
|
Headers responseHeaders = exchange.getResponseHeaders();
|
||||||
|
responseHeaders.set("Content-Type","text/plain");
|
||||||
|
exchange.sendResponseHeaders(200,0);
|
||||||
|
|
||||||
|
OutputStream responseBody = exchange.getResponseBody();
|
||||||
|
Headers requestHeaders = exchange.getRequestHeaders();
|
||||||
|
Set<String> keySet = requestHeaders.keySet();
|
||||||
|
Iterator<String> iter = keySet.iterator();
|
||||||
|
while (iter.hasNext())
|
||||||
|
{
|
||||||
|
String key = iter.next();
|
||||||
|
List values = requestHeaders.get(key);
|
||||||
|
String s = key + " = " + values.toString() + "\n";
|
||||||
|
responseBody.write(s.getBytes());
|
||||||
|
}
|
||||||
|
responseBody.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
httpContext.setAuthenticator(new BasicAuthenticator("Test")
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public boolean checkCredentials(String username, String password)
|
||||||
|
{
|
||||||
|
if ("username".equals(username) && password.equals("password"))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
server.start();
|
||||||
|
|
||||||
|
//find out the port jetty picked
|
||||||
|
Server jetty = ((JettyHttpServer)server).getServer();
|
||||||
|
int port = ((NetworkConnector)jetty.getConnectors()[0]).getLocalPort();
|
||||||
|
|
||||||
|
HttpClient client = new HttpClient();
|
||||||
|
client.start();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Request request = client.newRequest("http://localhost:" + port + "/");
|
||||||
|
client.getAuthenticationStore().addAuthentication(new BasicAuthentication(URI.create("http://localhost:"+port), "Test", "username", "password"));
|
||||||
|
ContentResponse response = request.send();
|
||||||
|
assertEquals(HttpServletResponse.SC_OK,response.getStatus());
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
client.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (server != null)
|
||||||
|
server.stop(5);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue