Skip to content

Commit f943a62

Browse files
timeout when response body is not fully received
1 parent 983624e commit f943a62

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

src/main/java/ru/r2cloud/cloud/SatnogsClient.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
import java.util.List;
1919
import java.util.Map;
2020
import java.util.TimeZone;
21+
import java.util.concurrent.CompletableFuture;
22+
import java.util.concurrent.ExecutionException;
23+
import java.util.concurrent.TimeUnit;
24+
import java.util.concurrent.TimeoutException;
2125

2226
import org.slf4j.Logger;
2327
import org.slf4j.LoggerFactory;
@@ -57,12 +61,14 @@ public class SatnogsClient {
5761
private final HttpClient httpclient;
5862
private final String hostname;
5963
private final Duration timeout;
64+
private final long timeoutMillis;
6065
private final Clock clock;
6166

6267
public SatnogsClient(Configuration config, Clock clock) {
6368
this.hostname = config.getProperty("satnogs.hostname");
6469
this.clock = clock;
65-
this.timeout = Duration.ofMillis(config.getInteger("satnogs.connectionTimeout"));
70+
this.timeoutMillis = config.getInteger("satnogs.connectionTimeout");
71+
this.timeout = Duration.ofMillis(timeoutMillis);
6672
this.httpclient = HttpClient.newBuilder().version(Version.HTTP_2).followRedirects(Redirect.NORMAL).connectTimeout(timeout).build();
6773
}
6874

@@ -491,7 +497,8 @@ private HttpResponse<String> sendWithRetry(HttpRequest request, HttpResponse.Bod
491497
int currentRetry = 0;
492498
while (true) {
493499
try {
494-
HttpResponse<String> result = httpclient.send(request, responseBodyHandler);
500+
CompletableFuture<HttpResponse<String>> response = httpclient.sendAsync(request, responseBodyHandler);
501+
HttpResponse<String> result = response.get(timeoutMillis, TimeUnit.MILLISECONDS);
495502
// retry for any server-side errors
496503
// can happen during server upgrade
497504
if (result.statusCode() < 500) {
@@ -502,10 +509,10 @@ private HttpResponse<String> sendWithRetry(HttpRequest request, HttpResponse.Bod
502509
return result;
503510
}
504511
LOG.info("unable to send. status code: {}. retry {}", result.statusCode(), currentRetry);
505-
} catch (IOException e) {
512+
} catch (ExecutionException | TimeoutException e) {
506513
currentRetry++;
507514
if (currentRetry > MAX_RETRIES) {
508-
throw e;
515+
throw new IOException(e);
509516
}
510517
Util.logIOException(LOG, false, "unable to send. retry " + currentRetry, e);
511518
}

src/test/java/ru/r2cloud/SatnogsServerMock.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class SatnogsServerMock {
2121
private HttpServer server;
2222
private Set<String> pathsConfigured = new HashSet<>();
2323
private String tleBase;
24-
24+
2525
public SatnogsServerMock() throws IOException {
2626
server = HttpServer.create(new InetSocketAddress("localhost", 8007), 0);
2727
}
@@ -31,15 +31,21 @@ public void setTleMockDirectory(String base) {
3131
}
3232

3333
public void setSatellitesMock(String message, int code) {
34+
setSatellitesMock(message, message.length(), code);
35+
}
36+
37+
public void setSatellitesMock(String message, int messageLength, int code) {
3438
HttpHandler mock = new HttpHandler() {
3539

3640
@Override
3741
public void handle(HttpExchange exchange) throws IOException {
3842
exchange.getResponseHeaders().add("Content-Type", "application/json");
39-
exchange.sendResponseHeaders(code, message.length());
43+
exchange.sendResponseHeaders(code, messageLength);
4044
OutputStream os = exchange.getResponseBody();
4145
os.write(message.getBytes(StandardCharsets.UTF_8));
42-
os.close();
46+
if (messageLength == message.length()) {
47+
os.close();
48+
}
4349
}
4450
};
4551
addHandler(mock, "/api/satellites/");

src/test/java/ru/r2cloud/cloud/SatnogsClientTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ public class SatnogsClientTest {
2929
@Rule
3030
public TemporaryFolder tempFolder = new TemporaryFolder();
3131

32+
@Test
33+
public void testPartialDownload() throws Exception {
34+
String message = "{ \"test\": 1 }";
35+
server.setSatellitesMock(message, message.length() * 2, 200);
36+
server.setTransmittersMock(new JsonHttpResponse("satnogs/transmitters.json", 200));
37+
server.setTleMockDirectory("satnogs");
38+
assertTrue(client.loadSatellites().isEmpty());
39+
}
40+
3241
@Test
3342
public void testInvalidResponse() throws Exception {
3443
server.setSatellitesMock(new JsonHttpResponse("satnogs/empty-response.json", 404));

0 commit comments

Comments
 (0)