Skip to content

Commit b8cb61b

Browse files
committed
Align embedded Jetty's graceful shutdown behaviour with standalone
Standalone Jetty will, by default, include a Connection: close header in all responses once graceful shutdown has begun. Previously, the way in which we were shutting Jetty down did not cause this to happen. This commit updates JettyGracefulShutdown to shut down each connector. This causes Jetty to send the Connection: close header, aligning its behaviour more closely with what it does when used standalone. The tests have also been updated to verify this behaviour and to ensure that the correct port is used for requests even once the connector is no longer bound and the web server no longer knows its ephemeral port. See gh-4657
1 parent 5bb66e1 commit b8cb61b

10 files changed

+127
-63
lines changed

Diff for: spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/jetty/JettyGracefulShutdown.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
package org.springframework.boot.web.embedded.jetty;
1818

1919
import java.time.Duration;
20+
import java.util.concurrent.ExecutionException;
2021
import java.util.function.Supplier;
2122

2223
import org.apache.commons.logging.Log;
2324
import org.apache.commons.logging.LogFactory;
2425
import org.eclipse.jetty.server.Connector;
2526
import org.eclipse.jetty.server.Server;
26-
import org.eclipse.jetty.server.ServerConnector;
2727

2828
import org.springframework.boot.web.server.GracefulShutdown;
2929

@@ -55,7 +55,15 @@ public boolean shutDownGracefully() {
5555
logger.info("Commencing graceful shutdown, allowing up to " + this.period.getSeconds()
5656
+ "s for active requests to complete");
5757
for (Connector connector : this.server.getConnectors()) {
58-
((ServerConnector) connector).setAccepting(false);
58+
try {
59+
connector.shutdown().get();
60+
}
61+
catch (InterruptedException ex) {
62+
Thread.currentThread().interrupt();
63+
}
64+
catch (ExecutionException ex) {
65+
// Continue
66+
}
5967
}
6068
this.shuttingDown = true;
6169
long end = System.currentTimeMillis() + this.period.toMillis();

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

+9-24
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@
1616

1717
package org.springframework.boot.web.embedded.jetty;
1818

19+
import java.net.ConnectException;
1920
import java.net.InetAddress;
2021
import java.time.Duration;
21-
import java.util.ArrayList;
2222
import java.util.Arrays;
23-
import java.util.List;
2423
import java.util.concurrent.CountDownLatch;
2524
import java.util.concurrent.Future;
26-
import java.util.concurrent.TimeUnit;
2725

2826
import org.eclipse.jetty.server.Connector;
2927
import org.eclipse.jetty.server.Server;
@@ -39,6 +37,7 @@
3937
import org.springframework.http.server.reactive.HttpHandler;
4038

4139
import static org.assertj.core.api.Assertions.assertThat;
40+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
4241
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
4342
import static org.mockito.ArgumentMatchers.any;
4443
import static org.mockito.Mockito.inOrder;
@@ -128,32 +127,18 @@ void whenServerIsShuttingDownGracefullyThenNewConnectionsCannotBeMade() throws E
128127
BlockingHandler blockingHandler = new BlockingHandler();
129128
this.webServer = factory.getWebServer(blockingHandler);
130129
this.webServer.start();
130+
int port = this.webServer.getPort();
131131
CountDownLatch responseLatch = new CountDownLatch(1);
132-
getWebClient().build().get().retrieve().toBodilessEntity().subscribe((response) -> responseLatch.countDown());
132+
getWebClient(port).build().get().retrieve().toBodilessEntity()
133+
.subscribe((response) -> responseLatch.countDown());
133134
blockingHandler.awaitQueue();
134135
Future<Boolean> shutdownResult = initiateGracefulShutdown();
135-
// We need to make two requests as Jetty accepts one additional request after a
136-
// connector has been told to stop accepting requests
137-
Mono<ResponseEntity<Void>> unconnectableRequest1 = getWebClient().build().get().retrieve().toBodilessEntity();
138-
Mono<ResponseEntity<Void>> unconnectableRequest2 = getWebClient().build().get().retrieve().toBodilessEntity();
136+
Mono<ResponseEntity<Void>> unconnectableRequest = getWebClient(port).build().get().retrieve()
137+
.toBodilessEntity();
139138
assertThat(shutdownResult.get()).isEqualTo(false);
140139
blockingHandler.completeOne();
141-
responseLatch.await(5, TimeUnit.SECONDS);
142-
this.webServer.stop();
143-
List<Object> results = new ArrayList<>();
144-
try {
145-
results.add(unconnectableRequest1.block());
146-
}
147-
catch (Exception ex) {
148-
results.add(ex);
149-
}
150-
try {
151-
results.add(unconnectableRequest2.block());
152-
}
153-
catch (Exception ex) {
154-
results.add(ex);
155-
}
156-
assertThat(results).anySatisfy((result) -> assertThat(result).isInstanceOf(Exception.class));
140+
assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> unconnectableRequest.block())
141+
.withCauseInstanceOf(ConnectException.class);
157142
}
158143

