Skip to content

Commit f803b04

Browse files
committed
support extract info from cloud box endpoint.
1 parent cc6ef1c commit f803b04

File tree

4 files changed

+186
-1
lines changed

4 files changed

+186
-1
lines changed

src/main/java/com/aliyun/oss/ClientConfiguration.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ public class ClientConfiguration {
121121

122122
protected boolean useSystemPropertyValues = false;
123123

124+
private boolean extractSettingFromEndpoint = true;
125+
124126
public ClientConfiguration() {
125127
super();
126128
AppendDefaultExcludeList(this.cnameExcludeList);
@@ -899,4 +901,21 @@ public boolean isUseSystemPropertyValues() {
899901
return useSystemPropertyValues;
900902
}
901903

904+
/**
905+
* Sets the flag of extracting setting from endpoint.
906+
*
907+
* @param enabled True if it's enabled; False if it's disabled.
908+
*/
909+
public void setExtractSettingFromEndpoint(boolean enabled) {
910+
this.extractSettingFromEndpoint = enabled;
911+
}
912+
913+
/**
914+
* Gets the flag of extracting setting from endpoint. By default it's enabled.
915+
*
916+
* @return true enabled; false disabled.
917+
*/
918+
public boolean isExtractSettingFromEndpointEnable() {
919+
return extractSettingFromEndpoint;
920+
}
902921
}

src/main/java/com/aliyun/oss/OSSClient.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ public OSSClient(String endpoint, CredentialsProvider credsProvider, ClientConfi
223223
}
224224
initOperations();
225225
setEndpoint(endpoint);
226+
initDefaultsByEndpoint();
226227
}
227228

