huaweicloud / huaweicloud-sdk-java-obs

The OBS SDK for Java, which is used for accessing Object Storage Service
Other
133 stars 116 forks source link

client.setObjectAcl 的objectKey如果携带/ 转义 %2F,请求地址错误,请求失败; #86

Open DemonHJS opened 2 years ago

DemonHJS commented 2 years ago

版本号

3.21.12

调用方法

setObjectAcl(String bucketName, String objectKey, AccessControlList acl)

com.obs.services.internal.RestConnectionService

protected okhttp3.Request.Builder setupConnection(HttpMethodEnum method, String bucketName, String objectKey, Map<String, String> requestParameters, RequestBody body, boolean isOEF, boolean isListBuckets) throws ServiceException {
        boolean pathStyle = this.isPathStyle();
        String endPoint = this.getEndpoint();
        boolean isCname = this.isCname();
        String hostname = !isCname && !isListBuckets ? ServiceUtils.generateHostnameForBucket(RestUtils.encodeUrlString(bucketName), pathStyle, endPoint) : endPoint;
        String resourceString = "/";
        if (hostname.equals(endPoint) && !isCname && bucketName.length() > 0) {
            resourceString = resourceString + RestUtils.encodeUrlString(bucketName);
        }

        if (objectKey != null) {
            resourceString = resourceString + (pathStyle && !isCname ? "/" : "") + RestUtils.encodeUrlString(objectKey);
        }

        String url = this.addProtocol(hostname, resourceString);
        url = this.addRequestParametersToUrlPath(url, requestParameters, isOEF);
        okhttp3.Request.Builder builder = this.createRequestBuilder(method, body, url);
        return builder;
    }

com.obs.services.internal.utils.RestUtils

public static String encodeUrlString(String path) throws ServiceException {
        try {
            return URLEncoder.encode(path, "UTF-8").replaceAll("\\+", "%20").replaceAll("%7E", "~").replaceAll("\\*", "%2A");
        } catch (UnsupportedEncodingException var2) {
            throw new ServiceException("Unable to encode path: " + path, var2);
        }
    }
zzq996 commented 10 months ago

通过这个可以设置不进行编码 setObjectAclRequest.setIsEncodeHeaders(false);