public PresignInnerResult PresignInner()

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