use of com.qcloud.cos.internal.COSVersionHeaderHandler in project cos-java-sdk-v5 by tencentyun.
the class COSClient method copyPart.
@Override
public CopyPartResult copyPart(CopyPartRequest copyPartRequest) throws CosClientException, CosServiceException {
rejectNull(copyPartRequest, "The CopyPartRequest parameter must be specified when copying a part");
rejectNull(copyPartRequest.getSourceBucketName(), "The source bucket name must be specified when copying a part");
rejectNull(copyPartRequest.getSourceKey(), "The source object key must be specified when copying a part");
rejectNull(copyPartRequest.getDestinationBucketName(), "The destination bucket name must be specified when copying a part");
rejectNull(copyPartRequest.getUploadId(), "The upload id must be specified when copying a part");
rejectNull(copyPartRequest.getDestinationKey(), "The destination object key must be specified when copying a part");
rejectNull(copyPartRequest.getPartNumber(), "The part number must be specified when copying a part");
rejectNull(clientConfig.getRegion(), "region is null, region in clientConfig must be specified when copying a part");
String destinationKey = copyPartRequest.getDestinationKey();
String destinationBucketName = copyPartRequest.getDestinationBucketName();
CosHttpRequest<CopyPartRequest> request = createRequest(destinationBucketName, destinationKey, copyPartRequest, HttpMethodName.PUT);
populateRequestWithCopyPartParameters(request, copyPartRequest);
request.addParameter("uploadId", copyPartRequest.getUploadId());
request.addParameter("partNumber", Integer.toString(copyPartRequest.getPartNumber()));
/*
* We can't send a non-zero length Content-Length header if the user
* specified it, otherwise it messes up the HTTP connection when the
* remote server thinks there's more data to pull.
*/
setZeroContentLength(request);
CopyObjectResultHandler copyObjectResultHandler = null;
try {
@SuppressWarnings("unchecked") ResponseHeaderHandlerChain<CopyObjectResultHandler> handler = new ResponseHeaderHandlerChain<CopyObjectResultHandler>(// xml payload unmarshaller
new Unmarshallers.CopyObjectUnmarshaller(), // header handlers
new ServerSideEncryptionHeaderHandler<CopyObjectResultHandler>(), new COSVersionHeaderHandler());
copyObjectResultHandler = invoke(request, handler);
} catch (CosServiceException cse) {
/*
* If the request failed because one of the specified constraints
* was not met (ex: matching ETag, modified since date, etc.), then
* return null, so that users don't have to wrap their code in
* try/catch blocks and check for this status code if they want to
* use constraints.
*/
if (cse.getStatusCode() == Constants.FAILED_PRECONDITION_STATUS_CODE) {
return null;
}
throw cse;
}
/*
* CopyPart has two failure modes: 1 - An HTTP error code is returned
* and the error is processed like any other error response. 2 - An HTTP
* 200 OK code is returned, but the response content contains an XML
* error response.
*
* This makes it very difficult for the client runtime to cleanly detect
* this case and handle it like any other error response. We could
* extend the runtime to have a more flexible/customizable definition of
* success/error (per request), but it's probably overkill for this one
* special case.
*/
if (copyObjectResultHandler.getErrorCode() != null) {
String errorCode = copyObjectResultHandler.getErrorCode();
String errorMessage = copyObjectResultHandler.getErrorMessage();
String requestId = copyObjectResultHandler.getErrorRequestId();
CosServiceException cse = new CosServiceException(errorMessage);
cse.setErrorCode(errorCode);
cse.setErrorType(ErrorType.Service);
cse.setRequestId(requestId);
cse.setStatusCode(200);
throw cse;
}
CopyPartResult copyPartResult = new CopyPartResult();
copyPartResult.setETag(copyObjectResultHandler.getETag());
copyPartResult.setPartNumber(copyPartRequest.getPartNumber());
copyPartResult.setLastModifiedDate(copyObjectResultHandler.getLastModified());
copyPartResult.setVersionId(copyObjectResultHandler.getVersionId());
copyPartResult.setSSEAlgorithm(copyObjectResultHandler.getSSEAlgorithm());
copyPartResult.setSSECustomerAlgorithm(copyObjectResultHandler.getSSECustomerAlgorithm());
copyPartResult.setSSECustomerKeyMd5(copyObjectResultHandler.getSSECustomerKeyMd5());
copyPartResult.setCrc64Ecma(copyObjectResultHandler.getCrc64Ecma());
return copyPartResult;
}
Aggregations