Merge pull request #24606 from spartusch

* pr/24606:
  Polish "Return -1 port for non-listening WebServers"
  Return -1 port for non-listening WebServers

Closes gh-24606
pull/25129/head
Phillip Webb 4 years ago
commit 78259214bb

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -207,18 +207,6 @@ public class JettyWebServer implements WebServer {
return ports.toString(); return ports.toString();
} }
private Integer getLocalPort(Connector connector) {
try {
// Jetty 9 internals are different, but the method name is the same
return (Integer) ReflectionUtils
.invokeMethod(ReflectionUtils.findMethod(connector.getClass(), "getLocalPort"), connector);
}
catch (Exception ex) {
logger.info("could not determine port ( " + ex.getMessage() + ")");
return 0;
}
}
private String getProtocols(Connector connector) { private String getProtocols(Connector connector) {
List<String> protocols = connector.getProtocols(); List<String> protocols = connector.getProtocols();
return " (" + StringUtils.collectionToDelimitedString(protocols, ", ") + ")"; return " (" + StringUtils.collectionToDelimitedString(protocols, ", ") + ")";
@ -276,8 +264,29 @@ public class JettyWebServer implements WebServer {
public int getPort() { public int getPort() {
Connector[] connectors = this.server.getConnectors(); Connector[] connectors = this.server.getConnectors();
for (Connector connector : connectors) { for (Connector connector : connectors) {
// Probably only one... Integer localPort = getLocalPort(connector);
return getLocalPort(connector); if (localPort != null && localPort > 0) {
return localPort;
}
}
return -1;
}
private Integer getLocalPort(Connector connector) {
try {
if (connector instanceof NetworkConnector) {
return ((NetworkConnector) connector).getLocalPort();
}
}
catch (Exception ex) {
}
try {
// Jetty 9 internals are different, but the method name is the same
return (Integer) ReflectionUtils
.invokeMethod(ReflectionUtils.findMethod(connector.getClass(), "getLocalPort"), connector);
}
catch (Exception ex) {
logger.info("could not determine port ( " + ex.getMessage() + ")");
} }
return 0; return 0;
} }

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -192,7 +192,7 @@ public class NettyWebServer implements WebServer {
if (this.disposableServer != null) { if (this.disposableServer != null) {
return this.disposableServer.port(); return this.disposableServer.port();
} }
return 0; return -1;
} }
} }

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -364,7 +364,7 @@ public class TomcatWebServer implements WebServer {
if (connector != null) { if (connector != null) {
return connector.getLocalPort(); return connector.getLocalPort();
} }
return 0; return -1;
} }
private String getContextPath() { private String getContextPath() {

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -295,7 +295,7 @@ public class UndertowWebServer implements WebServer {
public int getPort() { public int getPort() {
List<Port> ports = getActualPorts(); List<Port> ports = getActualPorts();
if (ports.isEmpty()) { if (ports.isEmpty()) {
return 0; return -1;
} }
return ports.get(0).getNumber(); return ports.get(0).getNumber();
} }

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -115,6 +115,16 @@ public abstract class AbstractReactiveWebServerFactoryTests {
assertThat(this.webServer.getPort()).isEqualTo(specificPort); assertThat(this.webServer.getPort()).isEqualTo(specificPort);
} }
@Test
void portIsMinusOneWhenConnectionIsClosed() {
AbstractReactiveWebServerFactory factory = getFactory();
this.webServer = factory.getWebServer(new EchoHandler());
this.webServer.start();
assertThat(this.webServer.getPort()).isGreaterThan(0);
this.webServer.stop();
assertThat(this.webServer.getPort()).isEqualTo(-1);
}
@Test @Test
void basicSslFromClassPath() { void basicSslFromClassPath() {
testBasicSslWithKeyStore("classpath:test.jks", "password"); testBasicSslWithKeyStore("classpath:test.jks", "password");

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -250,7 +250,7 @@ public abstract class AbstractServletWebServerFactoryTests {
factory.setPort(-1); factory.setPort(-1);
this.webServer = factory.getWebServer(exampleServletRegistration()); this.webServer = factory.getWebServer(exampleServletRegistration());
this.webServer.start(); this.webServer.start();
assertThat(this.webServer.getPort()).isLessThan(0); // Jetty is -2 assertThat(this.webServer.getPort()).isEqualTo(-1);
} }
@Test @Test
@ -300,6 +300,16 @@ public abstract class AbstractServletWebServerFactoryTests {
assertThat(servlet.getInitCount()).isEqualTo(1); assertThat(servlet.getInitCount()).isEqualTo(1);
} }
@Test
void portIsMinusOneWhenConnectionIsClosed() {
AbstractServletWebServerFactory factory = getFactory();
this.webServer = factory.getWebServer();
this.webServer.start();
assertThat(this.webServer.getPort()).isGreaterThan(0);
this.webServer.stop();
assertThat(this.webServer.getPort()).isEqualTo(-1);
}
@Test @Test
void specificPort() throws Exception { void specificPort() throws Exception {
AbstractServletWebServerFactory factory = getFactory(); AbstractServletWebServerFactory factory = getFactory();

Loading…
Cancel
Save