228229
/**
@@ -284,6 +285,18 @@ private boolean isIpOrLocalhost(URI uri) {
284285
return false;
285286
}
286287

288+
private boolean isCloudBoxEndpointSuffix(URI uri) {
289+
if (uri == null || uri.getHost() == null) {
290+
return false;
291+
}
292+
String host = uri.getHost();
293+
if (host.endsWith("oss-cloudbox.aliyuncs.com") ||
294+
host.endsWith("oss-cloudbox-control.aliyuncs.com")) {
295+
return true;
296+
}
297+
return false;
298+
}
299+
287300
private URI toURI(String endpoint) throws IllegalArgumentException {
288301
return OSSUtils.toEndpointURI(endpoint, this.serviceClient.getClientConfiguration().getProtocol().toString());
289302
}
@@ -297,6 +310,37 @@ private void initOperations() {
297310
this.downloadOperation = new OSSDownloadOperation(objectOperation);
298311
this.liveChannelOperation = new LiveChannelOperation(this.serviceClient, this.credsProvider);
299312
}
313+
314+
private void initDefaultsByEndpoint() {
315+
if (!this.serviceClient.getClientConfiguration().isExtractSettingFromEndpointEnable()) {
316+
return;
317+
}
318+
319+
//cloud box endpoint pattern: cloudbox-id.region.oss-cloudbox[-control].aliyuncs.com
320+
//cloudbox-id start with cb-
321+
if (isCloudBoxEndpointSuffix(this.endpoint)) {
322+
String host = this.endpoint.getHost();
323+
String[] keys = host.split("\\.");
324+
if (keys != null && keys.length == 5) {
325+
if (keys[0].startsWith("cb-")) {
326+
this.setCloudBoxId(keys[0]);
327+
this.setRegion(keys[1]);
328+
this.setProduct(OSSConstants.PRODUCT_CLOUD_BOX);
329+
if (SignVersion.V4.compareTo(this.serviceClient.getClientConfiguration().getSignatureVersion()) > 0) {
330+
this.setSignatureVersionInner(SignVersion.V4);
331+
}
332+
}
333+
}
334+
}
335+
}
336+
337+
private void setSignatureVersionInner(SignVersion version) {
338+
this.bucketOperation.setSignVersion(version);
339+
this.objectOperation.setSignVersion(version);
340+
this.multipartOperation.setSignVersion(version);
341+
this.corsOperation.setSignVersion(version);
342+
this.liveChannelOperation.setSignVersion(version);
343+
}
300344
/**
301345
* Sets the product name.
302346
*

src/main/java/com/aliyun/oss/internal/OSSOperation.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public abstract class OSSOperation {
5252
protected CredentialsProvider credsProvider;
5353
protected ServiceClient client;
5454
protected String cloudBoxId;
55+
protected SignVersion signVersion;
5556

5657
protected static OSSErrorResponseHandler errorResponseHandler = new OSSErrorResponseHandler();
5758
protected static EmptyResponseParser emptyResponseParser = new EmptyResponseParser();
@@ -62,6 +63,7 @@ protected OSSOperation(ServiceClient client, CredentialsProvider credsProvider)
6263
this.client = client;
6364
this.credsProvider = credsProvider;
6465
this.product = OSSConstants.PRODUCT_DEFAULT;
66+
this.signVersion = null;
6567
}
6668

6769
public String getProduct() {
@@ -108,6 +110,14 @@ public void setCloudBoxId(String cloudBoxId) {
108110
this.cloudBoxId = cloudBoxId;
109111
}
110112

113+
public SignVersion getSignVersion() {
114+
return signVersion;
115+
}
116+
117+
public void setSignVersion(SignVersion signVersion) {
118+
this.signVersion = signVersion;
119+
}
120+
111121
protected ServiceClient getInnerClient() {
112122
return this.client;
113123
}
@@ -199,7 +209,7 @@ private RequestSigner createSigner(String bucketName, String key, Credentials cr
199209
params.setRegion(region);
200210
params.setCloudBoxId(cloudBoxId);
201211
params.setTickOffset(config.getTickOffset());
202-
return OSSSignerBase.createRequestSigner(config.getSignatureVersion(), params);
212+
return OSSSignerBase.createRequestSigner(signVersion != null ? signVersion : config.getSignatureVersion(), params);
203213
}
204214

205215
protected ExecutionContext createDefaultContext(HttpMethod method, String bucketName, String key, WebServiceRequest originalRequest) {

src/test/java/com/aliyun/oss/common/comm/OSSClientTest.java

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.aliyun.oss.*;
3030
import com.aliyun.oss.common.auth.Credentials;
3131
import com.aliyun.oss.common.auth.CredentialsProvider;
32+
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
3233
import com.aliyun.oss.internal.OSSConstants;
3334
import com.aliyun.oss.internal.RequestParameters;
3435
import com.aliyun.oss.model.GetObjectRequest;
@@ -370,5 +371,116 @@ public void testNullCredential(){
370371
Assert.fail("should be failed here.");
371372
}
372373
}
374+
375+
@Test
376+
public void testExtractSettingFromEndpoint() {
377+
ClientBuilderConfiguration conf = new ClientBuilderConfiguration();
378+
Assert.assertEquals(true, conf.isExtractSettingFromEndpointEnable());
379+
380+
conf.setExtractSettingFromEndpoint(false);
381+
Assert.assertEquals(false, conf.isExtractSettingFromEndpointEnable());
382+
383+
//non cloud-box endpoint
384+
OSS ossClient = new OSSClientBuilder().build("http://bucket.oss-cn-hangzhou.aliyuncs.com", "ak", "sk");
385+
OSSClient clientImpl = (OSSClient)ossClient;
386+
Assert.assertEquals(null, clientImpl.getObjectOperation().getSignVersion());
387+
Assert.assertEquals(null, clientImpl.getObjectOperation().getCloudBoxId());
388+
Assert.assertEquals(null, clientImpl.getObjectOperation().getRegion());
389+
Assert.assertEquals("oss", clientImpl.getObjectOperation().getProduct());
390+
391+
//cloud-box data endpoint
392+
String cloudboxDataEndpoint = "https://cb-f8z7yvzgwfkl9q0h.cn-hangzhou.oss-cloudbox.aliyuncs.com";
393+
ossClient = new OSSClientBuilder().build(cloudboxDataEndpoint, "ak", "sk");
394+
clientImpl = (OSSClient)ossClient;
395+
Assert.assertEquals(SignVersion.V4, clientImpl.getObjectOperation().getSignVersion());
396+
Assert.assertEquals("cb-f8z7yvzgwfkl9q0h", clientImpl.getObjectOperation().getCloudBoxId());
397+
Assert.assertEquals("cn-hangzhou", clientImpl.getObjectOperation().getRegion());
398+
Assert.assertEquals("oss-cloudbox", clientImpl.getObjectOperation().getProduct());
399+
400+
//cloud-box control endpoint
401+
String cloudboxControlEndpoint = "cb-123.cn-heyuan.oss-cloudbox-control.aliyuncs.com";
402+
ossClient = new OSSClientBuilder().build(cloudboxControlEndpoint, "ak", "sk");
403+
clientImpl = (OSSClient)ossClient;
404+
Assert.assertEquals(SignVersion.V4, clientImpl.getObjectOperation().getSignVersion());
405+
Assert.assertEquals("cb-123", clientImpl.getObjectOperation().getCloudBoxId());
406+
Assert.assertEquals("cn-heyuan", clientImpl.getObjectOperation().getRegion());
407+
Assert.assertEquals("oss-cloudbox", clientImpl.getObjectOperation().getProduct());
408+
409+
//cloud-box data endpoint with signer version 4
410+
conf = new ClientBuilderConfiguration();
411+
conf.setSignatureVersion(SignVersion.V4);
412+
ossClient = new OSSClientBuilder().build(cloudboxDataEndpoint, "ak", "sk", conf);
413+
clientImpl = (OSSClient)ossClient;
414+
Assert.assertEquals(SignVersion.V4, conf.getSignatureVersion());
415+
Assert.assertEquals(null, clientImpl.getObjectOperation().getSignVersion());
416+
Assert.assertEquals("cb-f8z7yvzgwfkl9q0h", clientImpl.getObjectOperation().getCloudBoxId());
417+
Assert.assertEquals("cn-hangzhou", clientImpl.getObjectOperation().getRegion());
418+
Assert.assertEquals("oss-cloudbox", clientImpl.getObjectOperation().getProduct());
419+
420+
//invalid cloud-box control endpoint
421+
ossClient = new OSSClientBuilder().build("https://c-f8z7yvzgwfkl9q0h.cn-hangzhou.oss-cloudbox-control.aliyuncs.com", "ak", "sk");
422+
clientImpl = (OSSClient)ossClient;
423+
Assert.assertEquals(null, clientImpl.getObjectOperation().getSignVersion());
424+
Assert.assertEquals(null, clientImpl.getObjectOperation().getCloudBoxId());
425+
Assert.assertEquals(null, clientImpl.getObjectOperation().getRegion());
426+
Assert.assertEquals("oss", clientImpl.getObjectOperation().getProduct());
427+
428+
//disable extract setting data endpoint
429+
conf = new ClientBuilderConfiguration();
430+
conf.setExtractSettingFromEndpoint(false);
431+
ossClient = new OSSClientBuilder().build(cloudboxDataEndpoint, "ak", "sk", conf);
432+
clientImpl = (OSSClient)ossClient;
433+
Assert.assertEquals(SignVersion.V1, conf.getSignatureVersion());
434+
Assert.assertEquals(null, clientImpl.getObjectOperation().getSignVersion());
435+
Assert.assertEquals(null, clientImpl.getObjectOperation().getCloudBoxId());
436+
Assert.assertEquals(null, clientImpl.getObjectOperation().getRegion());
437+
Assert.assertEquals("oss", clientImpl.getObjectOperation().getProduct());
438+
439+
//build cloudbox data endpoint with region and cloudboxId
440+
conf = new ClientBuilderConfiguration();
441+
conf.setSignatureVersion(SignVersion.V4);
442+
ossClient = OSSClientBuilder.create()
443+
.endpoint(cloudboxDataEndpoint)
444+
.credentialsProvider(new DefaultCredentialProvider("ak", "sk"))
445+
.clientConfiguration(conf)
446+
.region("region")
447+
.cloudBoxId("cloudBoxId")
448+
.build();
449+
clientImpl = (OSSClient)ossClient;
450+
Assert.assertEquals(SignVersion.V4, conf.getSignatureVersion());
451+
Assert.assertEquals(null, clientImpl.getObjectOperation().getSignVersion());
452+
Assert.assertEquals("cloudBoxId", clientImpl.getObjectOperation().getCloudBoxId());
453+
Assert.assertEquals("region", clientImpl.getObjectOperation().getRegion());
454+
Assert.assertEquals("oss-cloudbox", clientImpl.getObjectOperation().getProduct());
455+
456+
//build normal endpoint with region and cloudbox
457+
conf = new ClientBuilderConfiguration();
458+
conf.setSignatureVersion(SignVersion.V4);
459+
ossClient = OSSClientBuilder.create()
460+
.endpoint("http://oss-cn-hangzhou.aliyuncs.com")
461+
.credentialsProvider(new DefaultCredentialProvider("ak", "sk"))
462+
.clientConfiguration(conf)
463+
.region("region")
464+
.cloudBoxId("cloudBoxId")
465+
.build();
466+
clientImpl = (OSSClient)ossClient;
467+
Assert.assertEquals(SignVersion.V4, conf.getSignatureVersion());
468+
Assert.assertEquals(null, clientImpl.getObjectOperation().getSignVersion());
469+
Assert.assertEquals("cloudBoxId", clientImpl.getObjectOperation().getCloudBoxId());
470+
Assert.assertEquals("region", clientImpl.getObjectOperation().getRegion());
471+
Assert.assertEquals("oss-cloudbox", clientImpl.getObjectOperation().getProduct());
472+
473+
//build cloudbox data endpoint with region and cloudboxId, and version v1
474+
ossClient = OSSClientBuilder.create()
475+
.endpoint(cloudboxDataEndpoint)
476+
.credentialsProvider(new DefaultCredentialProvider("ak", "sk"))
477+
.region("region")
478+
.build();
479+
clientImpl = (OSSClient)ossClient;
480+
Assert.assertEquals(SignVersion.V4, clientImpl.getObjectOperation().getSignVersion());
481+
Assert.assertEquals("cb-f8z7yvzgwfkl9q0h", clientImpl.getObjectOperation().getCloudBoxId());
482+
Assert.assertEquals("region", clientImpl.getObjectOperation().getRegion());
483+
Assert.assertEquals("oss-cloudbox", clientImpl.getObjectOperation().getProduct());
484+
}
373485
}
374486

0 commit comments

Comments
 (0)