in util/php/src/OSSUtils.php [327:398]
private static function getSignatureV2($request, $bucketName, $accessKeySecret, $addtionalHeaders)
{
if (empty($addtionalHeaders)) {
$addtionalHeaders = [];
}
$canonicalizeResource = '';
$pathname = $request->pathname;
if (!empty($bucketName)) {
$pathname = '/' . $bucketName . $pathname;
}
$tmp = explode('?', $pathname);
$canonicalizeResource .= rawurlencode($tmp[0]);
$sortDict = $request->query;
if (\count($tmp) > 1 && !empty($tmp[1])) {
$sortDict[$tmp[1]] = '';
}
ksort($sortDict);
if (\count($sortDict) > 0 && false === strpos($canonicalizeResource, '?')) {
$canonicalizeResource .= '?';
}
$flag = '?' === $canonicalizeResource[\strlen($canonicalizeResource) - 1];
foreach ($sortDict as $k => $v) {
if (!$flag) {
$canonicalizeResource .= '&';
} else {
$flag = false;
}
if (!empty($v)) {
$canonicalizeResource .= rawurlencode($k) . '=' . rawurlencode($v);
} else {
$canonicalizeResource .= rawurlencode($k);
}
}
$headers = [];
$headerKeys = [];
foreach ($request->headers as $k => $v) {
$key = strtolower($k);
if (0 === strpos($key, 'x-oss-')) {
$headers[$key] = $v;
}
$headerKeys[$key] = $k;
}
foreach ($addtionalHeaders as $header) {
$header = strtolower($header);
if (isset($headerKeys[$header]) && !isset($headers[$header])) {
$headers[$header] = $request->headers[$headerKeys[$header]];
}
}
$requestHeaders = new Dot($request->headers);
$signString = implode("\n", [
strtoupper($request->method),
$requestHeaders->get('content-md5', ''),
$requestHeaders->get('content-type', ''),
$requestHeaders->get('date', ''),
implode("\n", self::getCanonicalizeHeaders($headers)),
implode(';', $addtionalHeaders),
$canonicalizeResource,
]);
return base64_encode(
hash_hmac(
'sha256',
$signString,
$accessKeySecret,
true
)
);
}