diff --git a/src/main/java/com/aliyun/oss/OSS.java b/src/main/java/com/aliyun/oss/OSS.java index 2da7367e..e32ac62e 100644 --- a/src/main/java/com/aliyun/oss/OSS.java +++ b/src/main/java/com/aliyun/oss/OSS.java @@ -5200,4 +5200,14 @@ public UdfApplicationLog getUdfApplicationLog(GetUdfApplicationLogRequest getUdf * If any errors occurred in OSS while processing the request. */ public VoidResult writeGetObjectResponse(WriteGetObjectResponseRequest writeGetObjectResponseRequest) throws OSSException, ClientException; + + /** + * invoke operation + * + * @param request request + * @return result + * @throws OSSException + * @throws ClientException + */ + CommonApiResult invokeOperation(CommonApiRequest request) throws OSSException, ClientException; } diff --git a/src/main/java/com/aliyun/oss/OSSClient.java b/src/main/java/com/aliyun/oss/OSSClient.java index 9cc06eb4..33340872 100644 --- a/src/main/java/com/aliyun/oss/OSSClient.java +++ b/src/main/java/com/aliyun/oss/OSSClient.java @@ -76,6 +76,7 @@ public class OSSClient implements OSS { private OSSUploadOperation uploadOperation; private OSSDownloadOperation downloadOperation; private LiveChannelOperation liveChannelOperation; + private OSSCommonOperation ossCommonOperation; /**Gets the inner multipartOperation, used for subclass to do implement opreation. * @return the {@link OSSMultipartOperation} instance. @@ -266,6 +267,7 @@ public synchronized void setEndpoint(String endpoint) { this.multipartOperation.setEndpoint(uri); this.corsOperation.setEndpoint(uri); this.liveChannelOperation.setEndpoint(uri); + this.ossCommonOperation.setEndpoint(uri); } /** @@ -327,6 +329,7 @@ private void initOperations() { this.uploadOperation = new OSSUploadOperation(this.multipartOperation); this.downloadOperation = new OSSDownloadOperation(objectOperation); this.liveChannelOperation = new LiveChannelOperation(this.serviceClient, this.credsProvider); + this.ossCommonOperation = new OSSCommonOperation(this.serviceClient, this.credsProvider); } private void initDefaultsByEndpoint() { @@ -371,6 +374,7 @@ public void setProduct(String product) { this.multipartOperation.setProduct(product); this.corsOperation.setProduct(product); this.liveChannelOperation.setProduct(product); + this.ossCommonOperation.setProduct(product); } /** @@ -385,6 +389,7 @@ public void setRegion(String region) { this.multipartOperation.setRegion(region); this.corsOperation.setRegion(region); this.liveChannelOperation.setRegion(region); + this.ossCommonOperation.setRegion(region); } /** @@ -398,6 +403,7 @@ public void setCloudBoxId(String cloudBoxId) { this.multipartOperation.setCloudBoxId(cloudBoxId); this.corsOperation.setCloudBoxId(cloudBoxId); this.liveChannelOperation.setCloudBoxId(cloudBoxId); + this.ossCommonOperation.setCloudBoxId(cloudBoxId); } @@ -1997,6 +2003,11 @@ public VoidResult writeGetObjectResponse(WriteGetObjectResponseRequest writeGetO return this.objectOperation.writeGetObjectResponse(writeGetObjectResponseRequest); } + @Override + public CommonApiResult invokeOperation(CommonApiRequest request) throws OSSException, ClientException{ + return this.ossCommonOperation.invokeOperation(request); + } + @Override public void shutdown() { try { diff --git a/src/main/java/com/aliyun/oss/common/comm/RequestMessage.java b/src/main/java/com/aliyun/oss/common/comm/RequestMessage.java index ba682fe8..3854d5c7 100644 --- a/src/main/java/com/aliyun/oss/common/comm/RequestMessage.java +++ b/src/main/java/com/aliyun/oss/common/comm/RequestMessage.java @@ -21,8 +21,10 @@ import java.net.URI; import java.net.URL; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; import com.aliyun.oss.HttpMethod; import com.aliyun.oss.model.WebServiceRequest; @@ -62,6 +64,12 @@ public class RequestMessage extends HttpMesssage { /* The original request provided by user */ private final WebServiceRequest originalRequest; + /** + * Only the common API is effective + * Does not affect methods such as generatePresentedUrl V1 + */ + private Set signedParameterNames = new HashSet(); + public RequestMessage(String bucketName, String key) { this(null, bucketName, key); } @@ -70,6 +78,14 @@ public RequestMessage(WebServiceRequest originalRequest, String bucketName, Stri this.originalRequest = (originalRequest == null) ? WebServiceRequest.NOOP : originalRequest; } + public Set getSignedParameterNames() { + return signedParameterNames; + } + + public void setSignedParameterNames(Set signedParameterNames) { + this.signedParameterNames = signedParameterNames; + } + public HttpMethod getMethod() { return method; } diff --git a/src/main/java/com/aliyun/oss/internal/OSSCommonOperation.java b/src/main/java/com/aliyun/oss/internal/OSSCommonOperation.java new file mode 100644 index 00000000..144e1030 --- /dev/null +++ b/src/main/java/com/aliyun/oss/internal/OSSCommonOperation.java @@ -0,0 +1,54 @@ +package com.aliyun.oss.internal; + +import com.aliyun.oss.common.auth.CredentialsProvider; +import com.aliyun.oss.common.comm.RequestMessage; +import com.aliyun.oss.common.comm.ServiceClient; +import com.aliyun.oss.common.utils.StringUtils; +import com.aliyun.oss.model.CommonApiRequest; +import com.aliyun.oss.model.CommonApiResult; + +import static com.aliyun.oss.internal.OSSUtils.ensureBucketNameValid; + +public class OSSCommonOperation extends OSSOperation { + + public OSSCommonOperation(ServiceClient client, CredentialsProvider credentialsProvider) { + super(client, credentialsProvider); + } + + /** + * common api call + * + * @param request request + * @return result + */ + public CommonApiResult invokeOperation(CommonApiRequest request) { + + if (request.getBucketName() != null) { + ensureBucketNameValid(request.getBucketName()); + } + + OSSRequestMessageBuilder builder = new OSSRequestMessageBuilder(getInnerClient()).setEndpoint(getEndpoint()). + setMethod(request.getMethod()).setBucket(request.getBucketName()).setKey(request.getKey()). + setParameters(request.getParameters()).setHeaders(request.getHeaders()).setInputStream( + request.getInputStream()).setSignedParameterNames(request.getSignedParameterNames()).setOriginalRequest(request); + + if (null != request.getInputSize()) { + builder.setInputSize(request.getInputSize()); + } + + if (null != request.getUseChunkEncoding()) { + builder.setUseChunkEncoding(request.getUseChunkEncoding()); + } + + if (null != request.getFixedLengthInputStream()) { + builder.setInputStreamWithLength(request.getFixedLengthInputStream()); + } + + RequestMessage requestMessage = builder.build(); + + CommonApiResult result = doOperation(requestMessage, request.getResponseParser(), request.getBucketName(), + request.getKey(), true); + + return result; + } +} diff --git a/src/main/java/com/aliyun/oss/internal/OSSRequestMessageBuilder.java b/src/main/java/com/aliyun/oss/internal/OSSRequestMessageBuilder.java index ef2971b8..64335692 100644 --- a/src/main/java/com/aliyun/oss/internal/OSSRequestMessageBuilder.java +++ b/src/main/java/com/aliyun/oss/internal/OSSRequestMessageBuilder.java @@ -26,11 +26,7 @@ import java.io.InputStream; import java.net.URI; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.*; import com.aliyun.oss.ClientConfiguration; import com.aliyun.oss.HttpMethod; @@ -57,6 +53,7 @@ public class OSSRequestMessageBuilder { private boolean useChunkEncoding = false; private WebServiceRequest originalRequest; + private Set signedParameterNames = new HashSet(); public OSSRequestMessageBuilder(ServiceClient innerClient) { this.innerClient = innerClient; @@ -166,6 +163,15 @@ public OSSRequestMessageBuilder setOriginalRequest(WebServiceRequest originalReq return this; } + public Set getSignedParameterNames() { + return signedParameterNames; + } + + public OSSRequestMessageBuilder setSignedParameterNames(Set signedParameterNames) { + this.signedParameterNames = signedParameterNames; + return this; + } + public RequestMessage build() { ClientConfiguration clientCofig = this.innerClient.getClientConfiguration(); Map sentHeaders = new HashMap(this.headers); @@ -182,7 +188,7 @@ public RequestMessage build() { request.setContent(this.inputStream); request.setContentLength(this.inputSize); request.setUseChunkEncoding(this.inputSize == -1 ? true : this.useChunkEncoding); - + request.setSignedParameterNames(new HashSet(this.signedParameterNames)); return request; } diff --git a/src/main/java/com/aliyun/oss/internal/SignUtils.java b/src/main/java/com/aliyun/oss/internal/SignUtils.java index e3037619..dc53a7ef 100644 --- a/src/main/java/com/aliyun/oss/internal/SignUtils.java +++ b/src/main/java/com/aliyun/oss/internal/SignUtils.java @@ -95,7 +95,8 @@ public static String buildCanonicalString(String method, String resourcePath, Re } // Append canonical resource to canonical string - canonicalString.append(buildCanonicalizedResource(resourcePath, request.getParameters())); + canonicalString.append(buildCanonicalizedResource(resourcePath, request.getParameters(), request.getSignedParameterNames())); + return canonicalString.toString(); } @@ -194,6 +195,10 @@ public static String buildSignedURL(GeneratePresignedUrlRequest request, Credent } public static String buildCanonicalizedResource(String resourcePath, Map parameters) { + return buildCanonicalizedResource(resourcePath, parameters, null); + } + + public static String buildCanonicalizedResource(String resourcePath, Map parameters, Set signedParameterNames) { assertTrue(resourcePath.startsWith("/"), "Resource path should start with slash character"); StringBuilder builder = new StringBuilder(); @@ -205,7 +210,8 @@ public static String buildCanonicalizedResource(String resourcePath, Map extends GenericRequest { + + private HttpMethod method; + + private InputStream inputStream; + + private FixedLengthInputStream fixedLengthInputStream; + + private Long inputSize; + + private Boolean useChunkEncoding; + + private ResponseParser> responseParser; + + private Set signedParameterNames = new HashSet(); + + public Set getSignedParameterNames() { + return signedParameterNames; + } + + public void setSignedParameterNames(Set signedParameterNames) { + this.signedParameterNames = signedParameterNames; + } + + public HttpMethod getMethod() { + return method; + } + + public void setMethod(HttpMethod method) { + this.method = method; + } + + public InputStream getInputStream() { + return inputStream; + } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + } + + public FixedLengthInputStream getFixedLengthInputStream() { + return fixedLengthInputStream; + } + + public void setFixedLengthInputStream(FixedLengthInputStream fixedLengthInputStream) { + this.fixedLengthInputStream = fixedLengthInputStream; + } + + public Long getInputSize() { + return inputSize; + } + + public void setInputSize(Long inputSize) { + this.inputSize = inputSize; + } + + public Boolean getUseChunkEncoding() { + return useChunkEncoding; + } + + public void setUseChunkEncoding(Boolean useChunkEncoding) { + this.useChunkEncoding = useChunkEncoding; + } + + public ResponseParser> getResponseParser() { + return responseParser; + } + + public void setResponseParser( + ResponseParser> responseParser) { + this.responseParser = responseParser; + } +} diff --git a/src/main/java/com/aliyun/oss/model/CommonApiResult.java b/src/main/java/com/aliyun/oss/model/CommonApiResult.java new file mode 100644 index 00000000..8909a06b --- /dev/null +++ b/src/main/java/com/aliyun/oss/model/CommonApiResult.java @@ -0,0 +1,14 @@ +package com.aliyun.oss.model; + +public class CommonApiResult extends GenericResult { + + private T result; + + public T getResult() { + return result; + } + + public void setResult(T result) { + this.result = result; + } +}