sign method

SignedInfo sign({
  1. required String httpMethod,
  2. required String resourcePath,
  3. Map<String, String>? parameters,
  4. Map<String, String>? headers,
  5. String? contentMd5,
  6. String? dateString,
})

dateString Date in HttpDate or Expires in DateTime.secondsSinceEpoch

Implementation

SignedInfo sign({
  required String httpMethod,
  required String resourcePath,
  Map<String, String>? parameters,
  Map<String, String>? headers,
  String? contentMd5,
  String? dateString,
}) {
  final securityHeaders = {
    if (headers != null) ...headers,
    if (credentials.securityToken != null) ...{
      'x-oss-security-token': credentials.securityToken!,
    }
  };
  final sortedHeaders = _sortByLowerKey(securityHeaders);
  final contentType = sortedHeaders
      .firstWhere(
        (e) => e.key == 'content-type',
        orElse: () => MapEntry('', ''),
      )
      .value;
  final canonicalizedOSSHeaders = sortedHeaders
      .where((e) => e.key.startsWith('x-oss-'))
      .map((e) => '${e.key}:${e.value}')
      .join('\n');

  final securityParameters = {
    if (parameters != null) ...parameters,
  };
  final canonicalizedResource =
      _buildCanonicalizedResource(resourcePath, securityParameters);

  final date = dateString ?? _requestTime();
  final canonicalString = [
    httpMethod,
    contentMd5 ?? '',
    contentType,
    date,
    if (canonicalizedOSSHeaders.isNotEmpty) canonicalizedOSSHeaders,
    canonicalizedResource,
  ].join('\n');

  final signature = _computeHmacSha1(canonicalString);
  return SignedInfo(
      dateString: date,
      accessKeyId: credentials.accessKeyId,
      signature: signature,
      securityToken: credentials.securityToken);
}