in gems/aws-sigv4/lib/aws-sigv4/signer.rb [280:325]
def presign_url(options)
creds = fetch_credentials
http_method = extract_http_method(options)
url = extract_url(options)
headers = downcase_headers(options[:headers])
headers['host'] ||= host(url)
datetime = headers.delete('x-amz-date')
datetime ||= (options[:time] || Time.now)
content_sha256 = headers.delete('x-amz-content-sha256')
content_sha256 ||= options[:body_digest]
content_sha256 ||= sha256_hexdigest(options[:body] || '')
config = Aws::Crt::Auth::SigningConfig.new(
algorithm: @signing_algorithm,
signature_type: :http_request_query_params,
region: @region,
service: @service,
date: datetime,
signed_body_value: content_sha256,
signed_body_header_type: @apply_checksum_header ?
:sbht_content_sha256 : :sbht_none,
credentials: creds,
unsigned_headers: @unsigned_headers,
use_double_uri_encode: @uri_escape_path,
should_normalize_uri_path: @normalize_path,
omit_session_token: @omit_session_token,
expiration_in_seconds: options.fetch(:expires_in, 900)
)
http_request = Aws::Crt::Http::Message.new(
http_method, url.to_s, headers
)
signable = Aws::Crt::Auth::Signable.new(http_request)
signing_result = Aws::Crt::Auth::Signer.sign_request(config, signable, http_method, url.to_s)
url = URI.parse(signing_result[:path])
if options[:extra] && options[:extra].is_a?(Hash)
options[:extra][:config] = config
options[:extra][:signable] = signable
end
url
end