159144
@Override

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

+73-9
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import java.util.Arrays;
2222
import java.util.Collection;
2323
import java.util.Collections;
24-
import java.util.List;
24+
import java.util.concurrent.ExecutionException;
2525
import java.util.concurrent.Future;
2626
import java.util.regex.Matcher;
2727
import java.util.regex.Pattern;
@@ -30,8 +30,11 @@
3030
import javax.servlet.ServletContextListener;
3131
import javax.servlet.ServletRegistration.Dynamic;
3232

33+
import org.apache.http.Header;
3334
import org.apache.http.HttpResponse;
35+
import org.apache.http.client.HttpClient;
3436
import org.apache.http.conn.HttpHostConnectException;
37+
import org.apache.http.impl.client.HttpClients;
3538
import org.eclipse.jetty.server.Connector;
3639
import org.eclipse.jetty.server.Handler;
3740
import org.eclipse.jetty.server.Server;
@@ -189,19 +192,80 @@ void whenServerIsShuttingDownGracefullyThenNewConnectionsCannotBeMade() throws E
189192
registration.setAsyncSupported(true);
190193
});
191194
this.webServer.start();
192-
Future<Object> request = initiateGetRequest("/blocking");
195+
int port = this.webServer.getPort();
196+
Future<Object> request = initiateGetRequest(port, "/blocking");
193197
blockingServlet.awaitQueue();
194198
Future<Boolean> shutdownResult = initiateGracefulShutdown();
195-
// Jetty accepts one additional request after a connector has been told to stop
196-
// accepting requests
197-
Future<Object> unconnectableRequest1 = initiateGetRequest("/");
198-
Future<Object> unconnectableRequest2 = initiateGetRequest("/");
199+
Future<Object> unconnectableRequest = initiateGetRequest(port, "/");
199200
assertThat(shutdownResult.get()).isEqualTo(false);
200201
blockingServlet.admitOne();
201-
assertThat(request.get()).isInstanceOf(HttpResponse.class);
202+
Object response = request.get();
203+
assertThat(response).isInstanceOf(HttpResponse.class);
204+
assertThat(unconnectableRequest.get()).isInstanceOf(HttpHostConnectException.class);
202205
this.webServer.stop();
203-
List<Object> results = Arrays.asList(unconnectableRequest1.get(), unconnectableRequest2.get());
204-
assertThat(results).anySatisfy((result) -> assertThat(result).isInstanceOf(HttpHostConnectException.class));
206+
}
207+
208+
@Test
209+
void whenServerIsShuttingDownGracefullyThenResponseToRequestOnIdleConnectionWillHaveAConnectionCloseHeader()
210+
throws Exception {
211+
AbstractServletWebServerFactory factory = getFactory();
212+
Shutdown shutdown = new Shutdown();
213+
shutdown.setGracePeriod(Duration.ofSeconds(5));
214+
factory.setShutdown(shutdown);
215+
BlockingServlet blockingServlet = new BlockingServlet();
216+
this.webServer = factory.getWebServer((context) -> {
217+
Dynamic registration = context.addServlet("blockingServlet", blockingServlet);
218+
registration.addMapping("/blocking");
219+
registration.setAsyncSupported(true);
220+
});
221+
this.webServer.start();
222+
int port = this.webServer.getPort();
223+
HttpClient client = HttpClients.createMinimal();
224+
Future<Object> request = initiateGetRequest(client, port, "/blocking");
225+
blockingServlet.awaitQueue();
226+
blockingServlet.admitOne();
227+
Object response = request.get();
228+
assertThat(response).isInstanceOf(HttpResponse.class);
229+
assertThat(((HttpResponse) response).getStatusLine().getStatusCode()).isEqualTo(200);
230+
assertThat(((HttpResponse) response).getFirstHeader("Connection")).isNull();
231+
this.webServer.shutDownGracefully();
232+
request = initiateGetRequest(client, port, "/blocking");
233+
blockingServlet.awaitQueue();
234+
blockingServlet.admitOne();
235+
response = request.get();
236+
assertThat(response).isInstanceOf(HttpResponse.class);
237+
assertThat(((HttpResponse) response).getStatusLine().getStatusCode()).isEqualTo(200);
238+
assertThat(((HttpResponse) response).getFirstHeader("Connection")).isNotNull().extracting(Header::getValue)
239+
.isEqualTo("close");
240+
this.webServer.stop();
241+
}
242+
243+
@Test
244+
void whenARequestCompletesAfterGracefulShutdownHasBegunThenItHasAConnectionCloseHeader()
245+
throws InterruptedException, ExecutionException {
246+
AbstractServletWebServerFactory factory = getFactory();
247+
Shutdown shutdown = new Shutdown();
248+
shutdown.setGracePeriod(Duration.ofSeconds(30));
249+
factory.setShutdown(shutdown);
250+
BlockingServlet blockingServlet = new BlockingServlet();
251+
this.webServer = factory.getWebServer((context) -> {
252+
Dynamic registration = context.addServlet("blockingServlet", blockingServlet);
253+
registration.addMapping("/blocking");
254+
registration.setAsyncSupported(true);
255+
});
256+
this.webServer.start();
257+
int port = this.webServer.getPort();
258+
Future<Object> request = initiateGetRequest(port, "/blocking");
259+
blockingServlet.awaitQueue();
260+
long start = System.currentTimeMillis();
261+
Future<Boolean> shutdownResult = initiateGracefulShutdown();
262+
blockingServlet.admitOne();
263+
assertThat(shutdownResult.get()).isTrue();
264+
long end = System.currentTimeMillis();
265+
assertThat(end - start).isLessThanOrEqualTo(30000);
266+
Object requestResult = request.get();
267+
assertThat(requestResult).isInstanceOf(HttpResponse.class);
268+
assertThat(((HttpResponse) requestResult).getFirstHeader("Connection").getValue()).isEqualTo("close");
205269
}
206270

