Skip to content

Commit 19cc388

Browse files
committed
Test Tomcat's handling of a request on an idle connection
See gh-4657
1 parent b8cb61b commit 19cc388

File tree

1 file changed

+36
-1
lines changed

1 file changed

+36
-1
lines changed

Diff for: spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactoryTests.java

+36-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.File;
2020
import java.io.IOException;
21+
import java.net.SocketException;
2122
import java.net.URISyntaxException;
2223
import java.nio.charset.Charset;
2324
import java.nio.charset.StandardCharsets;
@@ -57,7 +58,9 @@
5758
import org.apache.coyote.ProtocolHandler;
5859
import org.apache.coyote.http11.AbstractHttp11Protocol;
5960
import org.apache.http.HttpResponse;
61+
import org.apache.http.client.HttpClient;
6062
import org.apache.http.conn.HttpHostConnectException;
63+
import org.apache.http.impl.client.HttpClients;
6164
import org.apache.jasper.servlet.JspServlet;
6265
import org.apache.tomcat.JarScanFilter;
6366
import org.apache.tomcat.JarScanType;
@@ -582,8 +585,40 @@ void whenServerIsShuttingDownGracefullyThenNewConnectionsCannotBeMade() throws E
582585
assertThat(shutdownResult.get()).isEqualTo(false);
583586
blockingServlet.admitOne();
584587
assertThat(request.get()).isInstanceOf(HttpResponse.class);
585-
this.webServer.stop();
586588
assertThat(unconnectableRequest.get()).isInstanceOf(HttpHostConnectException.class);
589+
this.webServer.stop();
590+
}
591+
592+
@Test
593+
void whenServerIsShuttingDownARequestOnAnIdleConnectionResultsInConnectionReset() throws Exception {
594+
AbstractServletWebServerFactory factory = getFactory();
595+
Shutdown shutdown = new Shutdown();
596+
shutdown.setGracePeriod(Duration.ofSeconds(5));
597+
factory.setShutdown(shutdown);
598+
BlockingServlet blockingServlet = new BlockingServlet();
599+
this.webServer = factory.getWebServer((context) -> {
600+
Dynamic registration = context.addServlet("blockingServlet", blockingServlet);
601+
registration.addMapping("/blocking");
602+
registration.setAsyncSupported(true);
603+
});
604+
HttpClient httpClient = HttpClients.createMinimal();
605+
this.webServer.start();
606+
int port = this.webServer.getPort();
607+
Future<Object> keepAliveRequest = initiateGetRequest(httpClient, port, "/blocking");
608+
blockingServlet.awaitQueue();
609+
blockingServlet.admitOne();
610+
assertThat(keepAliveRequest.get()).isInstanceOf(HttpResponse.class);
611+
Future<Object> request = initiateGetRequest(port, "/blocking");
612+
blockingServlet.awaitQueue();
613+
initiateGracefulShutdown();
614+
Future<Object> idleConnectionRequest = initiateGetRequest(httpClient, port, "/blocking");
615+
blockingServlet.admitOne();
616+
Object response = request.get();
617+
assertThat(response).isInstanceOf(HttpResponse.class);
618+
Object idleConnectionRequestResult = idleConnectionRequest.get();
619+
assertThat(idleConnectionRequestResult).isInstanceOf(SocketException.class);
620+
assertThat((SocketException) idleConnectionRequestResult).hasMessage("Connection reset");
621+
this.webServer.stop();
587622
}
588623

589624
@Override

0 commit comments

Comments
 (0)