Skip to content

Commit 8a2e46f

Browse files
committed
fixed relative url issue.
1 parent cdfc8a5 commit 8a2e46f

File tree

5 files changed

+170
-3
lines changed

5 files changed

+170
-3
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/CodegenConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ public interface CodegenConfig {
8585

8686
void setInputSpec(String inputSpec);
8787

88+
String getInputURL();
89+
90+
void setInputURL(String inputSpec);
91+
8892
String getOutputDir();
8993

9094
void setOutputDir(String dir);

modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/DefaultGenerator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ private void configureGeneratorProperties() {
199199

200200
this.templateEngine = config.getTemplateEngine();
201201

202-
URL url = URLPathUtil.getServerURL(openAPI);
202+
URL url = URLPathUtil.getServerURL(openAPI, config);
203203

204204
contextPath = config.escapeText(url == null ? StringUtils.EMPTY : url.getPath());
205205
basePath = config.escapeText(URLPathUtil.getHost(openAPI));
@@ -661,7 +661,7 @@ private Map<String, Object> buildSupportFileBundle(List<Object> allOperations, L
661661
Map<String, Object> apis = new HashMap<>();
662662
apis.put("apis", allOperations);
663663

664-
URL url = URLPathUtil.getServerURL(openAPI);
664+
URL url = URLPathUtil.getServerURL(openAPI, config);
665665

666666
if (url != null) {
667667
bundle.put("host", url.getHost());

modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/config/CodegenConfigurator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ public ClientOptInput toClientOptInput() {
486486
throw new IllegalArgumentException(msg);
487487
}
488488
config.setInputSpec(specContent);
489+
config.setInputURL(inputSpecURL);
489490
ParseOptions options = new ParseOptions();
490491
options.setResolve(true);
491492
options.setFlatten(true);

modules/swagger-codegen/src/main/java/io/swagger/codegen/v3/utils/URLPathUtil.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.swagger.codegen.v3.CodegenConfig;
44
import io.swagger.v3.oas.models.OpenAPI;
55
import io.swagger.v3.oas.models.servers.Server;
6+
import org.apache.commons.lang3.StringUtils;
67
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
89

@@ -14,7 +15,7 @@ public class URLPathUtil {
1415

1516
protected static final Logger LOGGER = LoggerFactory.getLogger(URLPathUtil.class);
1617
public static String DEFAULT_PATH = "/";
17-
public static final String LOCAL_HOST = "http://localhost:8080/";
18+
public static final String LOCAL_HOST = "http://localhost:8080";
1819

1920
public static URL getServerURL(OpenAPI openAPI) {
2021
final List<Server> servers = openAPI.getServers();
@@ -34,6 +35,46 @@ public static URL getServerURL(OpenAPI openAPI) {
3435
}
3536
}
3637

38+
public static URL getServerURL(OpenAPI openAPI, CodegenConfig config) {
39+
final List<Server> servers = openAPI.getServers();
40+
if (servers == null || servers.isEmpty()) {
41+
try {
42+
return new URL(LOCAL_HOST);
43+
} catch (MalformedURLException e) {
44+
LOGGER.warn("Bad URL.", e);
45+
}
46+
}
47+
final Server server = servers.get(0);
48+
String serverUrl = server.getUrl();
49+
50+
try {
51+
while (true) {
52+
if (StringUtils.isBlank(serverUrl)) {
53+
serverUrl = LOCAL_HOST;
54+
break;
55+
}
56+
serverUrl = serverUrl.trim();
57+
if (serverUrl.toLowerCase().startsWith("http")) {
58+
break;
59+
}
60+
final String inputURL = config.getInputURL();
61+
if (StringUtils.isBlank(inputURL) || !inputURL.trim().toLowerCase().startsWith("http")) {
62+
serverUrl = LOCAL_HOST;
63+
break;
64+
}
65+
serverUrl = inputURL;
66+
break;
67+
}
68+
URL url = new URL(serverUrl);
69+
System.out.println(url.toString());
70+
71+
return url;
72+
} catch (Exception e) {
73+
LOGGER.warn("Not valid URL: " + server.getUrl(), e);
74+
return null;
75+
}
76+
}
77+
3778
public static String getScheme(OpenAPI openAPI, CodegenConfig config) {
3879
String scheme;
3980
URL url = getServerURL(openAPI);
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package io.swagger.codegen.v3.utils;
2+
3+
import io.swagger.codegen.v3.CodegenConfig;
4+
import io.swagger.v3.oas.models.OpenAPI;
5+
import io.swagger.v3.oas.models.servers.Server;
6+
import org.mockito.Mock;
7+
import org.mockito.MockitoAnnotations;
8+
import org.testng.Assert;
9+
import org.testng.annotations.BeforeMethod;
10+
import org.testng.annotations.Test;
11+
12+
import java.net.URL;
13+
import java.util.List;
14+
15+
import static org.mockito.Mockito.verify;
16+
import static org.mockito.Mockito.verifyZeroInteractions;
17+
import static org.mockito.Mockito.when;
18+
19+
public class URLPathUtilTest {
20+
21+
@Mock
22+
private OpenAPI openAPI;
23+
@Mock
24+
private CodegenConfig config;
25+
@Mock
26+
private List<Server> servers;
27+
@Mock
28+
private Server server;
29+
30+
@BeforeMethod
31+
public void setUp() {
32+
MockitoAnnotations.initMocks(this);
33+
when(openAPI.getServers()).thenReturn(servers);
34+
when(servers.isEmpty()).thenReturn(false);
35+
when(servers.get(0)).thenReturn(server);
36+
}
37+
38+
@Test
39+
public void testNoServers() {
40+
when(servers.isEmpty()).thenReturn(true);
41+
when(server.getUrl()).thenReturn(null);
42+
43+
URL url = URLPathUtil.getServerURL(openAPI, config);
44+
Assert.assertEquals(url.getHost(), "localhost");
45+
Assert.assertEquals(url.getPort(), 8080);
46+
47+
verify(openAPI).getServers();
48+
verify(servers).isEmpty();
49+
50+
verifyZeroInteractions(server);
51+
verifyZeroInteractions(config);
52+
}
53+
54+
@Test
55+
public void testNoServerURL() {
56+
when(server.getUrl()).thenReturn(null);
57+
58+
URL url = URLPathUtil.getServerURL(openAPI, config);
59+
Assert.assertEquals(url.getHost(), "localhost");
60+
Assert.assertEquals(url.getPort(), 8080);
61+
62+
verify(openAPI).getServers();
63+
verify(servers).isEmpty();
64+
verifyZeroInteractions(config);
65+
}
66+
67+
@Test
68+
public void testServerURL() {
69+
when(server.getUrl()).thenReturn("http://some.place:9999/v2");
70+
71+
URL url = URLPathUtil.getServerURL(openAPI, config);
72+
Assert.assertEquals(url.getHost(), "some.place");
73+
Assert.assertEquals(url.getPort(), 9999);
74+
75+
verify(openAPI).getServers();
76+
verify(servers).isEmpty();
77+
verifyZeroInteractions(config);
78+
}
79+
80+
@Test (description = "verify a relative url when input url is not present.")
81+
public void testRelativeServerURLv1() {
82+
when(server.getUrl()).thenReturn("/v2");
83+
when(config.getInputURL()).thenReturn(null);
84+
85+
URL url = URLPathUtil.getServerURL(openAPI, config);
86+
Assert.assertEquals(url.getHost(), "localhost");
87+
Assert.assertEquals(url.getPort(), 8080);
88+
89+
verify(openAPI).getServers();
90+
verify(servers).isEmpty();
91+
verify(config).getInputURL();
92+
}
93+
94+
@Test (description = "verify a relative url when input url is not remote.")
95+
public void testRelativeServerURLv2() {
96+
when(server.getUrl()).thenReturn("/v2");
97+
when(config.getInputURL()).thenReturn("/some/place/locally/file.json");
98+
99+
URL url = URLPathUtil.getServerURL(openAPI, config);
100+
Assert.assertEquals(url.getHost(), "localhost");
101+
Assert.assertEquals(url.getPort(), 8080);
102+
103+
verify(openAPI).getServers();
104+
verify(servers).isEmpty();
105+
verify(config).getInputURL();
106+
}
107+
108+
@Test (description = "verify a relative url when input url is remote.")
109+
public void testRelativeServerURLv3() {
110+
when(server.getUrl()).thenReturn("/v2");
111+
when(config.getInputURL()).thenReturn("http://some.place.com.co:80/remote/file.json");
112+
113+
URL url = URLPathUtil.getServerURL(openAPI, config);
114+
Assert.assertEquals(url.getHost(), "some.place.com.co");
115+
Assert.assertEquals(url.getPort(), 80);
116+
117+
verify(openAPI).getServers();
118+
verify(servers).isEmpty();
119+
verify(config).getInputURL();
120+
}
121+
}

0 commit comments

Comments
 (0)