Skip to content
This repository was archived by the owner on Apr 16, 2022. It is now read-only.

Commit dd75f13

Browse files
authored
Merge pull request #865 from timkoon/issue-848
Close response InputStreams
2 parents 97b57f4 + 62f552b commit dd75f13

File tree

4 files changed

+81
-0
lines changed

4 files changed

+81
-0
lines changed

src/org/opendatakit/briefcase/reused/UncheckedFiles.java

+8
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,14 @@ public static InputStream newInputStream(Path path, OpenOption... options) {
305305
}
306306
}
307307

308+
public static void closeInputStream(InputStream inputStream) {
309+
try {
310+
inputStream.close();
311+
} catch (IOException e) {
312+
throw new UncheckedIOException(e);
313+
}
314+
}
315+
308316
public static long size(Path path) {
309317
try {
310318
return Files.size(path);

src/org/opendatakit/briefcase/reused/http/CommonsHttp.java

+10
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,16 @@
3939
import org.apache.http.impl.client.CloseableHttpClient;
4040
import org.apache.http.impl.client.HttpClientBuilder;
4141
import org.opendatakit.briefcase.reused.BriefcaseException;
42+
import org.opendatakit.briefcase.reused.UncheckedFiles;
4243
import org.opendatakit.briefcase.reused.http.response.Response;
44+
import org.slf4j.Logger;
45+
import org.slf4j.LoggerFactory;
4346

4447
public class CommonsHttp implements Http {
4548
private Executor executor;
4649
private final int maxConnections;
4750
private final BasicCookieStore cookieStore;
51+
private static final Logger log = LoggerFactory.getLogger(CommonsHttp.class);
4852

4953
private CommonsHttp(Executor executor, int maxConnections, BasicCookieStore cookieStore) {
5054
this.executor = executor;
@@ -147,6 +151,12 @@ private <T> Response<T> uncheckedExecute(Request<T> request, Executor executor)
147151
throw new HttpException("The connection has timed out", e);
148152
} catch (IOException e) {
149153
throw new UncheckedIOException(e);
154+
} finally {
155+
request.ifBody(UncheckedFiles::closeInputStream);
156+
if (request.multipartMessages != null)
157+
request.multipartMessages.stream()
158+
.map(MultipartMessage::getBody)
159+
.forEach(UncheckedFiles::closeInputStream);
150160
}
151161
}
152162

src/org/opendatakit/briefcase/reused/http/Request.java

+5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Objects;
2626
import java.util.Optional;
2727
import java.util.function.BiConsumer;
28+
import java.util.function.Consumer;
2829
import java.util.function.Function;
2930
import org.opendatakit.briefcase.reused.BriefcaseException;
3031
import org.slf4j.Logger;
@@ -124,6 +125,10 @@ public InputStream getBody() {
124125
return body.orElseThrow(BriefcaseException::new);
125126
}
126127

128+
public void ifBody(Consumer<InputStream> consumer) {
129+
body.ifPresent(consumer);
130+
}
131+
127132
public boolean ignoreCookies() {
128133
return ignoreCookies;
129134
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.opendatakit.briefcase.reused;
2+
3+
import static org.opendatakit.briefcase.reused.UncheckedFiles.createFile;
4+
import static org.opendatakit.briefcase.reused.UncheckedFiles.createTempDirectory;
5+
import static org.opendatakit.briefcase.reused.UncheckedFiles.deleteRecursive;
6+
7+
import java.io.IOException;
8+
import java.io.InputStream;
9+
import java.io.UncheckedIOException;
10+
import java.nio.file.Path;
11+
12+
import org.junit.After;
13+
import org.junit.Before;
14+
import org.junit.Test;
15+
16+
17+
public class UncheckedFilesInputStreamTest {
18+
private Path tempDir;
19+
private Path temp;
20+
21+
22+
@Before
23+
public void setUp() {
24+
tempDir = createTempDirectory("briefcase");
25+
temp = tempDir.resolve("test.txt");
26+
createFile(temp);
27+
}
28+
29+
@After
30+
public void tearDown() {
31+
deleteRecursive(tempDir);
32+
}
33+
34+
@Test(expected = IOException.class)
35+
public void closeInputStream_should_close() throws IOException {
36+
InputStream inputStream = UncheckedFiles.newInputStream(temp);
37+
38+
UncheckedFiles.closeInputStream(inputStream);
39+
40+
// after close, .available() should throw exception
41+
inputStream.available();
42+
}
43+
44+
@Test(expected = UncheckedIOException.class)
45+
public void closeInputStream_should_throw_exception() throws IOException {
46+
InputStream is = new InputStream() {
47+
@Override
48+
public int read() throws IOException {
49+
return 0;
50+
}
51+
@Override
52+
public void close() throws IOException {
53+
throw new IOException("chuchu");
54+
}
55+
};
56+
UncheckedFiles.closeInputStream(is);
57+
}
58+
}

0 commit comments

Comments
 (0)