207271
private Ssl getSslSettings(String... enabledProtocols) {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ void whenServerIsShuttingDownGracefullyThenNewConnectionsCannotBeMade() throws E
112112
BlockingHandler blockingHandler = new BlockingHandler();
113113
this.webServer = factory.getWebServer(blockingHandler);
114114
this.webServer.start();
115-
WebClient webClient = getWebClient().build();
115+
WebClient webClient = getWebClient(this.webServer.getPort()).build();
116116
webClient.get().retrieve().toBodilessEntity().subscribe();
117117
blockingHandler.awaitQueue();
118118
Future<Boolean> shutdownResult = initiateGracefulShutdown();

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ void whenServerIsShuttingDownGracefullyThenNewConnectionsCannotBeMade() throws E
271271
BlockingHandler blockingHandler = new BlockingHandler();
272272
this.webServer = factory.getWebServer(blockingHandler);
273273
this.webServer.start();
274-
WebClient webClient = getWebClient().build();
274+
WebClient webClient = getWebClient(this.webServer.getPort()).build();
275275
webClient.get().retrieve().toBodilessEntity().subscribe();
276276
blockingHandler.awaitQueue();
277277
Future<Boolean> shutdownResult = initiateGracefulShutdown();

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -574,10 +574,11 @@ void whenServerIsShuttingDownGracefullyThenNewConnectionsCannotBeMade() throws E
574574
registration.setAsyncSupported(true);
575575
});
576576
this.webServer.start();
577-
Future<Object> request = initiateGetRequest("/blocking");
577+
int port = this.webServer.getPort();
578+
Future<Object> request = initiateGetRequest(port, "/blocking");
578579
blockingServlet.awaitQueue();
579580
Future<Boolean> shutdownResult = initiateGracefulShutdown();
580-
Future<Object> unconnectableRequest = initiateGetRequest("/");
581+
Future<Object> unconnectableRequest = initiateGetRequest(port, "/");
581582
assertThat(shutdownResult.get()).isEqualTo(false);
582583
blockingServlet.admitOne();
583584
assertThat(request.get()).isInstanceOf(HttpResponse.class);

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ void whenServerIsShuttingDownGracefullyThenNewConnectionsAreRejectedWithServiceU
118118
BlockingHandler blockingHandler = new BlockingHandler();
119119
this.webServer = factory.getWebServer(blockingHandler);
120120
this.webServer.start();
121-
WebClient webClient = getWebClient().build();
121+
WebClient webClient = getWebClient(this.webServer.getPort()).build();
122122
webClient.get().retrieve().toBodilessEntity().subscribe();
123123
blockingHandler.awaitQueue();
124124
Future<Boolean> shutdownResult = initiateGracefulShutdown();
@@ -146,7 +146,7 @@ private void testAccessLog(String prefix, String suffix, String expectedFile)
146146
assertThat(accessLogDirectory.listFiles()).isEmpty();
147147
this.webServer = factory.getWebServer(new EchoHandler());
148148
this.webServer.start();
149-
WebClient client = getWebClient().build();
149+
WebClient client = getWebClient(this.webServer.getPort()).build();
150150
Mono<String> result = client.post().uri("/test").contentType(MediaType.TEXT_PLAIN)
151151
.body(BodyInserters.fromValue("Hello World")).exchange()
152152
.flatMap((response) -> response.bodyToMono(String.class));

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -190,10 +190,11 @@ void whenServerIsShuttingDownGracefullyThenRequestsAreRejectedWithServiceUnavail
190190
registration.setAsyncSupported(true);
191191
});
192192
this.webServer.start();
193-
Future<Object> request = initiateGetRequest("/blocking");
193+
int port = this.webServer.getPort();
194+
Future<Object> request = initiateGetRequest(port, "/blocking");
194195
blockingServlet.awaitQueue();
195196
Future<Boolean> shutdownResult = initiateGracefulShutdown();
196-
Future<Object> rejectedRequest = initiateGetRequest("/");
197+
Future<Object> rejectedRequest = initiateGetRequest(port, "/");
197198
assertThat(shutdownResult.get()).isEqualTo(false);
198199
blockingServlet.admitOne();
199200
assertThat(request.get()).isInstanceOf(HttpResponse.class);

