/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <aws/core/client/AWSUrlPresigner.h>
#include <aws/core/client/AWSClient.h>
#include <aws/core/http/HttpClientFactory.h>
namespace Aws
{
namespace Client
{
using HttpRequest = Http::HttpRequest;
using HttpMethod = Http::HttpMethod;
using URI = Http::URI;
AWSUrlPresigner::AWSUrlPresigner(const AWSClient& client)
: m_awsClient(client)
{}
Aws::Client::AWSAuthSigner* AWSUrlPresigner::GetSignerByName(const char* name) const
{
return m_awsClient.GetSignerByName(name);
}
std::shared_ptr<Aws::Http::HttpRequest>
ConvertToRequestForPresigning(const Aws::AmazonWebServiceRequest& request,
const Aws::Http::URI& uri,
Aws::Http::HttpMethod method,
const Aws::Http::QueryStringParameterCollection& extraParams)
{
Aws::Http::URI uriCopy = uri;
request.PutToPresignedUrl(uriCopy);
std::shared_ptr<HttpRequest> httpRequest = CreateHttpRequest(uriCopy, method, Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
for (auto& param : extraParams)
{
httpRequest->AddQueryStringParameter(param.first.c_str(), param.second);
}
return httpRequest;
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const URI& uri,
HttpMethod method,
long long expirationInSeconds) const
{
const char* regionOverride = nullptr;
const char* serviceNameOverride = nullptr;
const char* signerName = Aws::Auth::SIGV4_SIGNER;
return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const URI& uri,
HttpMethod method,
const Aws::Http::HeaderValueCollection& customizedHeaders,
long long expirationInSeconds) const
{
const char* regionOverride = nullptr;
const char* serviceNameOverride = nullptr;
const char* signerName = Aws::Auth::SIGV4_SIGNER;
return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, customizedHeaders, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const URI& uri,
HttpMethod method,
const char* regionOverride,
long long expirationInSeconds) const
{
const char* serviceNameOverride = nullptr;
const char* signerName = Aws::Auth::SIGV4_SIGNER;
return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const URI& uri,
HttpMethod method,
const char* regionOverride,
const Aws::Http::HeaderValueCollection& customizedHeaders,
long long expirationInSeconds) const
{
const char* serviceNameOverride = nullptr;
const char* signerName = Aws::Auth::SIGV4_SIGNER;
return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, customizedHeaders, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Http::URI& uri,
Aws::Http::HttpMethod method,
const char* regionOverride,
const char* serviceNameOverride,
long long expirationInSeconds) const
{
const char* signerName = Aws::Auth::SIGV4_SIGNER;
return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Http::URI& uri,
Aws::Http::HttpMethod method,
const char* regionOverride,
const char* serviceNameOverride,
const Aws::Http::HeaderValueCollection& customizedHeaders,
long long expirationInSeconds) const
{
const char* signerName = Aws::Auth::SIGV4_SIGNER;
return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, customizedHeaders, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Http::URI& uri,
Aws::Http::HttpMethod method,
const char* regionOverride,
const char* serviceNameOverride,
const char* signerName,
long long expirationInSeconds) const
{
const Aws::Http::HeaderValueCollection& customizedHeaders = {};
return GeneratePresignedUrl(uri, method, regionOverride, serviceNameOverride, signerName, customizedHeaders, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Http::URI& uri,
Aws::Http::HttpMethod method,
const char* region,
const char* serviceName,
const char* signerName,
const Aws::Http::HeaderValueCollection& customizedHeaders,
long long expirationInSeconds) const
{
/* a real method implementation */
if (!signerName) {
signerName = Aws::Auth::SIGV4_SIGNER;
}
std::shared_ptr<HttpRequest> request = CreateHttpRequest(uri, method, Aws::Utils::Stream::DefaultResponseStreamFactoryMethod);
for (const auto& it: customizedHeaders)
{
request->SetHeaderValue(it.first.c_str(), it.second);
}
auto signer = GetSignerByName(signerName);
if (signer->PresignRequest(*request, region, serviceName, expirationInSeconds))
{
return request->GetURIString();
}
return {};
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::Endpoint::AWSEndpoint& endpoint,
Aws::Http::HttpMethod method /* = Http::HttpMethod::HTTP_POST */,
const Aws::Http::HeaderValueCollection& customizedHeaders /* = {} */,
uint64_t expirationInSeconds /* = 0 */,
const char* signerName /* = Aws::Auth::SIGV4_SIGNER */,
const char* signerRegionOverride /* = nullptr */,
const char* signerServiceNameOverride /* = nullptr */) const
{
const Aws::Http::URI& uri = endpoint.GetURI();
if (endpoint.GetAttributes()) {
signerName = endpoint.GetAttributes()->authScheme.GetName().c_str();
if (endpoint.GetAttributes()->authScheme.GetSigningRegion()) {
signerRegionOverride = endpoint.GetAttributes()->authScheme.GetSigningRegion()->c_str();
}
if (endpoint.GetAttributes()->authScheme.GetSigningRegionSet()) {
signerRegionOverride = endpoint.GetAttributes()->authScheme.GetSigningRegionSet()->c_str();
}
if (endpoint.GetAttributes()->authScheme.GetSigningName()) {
signerServiceNameOverride = endpoint.GetAttributes()->authScheme.GetSigningName()->c_str();
}
}
return GeneratePresignedUrl(uri, method, signerRegionOverride, signerServiceNameOverride, signerName, customizedHeaders, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::AmazonWebServiceRequest& request,
const Aws::Http::URI& uri,
Aws::Http::HttpMethod method,
const char* regionOverride,
const Aws::Http::QueryStringParameterCollection& extraParams,
long long expirationInSeconds) const
{
const char* serviceNameOverride = nullptr;
const char* signerName = Aws::Auth::SIGV4_SIGNER;
return GeneratePresignedUrl(request, uri, method, regionOverride, serviceNameOverride, signerName, extraParams, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::AmazonWebServiceRequest& request,
const Aws::Http::URI& uri,
Aws::Http::HttpMethod method,
const char* regionOverride,
const char* serviceNameOverride,
const char* signerName,
const Aws::Http::QueryStringParameterCollection& extraParams,
long long expirationInSeconds) const
{
/* a real method implementation */
if (!signerName) {
signerName = Aws::Auth::SIGV4_SIGNER;
}
std::shared_ptr<HttpRequest> httpRequest =
ConvertToRequestForPresigning(request, uri, method, extraParams);
auto signer = GetSignerByName(signerName);
if (signer->PresignRequest(*httpRequest, regionOverride, serviceNameOverride, expirationInSeconds))
{
return httpRequest->GetURIString();
}
return {};
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::AmazonWebServiceRequest& request,
const Aws::Http::URI& uri,
Aws::Http::HttpMethod method,
const char* regionOverride,
const char* serviceNameOverride,
const Aws::Http::QueryStringParameterCollection& extraParams,
long long expirationInSeconds) const
{
const char* signerName = Aws::Auth::SIGV4_SIGNER;
return GeneratePresignedUrl(request, uri, method, regionOverride, serviceNameOverride, signerName, extraParams, expirationInSeconds);
}
Aws::String AWSUrlPresigner::GeneratePresignedUrl(const Aws::AmazonWebServiceRequest& request,
const Aws::Http::URI& uri,
Aws::Http::HttpMethod method,
const Aws::Http::QueryStringParameterCollection& extraParams,
long long expirationInSeconds) const
{
const char* regionOverride = nullptr;
const char* serviceNameOverride = nullptr;
const char* signerName = Aws::Auth::SIGV4_SIGNER;
return GeneratePresignedUrl(request, uri, method, regionOverride, serviceNameOverride, signerName, extraParams, expirationInSeconds);
}
} // namespace Client
} // namespace Aws