#2718 take care of starting new created context (#3145)

Signed-off-by: olivier lamy <oliver.lamy@gmail.com>
This commit is contained in:
Olivier Lamy 2018-11-30 17:55:51 +10:00 committed by GitHub
parent 132aef4420
commit b4ab8a07c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 117 additions and 26 deletions

View File

@ -243,6 +243,18 @@ public class JettyHttpServer extends com.sun.net.httpserver.HttpServer
chc.addHandler(jettyContextHandler); chc.addHandler(jettyContextHandler);
_contexts.put(path, context); _contexts.put(path, context);
if(!jettyContextHandler.isStarted())
{
try
{
jettyContextHandler.start();
}
catch ( Exception e )
{
throw new RuntimeException( e.getMessage(), e );
}
}
return context; return context;
} }

View File

@ -18,9 +18,9 @@
package org.eclipse.jetty.http.spi; package org.eclipse.jetty.http.spi;
import java.io.IOException; import com.sun.net.httpserver.HttpServer;
import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpsServer;
import com.sun.net.httpserver.spi.HttpServerProvider;
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
@ -29,9 +29,8 @@ import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.util.thread.ThreadPool; import org.eclipse.jetty.util.thread.ThreadPool;
import com.sun.net.httpserver.HttpServer; import java.io.IOException;
import com.sun.net.httpserver.HttpsServer; import java.net.InetSocketAddress;
import com.sun.net.httpserver.spi.HttpServerProvider;
/** /**
* Jetty implementation of <a href="http://java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/index.html">Java HTTP Server SPI</a> * Jetty implementation of <a href="http://java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/index.html">Java HTTP Server SPI</a>

View File

@ -18,68 +18,148 @@
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.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import javax.jws.WebMethod; import javax.jws.WebMethod;
import javax.jws.WebService; import javax.jws.WebService;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Endpoint; import javax.xml.ws.Endpoint;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import java.net.URL;
public class TestEndpointMultiplePublishProblem public class TestEndpointMultiplePublishProblem
{ {
private static String default_impl = System.getProperty("com.sun.net.httpserver.HttpServerProvider"); private static String default_impl = System.getProperty( "com.sun.net.httpserver.HttpServerProvider" );
@BeforeAll @BeforeAll
public static void change_Impl() public static void change_Impl()
{ {
System.setProperty("com.sun.net.httpserver.HttpServerProvider", JettyHttpServerProvider.class.getName()); System.setProperty( "com.sun.net.httpserver.HttpServerProvider", JettyHttpServerProvider.class.getName() );
} }
@AfterAll @AfterAll
public static void restore_Impl() public static void restore_Impl()
{ {
if(default_impl != null) if ( default_impl != null )
{ {
System.setProperty( "com.sun.net.httpserver.HttpServerProvider", default_impl ); System.setProperty( "com.sun.net.httpserver.HttpServerProvider", default_impl );
} }
} }
@Test @Test
public void mainJetty() throws Exception { public void mainJetty()
throws Exception
{
Server jettyWebServer = new Server(new DelegatingThreadPool(new QueuedThreadPool())); Server jettyWebServer = new Server( new DelegatingThreadPool( new QueuedThreadPool() ) );
ServerConnector connector = new ServerConnector(jettyWebServer); ServerConnector connector = new ServerConnector( jettyWebServer );
connector.setHost("localhost"); connector.setHost( "localhost" );
connector.setPort(0); connector.setPort( 0 );
connector.setReuseAddress(true); connector.setReuseAddress( true );
jettyWebServer.addConnector(connector); jettyWebServer.addConnector( connector );
jettyWebServer.setHandler(new ContextHandlerCollection()); jettyWebServer.setHandler( new ContextHandlerCollection() );
JettyHttpServerProvider.setServer(jettyWebServer); JettyHttpServerProvider.setServer( jettyWebServer );
jettyWebServer.start(); jettyWebServer.start();
Endpoint.publish(String.format("http://%s:%d/hello", "localhost", 0), new Ws()); Endpoint.publish( String.format( "http://%s:%d/hello", "localhost", 0 ), new WsHello() );
// Comment out the below line for success in later java such as java8_u172, works before u151 or so Endpoint.publish( String.format( "http://%s:%d/hello2", "localhost", 0 ), new WsHello() );
Endpoint.publish(String.format("http://%s:%d/hello2", "localhost", 0), new Ws());
int port = connector.getLocalPort(); int port = connector.getLocalPort();
System.out.printf("Started, check: http://localhost:%d/hello?wsdl%n", port); HttpClient httpClient = new HttpClient();
httpClient.start();
{
String url = String.format( "http://localhost:%d/hello", port );
String urlWsdl = url + "?wsdl";
ContentResponse contentResponse = httpClient.newRequest( url ).send();
Assertions.assertEquals( 200, contentResponse.getStatus() );
HelloMessengerService helloMessengerService = new HelloMessengerService( new URL( urlWsdl ) );
Hello hello = helloMessengerService.getHelloMessengerPort();
( (BindingProvider) hello ).getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url );
String helloResponse = hello.hello();
Assertions.assertEquals( "G'Day mate!", helloResponse );
}
{
String url2 = String.format( "http://localhost:%d/hello2", port );
String url2Wsdl = url2 + "?wsdl";
ContentResponse contentResponse = httpClient.newRequest( url2Wsdl ).send();
Assertions.assertEquals( 200, contentResponse.getStatus() );
HelloMessengerService helloMessengerService = new HelloMessengerService( new URL( url2Wsdl ) );
Hello hello = helloMessengerService.getHelloMessengerPort();
( (BindingProvider) hello ).getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url2 );
String helloResponse = hello.hello();
Assertions.assertEquals( "G'Day mate!", helloResponse );
}
httpClient.stop();
jettyWebServer.stop();
}
@WebService( targetNamespace = "http://org.eclipse.jetty.ws.test", name = "HelloService" )
public interface Hello
{
@WebMethod
String hello();
} }
@WebService @WebService( targetNamespace = "http://org.eclipse.jetty.ws.test", name = "HelloService" )
public static class Ws { public static class WsHello
implements Hello
{
@WebMethod @WebMethod
public String hello() { public String hello()
return "Hello"; {
return "G'Day mate!";
} }
} }
@WebServiceClient( name = "HelloService", targetNamespace = "http://org.eclipse.jetty.ws.test" )
public static class HelloMessengerService
extends Service
{
public HelloMessengerService( URL wsdlLocation )
{
super( wsdlLocation, //
new QName( "http://org.eclipse.jetty.ws.test", "WsHelloService" ) );
}
@WebEndpoint( name = "HelloServicePort" )
public Hello getHelloMessengerPort()
{
return super.getPort( new QName( "http://org.eclipse.jetty.ws.test", "HelloServicePort" ), //
Hello.class );
}
}
private void assertWsdl( String wsdl )
throws Exception
{
}
} }