private static function getSignatureV2()

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
            )
        );
    }