Skip to content

Commit 1340d08

Browse files
authored
Merge pull request #240 from tencentyun/dev/error_code_retry
3xx service retry
2 parents e82b03b + d8ce4cf commit 1340d08

File tree

7 files changed

+553
-30
lines changed

7 files changed

+553
-30
lines changed

CHANGELOG.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [5.6.244.4]
9+
- 3xx exception retry
10+
11+
## [5.6.244.3]
12+
- preflight for upload part
13+
- x-cos-hash-crc32c
14+
- delete object version
15+
- throw 412 & 304 directly
16+
17+
## [5.6.240.2]
18+
- update IdleConnectionMonitor
19+
20+
## [5.6.240]
21+
- update tencentcloud-sdk-java-kms version
22+
- populate preflight request metadata
23+
24+
## [5.6.238]
25+
- update request timeout
26+
- do not follow 302 by default
27+
828
## [5.6.234]
929
- prefliht object before doing upload
1030
- add bucket encryption configuration API

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>com.qcloud</groupId>
66
<artifactId>cos_api</artifactId>
7-
<version>5.6.244.3</version>
7+
<version>5.6.244.4</version>
88
<packaging>jar</packaging>
99
<name>cos-java-sdk</name>
1010
<description>java sdk for qcloud cos</description>

src/main/java/com/qcloud/cos/auth/InstanceCredentialsFetcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class InstanceCredentialsFetcher extends HttpCredentialsFetcher {
1515

1616
static {
1717
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
18-
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE);
18+
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
1919
}
2020

2121
private static class CAMSecurityCredentials {

src/main/java/com/qcloud/cos/http/DefaultCosHttpClient.java

Lines changed: 70 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -540,12 +540,34 @@ private <X extends CosServiceRequest> boolean shouldRetry(CosHttpRequest<X> requ
540540
return false;
541541
}
542542

543+
if (exception instanceof CosServiceException) {
544+
if (((CosServiceException) exception).getStatusCode() == 301 || ((CosServiceException) exception).getStatusCode() == 302 || ((CosServiceException) exception).getStatusCode() == 307) {
545+
return shouldRetry3xxException(request, (CosServiceException) exception);
546+
}
547+
}
548+
543549
if (retryPolicy.shouldRetry(request, response, exception, retryIndex)) {
544550
return true;
545551
}
546552
return false;
547553
}
548554

555+
private <X extends CosServiceRequest> boolean shouldRetry3xxException(CosHttpRequest<X> request, CosServiceException cse) {
556+
if (!clientConfig.isChangeEndpointRetry() || (cse.getRequestId() != null && !cse.getRequestId().isEmpty())) {
557+
return false;
558+
}
559+
560+
Map<String, String> reqHeaders = request.getHeaders();
561+
if (!reqHeaders.isEmpty() && reqHeaders.containsKey(Headers.HOST)) {
562+
String lastEndpoint = request.getEndpoint();
563+
String lastHost = reqHeaders.get(Headers.HOST);
564+
565+
return isCosDefaultHost(lastHost, lastEndpoint);
566+
}
567+
568+
return false;
569+
}
570+
549571
protected HttpResponse executeOneRequest(HttpContext context, HttpRequestBase httpRequest) throws Exception{
550572
return httpClient.execute(httpRequest, context);
551573
}
@@ -824,6 +846,19 @@ private <Y extends CosServiceRequest> void handleLog(CosHttpRequest<Y> request)
824846
}
825847

