export function getSignatureV2()

in util/ts/src/signature.ts [62:124]


export function getSignatureV2(request: $tea.Request, bucketName: string, accessKeySecret: string, addtionalHeaders: string[] = []): {
  string2sign: string,
  signature: string
} {
  let resource = '';
  let pathname = '';
  if (bucketName) {
    pathname += '/' + bucketName + request.pathname;
  }
  let queryKeys = Object.keys(request.query || {});
  const [major, minor] = pathname.split('?');
  resource = encodeURIComponent(major);
  if (minor) {
    queryKeys.push(minor);
  }
  queryKeys.sort();
  if (queryKeys.length > 0 && !resource.endsWith('?')) {
    resource += '?';
  }
  queryKeys.forEach((key) => {
    if (!resource.endsWith('?')) {
      resource += '&';
    }
    if (typeof request.query[key] === 'undefined') {
      resource += encodeURIComponent(key);
    } else {
      resource += `${encodeURIComponent(key)}=${encodeURIComponent(request.query[key])}`;
    }
  })
  let addtionalHeaderMap = new Map();
  addtionalHeaders.forEach(header => {
    addtionalHeaderMap.set(header.toLocaleLowerCase(), 1);
  })
  let headerKeys = [];
  for (let [key] of Object.entries(request.headers || {})) {
    const lowerKey = key.toLocaleLowerCase();
    if (addtionalHeaderMap.get(lowerKey)) {
      headerKeys.push(key);
    }
    if (lowerKey.startsWith('x-oss-')) {
      headerKeys.push(key);
    }
  }
  let headers = '';
  headerKeys = headerKeys.sort();
  headerKeys.forEach(key => {
    headers += key.toLocaleLowerCase() + ':' + request.headers[key] + '\n';
  })
  let string2sign = request.method + '\n'
    + (request.headers['content-md5'] || '') + '\n'
    + (request.headers['content-type'] || '') + '\n'
    + request.headers['date'] + '\n'
    + headers
    + addtionalHeaders.join(';') + '\n'
    + resource;
  const hmac = createHmac('sha256', accessKeySecret);
  hmac.update(string2sign);
  let signature = hmac.digest('base64');
  return {
    string2sign,
    signature
  };
}