Diff for: spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java

+13-11
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ void specificPort() throws Exception {
109109
this.webServer.start();
110110
return port;
111111
});
112-
Mono<String> result = getWebClient().build().post().uri("/test").contentType(MediaType.TEXT_PLAIN)
113-
.body(BodyInserters.fromValue("Hello World")).exchange()
112+
Mono<String> result = getWebClient(this.webServer.getPort()).build().post().uri("/test")
113+
.contentType(MediaType.TEXT_PLAIN).body(BodyInserters.fromValue("Hello World")).exchange()
114114
.flatMap((response) -> response.bodyToMono(String.class));
115115
assertThat(result.block(Duration.ofSeconds(30))).isEqualTo("Hello World");
116116
assertThat(this.webServer.getPort()).isEqualTo(specificPort);
@@ -269,12 +269,12 @@ protected void testClientAuthFailure(Ssl sslConfiguration, ReactorClientHttpConn
269269
StepVerifier.create(result).expectError(SSLException.class).verify(Duration.ofSeconds(10));
270270
}
271271

272-
protected WebClient.Builder getWebClient() {
273-
return getWebClient(HttpClient.create().wiretap(true));
272+
protected WebClient.Builder getWebClient(int port) {
273+
return getWebClient(HttpClient.create().wiretap(true), port);
274274
}
275275

276-
protected WebClient.Builder getWebClient(HttpClient client) {
277-
InetSocketAddress address = new InetSocketAddress(this.webServer.getPort());
276+
protected WebClient.Builder getWebClient(HttpClient client, int port) {
277+
InetSocketAddress address = new InetSocketAddress(port);
278278
String baseUrl = "http://" + address.getHostString() + ":" + address.getPort();
279279
return WebClient.builder().clientConnector(new ReactorClientHttpConnector(client)).baseUrl(baseUrl);
280280
}
@@ -368,7 +368,8 @@ void whenARequestRemainsInFlightThenShutDownGracefullyReturnsFalseAfterPeriodEla
368368
BlockingHandler blockingHandler = new BlockingHandler();
369369
this.webServer = factory.getWebServer(blockingHandler);
370370
this.webServer.start();
371-
Mono<ResponseEntity<Void>> request = getWebClient().build().get().retrieve().toBodilessEntity();
371+
Mono<ResponseEntity<Void>> request = getWebClient(this.webServer.getPort()).build().get().retrieve()
372+
.toBodilessEntity();
372373
AtomicReference<ResponseEntity<Void>> responseReference = new AtomicReference<>();
373374
CountDownLatch responseLatch = new CountDownLatch(1);
374375
request.subscribe((response) -> {
@@ -399,7 +400,8 @@ void whenARequestCompletesDuringGracePeriodThenShutDownGracefullyReturnsTrueBefo
399400
BlockingHandler blockingHandler = new BlockingHandler();
400401
this.webServer = factory.getWebServer(blockingHandler);
401402
this.webServer.start();
402-
Mono<ResponseEntity<Void>> request = getWebClient().build().get().retrieve().toBodilessEntity();
403+
Mono<ResponseEntity<Void>> request = getWebClient(this.webServer.getPort()).build().get().retrieve()
404+
.toBodilessEntity();
403405
AtomicReference<ResponseEntity<Void>> responseReference = new AtomicReference<>();
404406
CountDownLatch responseLatch = new CountDownLatch(1);
405407
request.subscribe((response) -> {
@@ -437,7 +439,7 @@ protected WebClient prepareCompressionTest(Compression compression, String respo
437439
.tcpConfiguration((tcpClient) -> tcpClient.doOnConnected(
438440
(connection) -> connection.channel().pipeline().addBefore(NettyPipeline.HttpDecompressor,
439441
"CompressionTest", new CompressionDetectionHandler())));
440-
return getWebClient(client).build();
442+
return getWebClient(client, this.webServer.getPort()).build();
441443
}
442444

443445
protected void assertResponseIsCompressed(ResponseEntity<Void> response) {
@@ -451,8 +453,8 @@ protected void assertResponseIsNotCompressed(ResponseEntity<Void> response) {
451453
protected void assertForwardHeaderIsUsed(AbstractReactiveWebServerFactory factory) {
452454
this.webServer = factory.getWebServer(new XForwardedHandler());
453455
this.webServer.start();
454-
String body = getWebClient().build().get().header("X-Forwarded-Proto", "https").retrieve()
455-
.bodyToMono(String.class).block(Duration.ofSeconds(30));
456+
String body = getWebClient(this.webServer.getPort()).build().get().header("X-Forwarded-Proto", "https")
457+
.retrieve().bodyToMono(String.class).block(Duration.ofSeconds(30));
456458
assertThat(body).isEqualTo("https");
457459
}
458460

Diff for: spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java

+12-9
Original file line numberDiff line numberDiff line change
@@ -1041,7 +1041,8 @@ void whenARequestRemainsInFlightThenShutDownGracefullyReturnsFalseAfterPeriodEla
10411041
registration.addMapping("/blocking");
10421042
});
10431043
this.webServer.start();
1044-
Future<Object> request = initiateGetRequest("/blocking");
1044+
int port = this.webServer.getPort();
1045+
Future<Object> request = initiateGetRequest(port, "/blocking");
10451046
blockingServlet.awaitQueue();
10461047
long start = System.currentTimeMillis();
10471048
assertThat(this.webServer.shutDownGracefully()).isFalse();
@@ -1066,7 +1067,8 @@ void whenARequestCompletesAndTheConnectionIsClosedDuringGracePeriodThenShutDownG
10661067
registration.setAsyncSupported(true);
10671068
});
10681069
this.webServer.start();
1069-
Future<Object> request = initiateGetRequest("/blocking");
1070+
int port = this.webServer.getPort();
1071+
Future<Object> request = initiateGetRequest(port, "/blocking");
10701072
blockingServlet.awaitQueue();
10711073
long start = System.currentTimeMillis();
10721074
Future<Boolean> shutdownResult = initiateGracefulShutdown();
@@ -1090,7 +1092,8 @@ void whenAnAsyncRequestRemainsInFlightThenShutDownGracefullyReturnsFalseAfterPer
10901092
registration.setAsyncSupported(true);
10911093
});
10921094
this.webServer.start();
1093-
Future<Object> request = initiateGetRequest("/blockingAsync");
1095+
int port = this.webServer.getPort();
1096+
Future<Object> request = initiateGetRequest(port, "/blockingAsync");
10941097
blockingAsyncServlet.awaitQueue();
10951098
long start = System.currentTimeMillis();
10961099
assertThat(this.webServer.shutDownGracefully()).isFalse();
@@ -1115,7 +1118,8 @@ void whenAnAsyncRequestCompletesAndTheConnectionIsClosedDuringGracePeriodThenShu
11151118
registration.setAsyncSupported(true);
11161119
});
11171120
this.webServer.start();
1118-
Future<Object> request = initiateGetRequest("/blockingAsync");
1121+
int port = this.webServer.getPort();
1122+
Future<Object> request = initiateGetRequest(port, "/blockingAsync");
11191123
blockingAsyncServlet.awaitQueue();
11201124
long start = System.currentTimeMillis();
11211125
Future<Boolean> shutdownResult = initiateGracefulShutdown();
@@ -1133,15 +1137,14 @@ protected Future<Boolean> initiateGracefulShutdown() {
11331137
return future;
11341138
}
11351139

1136-
protected Future<Object> initiateGetRequest(String path) {
1137-
return initiateGetRequest(HttpClients.createDefault(), path);
1140+
protected Future<Object> initiateGetRequest(int port, String path) {
1141+
return initiateGetRequest(HttpClients.createMinimal(), port, path);
11381142
}
11391143

1140-
protected Future<Object> initiateGetRequest(HttpClient httpClient, String path) {
1144+
protected Future<Object> initiateGetRequest(HttpClient httpClient, int port, String path) {
11411145
RunnableFuture<Object> getRequest = new FutureTask<>(() -> {
11421146
try {
1143-
HttpResponse response = httpClient
1144-
.execute(new HttpGet("http://localhost:" + this.webServer.getPort() + path));
1147+
HttpResponse response = httpClient.execute(new HttpGet("http://localhost:" + port + path));
11451148
response.getEntity().getContent().close();
11461149
return response;
11471150
}

0 commit comments

Comments
 (0)