in src/AlibabaCloud.OSS.V2/Internal/ClientImpl.cs [108:166]
public PresignInnerResult PresignInner(
OperationInput input,
OperationOptions? options = null
)
{
// verify input
VerifyOperation(ref input);
// build execute context;
var (request, context) = BuildRequestContext(input, options ?? _defaultPresignOpOptions);
var provider = Options.CredentialsProvider;
var result = new PresignInnerResult();
if (provider != null &&
provider is not Credentials.AnonymousCredentialsProvider &&
context.SigningContext != null)
{
var cred = provider.GetCredentials();
var singer = Options.Signer;
if (!cred.HasKeys) throw new("Credentials is null or empty");
context.SigningContext.Credentials = cred;
context.SigningContext.Request = request;
singer!.Sign(context.SigningContext);
request = context.SigningContext.Request;
// save to result
result.Expiration = context.SigningContext.Expiration;
// signed headers
// content-type, content-md5, x-oss- and additionalHeaders in sign v4
var expect = new List<string> { "content-type", "content-md5" };
if (singer is Signer.SignerV4)
{
if (context.SigningContext.AdditionalHeaders != null)
{
expect.AddRange(context.SigningContext.AdditionalHeaders.Select(h => h.ToLowerInvariant()));
}
var now = DateTime.UtcNow;
if (result.Expiration - now > TimeSpan.FromDays(7))
{
throw new PresignExpirationException();
}
}
var signedHeaders = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (var header in request.Headers)
{
var low = header.Key.ToLowerInvariant();
if (expect.Contains(low) || low.StartsWith("x-oss-")) signedHeaders[header.Key] = header.Value;
}
result.SignedHeaders = signedHeaders;
}
result.Url = request.RequestUri.AbsoluteUri;
result.Method = request.Method;
return result;
}