in src/main/java/com/aliyun/oss/internal/SignV2Utils.java [82:151]
public static String buildCanonicalString(String method, String resourcePath, RequestMessage request, Set<String> additionalHeaderNames) {
StringBuilder canonicalString = new StringBuilder();
canonicalString.append(method).append(SignParameters.NEW_LINE);
Map<String, String> headers = request.getHeaders();
TreeMap<String, String> fixedHeadersToSign = new TreeMap<String, String>();
TreeMap<String, String> canonicalizedOssHeadersToSign = new TreeMap<String, String>();
if (headers != null) {
for (Map.Entry<String, String> header : headers.entrySet()) {
if (header.getKey() != null) {
String lowerKey = header.getKey().toLowerCase();
if (lowerKey.equals(HttpHeaders.CONTENT_TYPE.toLowerCase())
|| lowerKey.equals(HttpHeaders.CONTENT_MD5.toLowerCase())
|| lowerKey.equals(HttpHeaders.DATE.toLowerCase())) {
fixedHeadersToSign.put(lowerKey, header.getValue().trim());
} else if (lowerKey.startsWith(OSSHeaders.OSS_PREFIX)){
canonicalizedOssHeadersToSign.put(lowerKey, header.getValue().trim());
}
}
}
}
if (!fixedHeadersToSign.containsKey(HttpHeaders.CONTENT_TYPE.toLowerCase())) {
fixedHeadersToSign.put(HttpHeaders.CONTENT_TYPE.toLowerCase(), "");
}
if (!fixedHeadersToSign.containsKey(HttpHeaders.CONTENT_MD5.toLowerCase())) {
fixedHeadersToSign.put(HttpHeaders.CONTENT_MD5.toLowerCase(), "");
}
for (String additionalHeaderName : additionalHeaderNames) {
if (additionalHeaderName != null && headers.get(additionalHeaderName) != null) {
canonicalizedOssHeadersToSign.put(additionalHeaderName.toLowerCase(), headers.get(additionalHeaderName).trim());
}
}
// Append fixed headers to sign to canonical string
for (Map.Entry<String, String> entry : fixedHeadersToSign.entrySet()) {
Object value = entry.getValue();
canonicalString.append(value);
canonicalString.append(SignParameters.NEW_LINE);
}
// Append canonicalized oss headers to sign to canonical string
for (Map.Entry<String, String> entry : canonicalizedOssHeadersToSign.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
canonicalString.append(key).append(':').append(value).append(SignParameters.NEW_LINE);
}
// Append additional header names
TreeSet<String> ts = new TreeSet<String>();
for (String additionalHeaderName : additionalHeaderNames) {
ts.add(additionalHeaderName.toLowerCase());
}
String separator = "";
for (String additionalHeaderName : ts) {
canonicalString.append(separator).append(additionalHeaderName);
separator = ";";
}
canonicalString.append(SignParameters.NEW_LINE);
// Append canonical resource to canonical string
canonicalString.append(buildCanonicalizedResource(resourcePath, request.getParameters()));
return canonicalString.toString();
}