Skip to content

Commit 4e17365

Browse files
authored
[SCB-2861]able to add multiple origins for CORS configuration (#4233)
1 parent 3d0a04f commit 4e17365

File tree

5 files changed

+81
-16
lines changed

5 files changed

+81
-16
lines changed

demo/demo-crossapp/crossapp-client/src/main/java/org/apache/servicecomb/demo/crossapp/CrossappClient.java

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.http.ResponseEntity;
3333
import org.springframework.util.LinkedMultiValueMap;
3434
import org.springframework.util.MultiValueMap;
35+
import org.springframework.web.client.HttpServerErrorException;
3536
import org.springframework.web.client.RestOperations;
3637
import org.springframework.web.client.RestTemplate;
3738

@@ -62,28 +63,84 @@ public static void run() {
6263
result = helloWorld.sayHello();
6364
TestMgr.check("hello world", result);
6465

65-
testCorsHandler();
66+
testCorsHandlerOptions();
67+
testCorsHandlerGet();
6668

6769
TestMgr.summary();
6870
System.setProperty("sun.net.http.allowRestrictedHeaders", "false");
6971
}
7072

71-
private static void testCorsHandler() {
73+
private static void testCorsHandlerOptions() {
74+
// first domain
7275
RestOperations springRestTemplate = new RestTemplate();
7376
MultiValueMap<String, String> requestHeaders = new LinkedMultiValueMap<>();
74-
requestHeaders.put("Origin", Collections.singletonList("http://localhost:8080"));
77+
requestHeaders.put("Origin", Collections.singletonList("http://test.domain:8080"));
7578
requestHeaders.put("Access-Control-Request-Method", Collections.singletonList("PUT"));
76-
7779
HttpEntity<Object> requestEntity = new HttpEntity<>(requestHeaders);
7880
ResponseEntity<String> responseEntity = springRestTemplate
7981
.exchange("http://127.0.0.1:8080/helloworld/hello", HttpMethod.OPTIONS, requestEntity,
8082
String.class);
81-
8283
TestMgr.check("204", responseEntity.getStatusCode().value());
8384
TreeSet<String> sortedSet = new TreeSet<>(responseEntity.getHeaders().get("Access-Control-Allow-Methods"));
8485
TestMgr.check("[DELETE,POST,GET,PUT]", sortedSet);
8586
sortedSet = new TreeSet<>(responseEntity.getHeaders().get("Access-Control-Allow-Headers"));
8687
TestMgr.check("[abc,def]", sortedSet);
87-
TestMgr.check("*", responseEntity.getHeaders().getFirst("Access-Control-Allow-Origin"));
88+
TestMgr.check("http://test.domain:8080",
89+
responseEntity.getHeaders().getFirst("Access-Control-Allow-Origin"));
90+
91+
// second domain
92+
requestHeaders = new LinkedMultiValueMap<>();
93+
requestHeaders.put("Origin", Collections.singletonList("http://test.domain:9090"));
94+
requestHeaders.put("Access-Control-Request-Method", Collections.singletonList("PUT"));
95+
requestEntity = new HttpEntity<>(requestHeaders);
96+
responseEntity = springRestTemplate
97+
.exchange("http://127.0.0.1:8080/helloworld/hello", HttpMethod.OPTIONS, requestEntity,
98+
String.class);
99+
TestMgr.check("204", responseEntity.getStatusCode().value());
100+
sortedSet = new TreeSet<>(responseEntity.getHeaders().get("Access-Control-Allow-Methods"));
101+
TestMgr.check("[DELETE,POST,GET,PUT]", sortedSet);
102+
sortedSet = new TreeSet<>(responseEntity.getHeaders().get("Access-Control-Allow-Headers"));
103+
TestMgr.check("[abc,def]", sortedSet);
104+
TestMgr.check("http://test.domain:9090",
105+
responseEntity.getHeaders().getFirst("Access-Control-Allow-Origin"));
106+
}
107+
108+
private static void testCorsHandlerGet() {
109+
// allowed origin
110+
RestOperations springRestTemplate = new RestTemplate();
111+
MultiValueMap<String, String> requestHeaders = new LinkedMultiValueMap<>();
112+
requestHeaders.put("Origin", Collections.singletonList("http://test.domain:8080"));
113+
HttpEntity<Object> requestEntity = new HttpEntity<>(requestHeaders);
114+
ResponseEntity<String> responseEntity = springRestTemplate
115+
.exchange("http://127.0.0.1:8080/helloworld/hello", HttpMethod.GET, requestEntity,
116+
String.class);
117+
118+
TestMgr.check("200", responseEntity.getStatusCode().value());
119+
TestMgr.check("hello world", responseEntity.getBody());
120+
121+
// allowed origin
122+
requestHeaders = new LinkedMultiValueMap<>();
123+
requestHeaders.put("Origin", Collections.singletonList("http://test.domain:9090"));
124+
requestEntity = new HttpEntity<>(requestHeaders);
125+
responseEntity = springRestTemplate
126+
.exchange("http://127.0.0.1:8080/helloworld/hello", HttpMethod.GET, requestEntity,
127+
String.class);
128+
129+
TestMgr.check("200", responseEntity.getStatusCode().value());
130+
TestMgr.check("hello world", responseEntity.getBody());
131+
132+
// not allowed origin
133+
try {
134+
requestHeaders = new LinkedMultiValueMap<>();
135+
requestHeaders.put("Origin", Collections.singletonList("http://test.domain:7070"));
136+
requestEntity = new HttpEntity<>(requestHeaders);
137+
springRestTemplate
138+
.exchange("http://127.0.0.1:8080/helloworld/hello", HttpMethod.GET, requestEntity,
139+
String.class);
140+
TestMgr.fail("must throw");
141+
} catch (HttpServerErrorException e) {
142+
TestMgr.check(500, e.getStatusCode().value());
143+
TestMgr.check(true, e.getMessage().contains("500 CORS Rejected"));
144+
}
88145
}
89146
}

demo/demo-crossapp/crossapp-server/src/main/resources/microservice.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ servicecomb:
3030
address: 0.0.0.0:8080
3131
cors:
3232
enabled: true
33-
origin: "*"
33+
origin: "http://test.domain:8080,http://test.domain:9090"
3434
allowedHeader: abc,def
3535
allowedMethod: GET,PUT,POST,DELETE
3636
exposedHeader: abc,def

transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ void mountCorsHandler(Router mainRouter) {
188188
return;
189189
}
190190

191-
CorsHandler corsHandler = getCorsHandler(TransportConfig.getCorsAllowedOrigin());
191+
CorsHandler corsHandler = getCorsHandler();
192192
// Access-Control-Allow-Credentials
193193
corsHandler.allowCredentials(TransportConfig.isCorsAllowCredentials());
194194
// Access-Control-Allow-Headers
@@ -210,8 +210,17 @@ void mountCorsHandler(Router mainRouter) {
210210
mainRouter.route().handler(corsHandler);
211211
}
212212

213-
private CorsHandler getCorsHandler(String corsAllowedOrigin) {
214-
return CorsHandler.create().addOrigin(corsAllowedOrigin);
213+
private CorsHandler getCorsHandler() {
214+
CorsHandler handler = CorsHandler.create();
215+
String[] origin = TransportConfig.getCorsAllowedOrigin();
216+
if (origin == null) {
217+
handler.addOrigin("*");
218+
} else {
219+
for (String item : origin) {
220+
handler.addOrigin(item);
221+
}
222+
}
223+
return handler;
215224
}
216225

217226
private void initDispatcher(Router mainRouter) {

transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,9 @@ public static boolean isCorsEnabled() {
165165
.getBooleanProperty(SERVICECOMB_CORS_CONFIG_BASE + ".enabled", false);
166166
}
167167

168-
public static String getCorsAllowedOrigin() {
168+
public static String[] getCorsAllowedOrigin() {
169169
return LegacyPropertyFactory
170-
.getStringProperty(SERVICECOMB_CORS_CONFIG_BASE + ".origin", "*");
170+
.getProperty(SERVICECOMB_CORS_CONFIG_BASE + ".origin", String[].class);
171171
}
172172

173173
public static boolean isCorsAllowCredentials() {

transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestRestServerVerticle.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,8 @@ public void testMountCorsHandler() {
267267
false))
268268
.thenReturn(true);
269269
Mockito.when(environment.getProperty("servicecomb.cors.origin",
270-
"*"))
271-
.thenReturn("*");
270+
String[].class))
271+
.thenReturn(null);
272272
Mockito.when(environment.getProperty("servicecomb.cors.allowedMethod"))
273273
.thenReturn("GET,PUT,POST");
274274
Mockito.when(environment.getProperty("servicecomb.cors.allowedHeader"))
@@ -326,8 +326,7 @@ CorsHandler maxAgeSeconds(int maxAgeSeconds) {
326326

327327
new MockUp<RestServerVerticle>() {
328328
@Mock
329-
CorsHandler getCorsHandler(String corsAllowedOrigin) {
330-
Assertions.assertEquals("*", corsAllowedOrigin);
329+
CorsHandler getCorsHandler() {
331330
return corsHandler;
332331
}
333332
};

0 commit comments

Comments
 (0)