Browse Source

Stop throwing PortInUseException for unassignable address

Previously, an unassignable address would result in NettyWebServer
incorrectly throwing a PortInUseException.

Fixes gh-47618
pull/48100/head
Andy Wilkinson 3 months ago
parent
commit
5229ac7e58
  1. 2
      spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/netty/NettyWebServer.java
  2. 13
      spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java

2
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/netty/NettyWebServer.java

@ -117,7 +117,7 @@ public class NettyWebServer implements WebServer { @@ -117,7 +117,7 @@ public class NettyWebServer implements WebServer {
catch (Exception ex) {
PortInUseException.ifCausedBy(ex, ChannelBindException.class, (bindException) -> {
if (bindException.localPort() > 0 && !isPermissionDenied(bindException.getCause())) {
throw new PortInUseException(bindException.localPort(), ex);
PortInUseException.throwIfPortBindingException(bindException, bindException::localPort);
}
});
throw new WebServerException("Unable to start Netty", ex);

13
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/netty/NettyReactiveWebServerFactoryTests.java

@ -17,7 +17,9 @@ @@ -17,7 +17,9 @@
package org.springframework.boot.web.embedded.netty;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.time.Duration;
import java.util.Arrays;
@ -45,6 +47,7 @@ import org.springframework.boot.web.reactive.server.AbstractReactiveWebServerFac @@ -45,6 +47,7 @@ import org.springframework.boot.web.reactive.server.AbstractReactiveWebServerFac
import org.springframework.boot.web.server.PortInUseException;
import org.springframework.boot.web.server.Shutdown;
import org.springframework.boot.web.server.Ssl;
import org.springframework.boot.web.server.WebServerException;
import org.springframework.http.MediaType;
import org.springframework.http.client.ReactorResourceFactory;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
@ -70,7 +73,7 @@ import static org.mockito.Mockito.mock; @@ -70,7 +73,7 @@ import static org.mockito.Mockito.mock;
class NettyReactiveWebServerFactoryTests extends AbstractReactiveWebServerFactoryTests {
@Test
void exceptionIsThrownWhenPortIsAlreadyInUse() {
void portInUseExceptionIsThrownWhenPortIsAlreadyInUse() {
AbstractReactiveWebServerFactory factory = getFactory();
factory.setPort(0);
this.webServer = factory.getWebServer(new EchoHandler());
@ -81,6 +84,14 @@ class NettyReactiveWebServerFactoryTests extends AbstractReactiveWebServerFactor @@ -81,6 +84,14 @@ class NettyReactiveWebServerFactoryTests extends AbstractReactiveWebServerFactor
.withCauseInstanceOf(Throwable.class);
}
@Test
void webServerExceptionIsThrownWhenAddressCannotBeAssigned() throws UnknownHostException {
AbstractReactiveWebServerFactory factory = getFactory();
factory.setPort(8080);
factory.setAddress(InetAddress.getByName("1.2.3.4"));
assertThatExceptionOfType(WebServerException.class).isThrownBy(factory.getWebServer(new EchoHandler())::start);
}
@Test
void getPortWhenDisposableServerPortOperationIsUnsupportedReturnsMinusOne() {
NettyReactiveWebServerFactory factory = new NoPortNettyReactiveWebServerFactory(0);

Loading…
Cancel
Save