@@ -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}
0 commit comments