Skip to content

Commit 63b1cc6

Browse files
fix: configuration for timeout http connection (#2156) (#2207)
1 parent 08e3553 commit 63b1cc6

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/RemoteUrl.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
import java.io.BufferedReader;
1515
import java.io.InputStream;
1616
import java.io.InputStreamReader;
17-
import java.net.*;
17+
import java.net.HttpURLConnection;
18+
import java.net.URI;
19+
import java.net.URL;
20+
import java.net.URLConnection;
21+
import java.net.URLEncoder;
1822
import java.nio.charset.Charset;
1923
import java.nio.charset.StandardCharsets;
2024
import java.security.KeyManagementException;
@@ -35,8 +39,10 @@ public class RemoteUrl {
3539
private static final Charset UTF_8 = StandardCharsets.UTF_8;
3640
private static final String ACCEPT_HEADER_VALUE = "application/json, application/yaml, */*";
3741
private static final String USER_AGENT_HEADER_VALUE = "Apache-HttpClient/Swagger";
42+
static final int CONNECTION_TIMEOUT = 30000;
43+
static final int READ_TIMEOUT = 60000;
3844

39-
private static ConnectionConfigurator createConnectionConfigurator() {
45+
static ConnectionConfigurator createConnectionConfigurator() {
4046
if (Boolean.parseBoolean(System.getProperty(TRUST_ALL))) {
4147
try {
4248
// Create a trust manager that does not validate certificate chains
@@ -73,6 +79,8 @@ public void process(URLConnection connection) {
7379
final HttpsURLConnection httpsConnection = (HttpsURLConnection) connection;
7480
httpsConnection.setSSLSocketFactory(sf);
7581
httpsConnection.setHostnameVerifier(trustAllNames);
82+
httpsConnection.setConnectTimeout(CONNECTION_TIMEOUT);
83+
httpsConnection.setReadTimeout(READ_TIMEOUT);
7684
}
7785
}
7886
};
@@ -86,7 +94,8 @@ public void process(URLConnection connection) {
8694

8795
@Override
8896
public void process(URLConnection connection) {
89-
// Do nothing
97+
connection.setConnectTimeout(CONNECTION_TIMEOUT);
98+
connection.setReadTimeout(READ_TIMEOUT);
9099
}
91100
};
92101
}
@@ -198,7 +207,7 @@ private static void appendValue(URL url, AuthorizationValue value, Collection<Au
198207
to.add(value);
199208
}
200209

201-
private interface ConnectionConfigurator {
210+
interface ConnectionConfigurator {
202211

203212
void process(URLConnection connection);
204213
}

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/util/RemoteUrlTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import org.testng.annotations.BeforeMethod;
99
import org.testng.annotations.Test;
1010

11+
import javax.net.ssl.HttpsURLConnection;
12+
import java.net.SocketTimeoutException;
13+
import java.net.URL;
1114
import java.util.Arrays;
1215
import java.util.List;
1316

@@ -18,8 +21,10 @@
1821
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
1922
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
2023
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
24+
import static io.swagger.v3.parser.util.RemoteUrl.CONNECTION_TIMEOUT;
2125
import static org.testng.Assert.assertEquals;
2226
import static org.testng.Assert.assertFalse;
27+
import static org.testng.Assert.assertTrue;
2328

2429
public class RemoteUrlTest {
2530

@@ -128,4 +133,23 @@ private String setupStub() {
128133
));
129134
return expectedBody;
130135
}
136+
137+
@Test
138+
public void testConnectionTimeoutEnforced() throws Exception {
139+
System.setProperty("io.swagger.v3.parser.util.RemoteUrl.trustAll", "true");
140+
RemoteUrl.ConnectionConfigurator configurator = RemoteUrl.createConnectionConfigurator();
141+
URL url = new URL("https://10.255.255.1"); // non-routable IP to simulate timeout
142+
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
143+
144+
configurator.process(conn);
145+
146+
long start = System.nanoTime();
147+
try {
148+
conn.connect();
149+
} catch (SocketTimeoutException e) {
150+
long duration = (System.nanoTime() - start) / 1_000_000; // Convert nanoseconds to milliseconds
151+
assertTrue(duration >= CONNECTION_TIMEOUT - 500, "Timeout was too short");
152+
assertTrue(duration <= CONNECTION_TIMEOUT + 2000, "Timeout was not enforced properly (took too long)");
153+
}
154+
}
131155
}

0 commit comments

Comments
 (0)