826848
private <Y extends CosServiceRequest> void changeEndpointForRetry(CosHttpRequest<Y> request, HttpResponse httpResponse, int retryIndex) {
849+
if (httpResponse != null) {
850+
StatusLine statusLine = httpResponse.getStatusLine();
851+
int statusCode = -1;
852+
if (statusLine != null) {
853+
statusCode = statusLine.getStatusCode();
854+
}
855+
856+
if (statusCode == 301 || statusCode == 302 || statusCode == 307) {
857+
changeRequestHost(request);
858+
return;
859+
}
860+
}
861+
827862
if (!clientConfig.isChangeEndpointRetry() || retryIndex != (maxErrorRetry - 1)) {
828863
return;
829864
}
@@ -843,32 +878,9 @@ private <Y extends CosServiceRequest> void changeEndpointForRetry(CosHttpRequest
843878
if (!reqHeaders.isEmpty() && reqHeaders.containsKey(Headers.HOST)) {
844879
String lastEndpoint = request.getEndpoint();
845880
String lastHost = reqHeaders.get(Headers.HOST);
846-
String regex = ".+-\\d+\\.cos\\..+\\.myqcloud\\.com";
847-
Pattern pattern = Pattern.compile(regex);
848-
Matcher matcherEndpoint = pattern.matcher(lastEndpoint);
849-
Matcher matcherHost = pattern.matcher(lastHost);
850-
boolean isAccEndpoint = lastEndpoint.endsWith("cos.accelerate.myqcloud.com");
851-
boolean isAccHost = lastHost.endsWith("cos.accelerate.myqcloud.com");
852-
853-
if (matcherEndpoint.matches() && matcherHost.matches() && !isAccEndpoint && !isAccHost) {
854-
String retryEndpoint = String.format("%s.%s.tencentcos.cn", request.getBucketName(), Region.formatRegion(clientConfig.getRegion()));
855-
request.addHeader(Headers.HOST, retryEndpoint);
856-
COSSigner cosSigner = clientConfig.getCosSigner();
857-
COSCredentials cosCredentials = request.getCosCredentials();
858-
CosServiceRequest cosServiceRequest = request.getOriginalRequest();
859-
Date expiredTime = new Date(System.currentTimeMillis() + clientConfig.getSignExpired() * 1000);
860-
boolean isCIWorkflowRequest = cosServiceRequest instanceof CIWorkflowServiceRequest;
861-
cosSigner.setCIWorkflowRequest(isCIWorkflowRequest);
862-
cosSigner.sign(request, cosCredentials, expiredTime);
863-
864-
String endpointAddr = clientConfig.getEndpointResolver().resolveGeneralApiEndpoint(retryEndpoint);
865-
866-
String fixedEndpointAddr = request.getOriginalRequest().getFixedEndpointAddr();
867-
if (fixedEndpointAddr != null) {
868-
request.setEndpoint(fixedEndpointAddr);
869-
} else {
870-
request.setEndpoint(endpointAddr);
871-
}
881+
882+
if (isCosDefaultHost(lastHost, lastEndpoint)) {
883+
changeRequestHost(request);
872884
}
873885
}
874886
}
@@ -909,4 +921,36 @@ private <X extends CosServiceRequest> void refreshEndpointAddr(CosHttpRequest<X>
909921
request.setEndpoint(endpointAddr);
910922
}
911923
}
924+
925+
private boolean isCosDefaultHost(String host, String endPoint) {
926+
String regex = ".+-\\d+\\.cos\\..+\\.myqcloud\\.com";
927+
Pattern pattern = Pattern.compile(regex);
928+
Matcher matcherEndpoint = pattern.matcher(endPoint);
929+
Matcher matcherHost = pattern.matcher(host);
930+
boolean isAccEndpoint = endPoint.endsWith("cos.accelerate.myqcloud.com");
931+
boolean isAccHost = host.endsWith("cos.accelerate.myqcloud.com");
932+
933+
return matcherEndpoint.matches() && matcherHost.matches() && !isAccEndpoint && !isAccHost;
934+
}
935+
936+
private <Y extends CosServiceRequest> void changeRequestHost(CosHttpRequest<Y> request) {
937+
String retryEndpoint = String.format("%s.%s.tencentcos.cn", request.getBucketName(), Region.formatRegion(clientConfig.getRegion()));
938+
request.addHeader(Headers.HOST, retryEndpoint);
939+
COSSigner cosSigner = clientConfig.getCosSigner();
940+
COSCredentials cosCredentials = request.getCosCredentials();
941+
CosServiceRequest cosServiceRequest = request.getOriginalRequest();
942+
Date expiredTime = new Date(System.currentTimeMillis() + clientConfig.getSignExpired() * 1000);
943+
boolean isCIWorkflowRequest = cosServiceRequest instanceof CIWorkflowServiceRequest;
944+
cosSigner.setCIWorkflowRequest(isCIWorkflowRequest);
945+
cosSigner.sign(request, cosCredentials, expiredTime);
946+
947+
String endpointAddr = clientConfig.getEndpointResolver().resolveGeneralApiEndpoint(retryEndpoint);
948+
949+
String fixedEndpointAddr = request.getOriginalRequest().getFixedEndpointAddr();
950+
if (fixedEndpointAddr != null) {
951+
request.setEndpoint(fixedEndpointAddr);
952+
} else {
953+
request.setEndpoint(endpointAddr);
954+
}
955+
}
912956
}

src/main/java/com/qcloud/cos/utils/CIJackson.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public enum CIJackson {
5050
objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
5151
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
5252
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
53-
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.PASCAL_CASE_TO_CAMEL_CASE);
53+
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
5454
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
5555
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.serializeAllExcept(getFieldsToFilter(CosServiceRequest.class));
5656
FilterProvider filters = new SimpleFilterProvider().addFilter("CosServiceFilter", filter);

0 commit comments

Comments
 (0)