Gems/AWSCore/Code/Source/Framework/RequestBuilder.cpp (169 lines of code) (raw):
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <Framework/RequestBuilder.h>
namespace AWSCore
{
RequestBuilder::RequestBuilder()
: m_httpMethod(Aws::Http::HttpMethod::HTTP_GET)
{
}
bool RequestBuilder::SetPathParameterUnescaped(const char* key, const char* value)
{
size_t start_pos = m_requestUrl.find(key);
if (start_pos == Aws::String::npos)
{
AZ_Error("TODO", false, "Key \"%s\" not found in url \"%s\".", key, m_requestUrl.c_str());
return false;
}
else
{
m_requestUrl.replace(start_pos, strlen(key), value);
return true;
}
}
bool RequestBuilder::SetPathParameter(const char* key, const AZStd::string& value)
{
return SetPathParameterUnescaped(key, escape(value.c_str()).c_str());
}
bool RequestBuilder::SetPathParameter(const char* key, const char* value)
{
return SetPathParameterUnescaped(key, escape(value).c_str());
}
bool RequestBuilder::SetPathParameter(const char* key, double value)
{
return SetPathParameterUnescaped(key, AZStd::string::format("%f", value).c_str());
}
bool RequestBuilder::SetPathParameter(const char* key, bool value)
{
return SetPathParameterUnescaped(key, value ? "true" : "false");
}
bool RequestBuilder::SetPathParameter(const char* key, int value)
{
return SetPathParameterUnescaped(key, AZStd::string::format("%i", value).c_str());
}
bool RequestBuilder::SetPathParameter(const char* key, unsigned value)
{
return SetPathParameterUnescaped(key, AZStd::string::format("%u", value).c_str());
}
bool RequestBuilder::SetPathParameter(const char* key, int64_t value)
{
return SetPathParameterUnescaped(key, AZStd::string::format("%" PRId64, static_cast<int64_t>(value)).c_str());
}
bool RequestBuilder::SetPathParameter(const char* key, uint64_t value)
{
return SetPathParameterUnescaped(key, AZStd::string::format("%" PRIu64, static_cast<uint64_t>(value)).c_str());
}
bool RequestBuilder::AddQueryParameterUnescaped(const char* name, const char* value)
{
m_requestUrl.append(m_requestUrl.find('?') == Aws::String::npos ? "?" : "&");
m_requestUrl.append(name);
m_requestUrl.append("=");
m_requestUrl.append(value);
return true;
}
bool RequestBuilder::AddQueryParameter(const char* name, const AZStd::string& value)
{
return AddQueryParameterUnescaped(name, escape(value.c_str()).c_str());
}
bool RequestBuilder::AddQueryParameter(const char* name, const char* value)
{
return AddQueryParameterUnescaped(name, escape(value).c_str());
}
bool RequestBuilder::AddQueryParameter(const char* name, double value)
{
return AddQueryParameterUnescaped(name, AZStd::string::format("%f", value).c_str());
}
bool RequestBuilder::AddQueryParameter(const char* name, bool value)
{
return AddQueryParameterUnescaped(name, value ? "true" : "false");
}
bool RequestBuilder::AddQueryParameter(const char* name, int value)
{
return AddQueryParameterUnescaped(name, AZStd::string::format("%d", value).c_str());
}
bool RequestBuilder::AddQueryParameter(const char* name, unsigned value)
{
return AddQueryParameterUnescaped(name, AZStd::string::format("%u", value).c_str());
}
bool RequestBuilder::AddQueryParameter(const char* name, int64_t value)
{
return AddQueryParameterUnescaped(name, AZStd::string::format("%" PRId64, static_cast<int64_t>(value)).c_str());
}
bool RequestBuilder::AddQueryParameter(const char* name, uint64_t value)
{
return AddQueryParameterUnescaped(name, AZStd::string::format("%" PRIu64, static_cast<uint64_t>(value)).c_str());
}
Aws::String RequestBuilder::escape(const char* value)
{
Aws::String target;
while (*value != '\0')
{
switch (*value)
{
case ' ':
target.append("%20", 3);
break;
case '!':
target.append("%21", 3);
break;
case '#':
target.append("%23", 3);
break;
case '$':
target.append("%24", 3);
break;
case '%':
target.append("%25", 3);
break;
case '&':
target.append("%26", 3);
break;
case '\'':
target.append("%27", 3);
break;
case '(':
target.append("%28", 3);
break;
case ')':
target.append("%29", 3);
break;
case '*':
target.append("%2A", 3);
break;
case '+':
target.append("%2B", 3);
break;
case ',':
target.append("%2C", 3);
break;
case '/':
target.append("%2F", 3);
break;
case ':':
target.append("%3A", 3);
break;
case ';':
target.append("%3B", 3);
break;
case '=':
target.append("%3D", 3);
break;
case '?':
target.append("%3F", 3);
break;
case '@':
target.append("%40", 3);
break;
case '[':
target.append("%5B", 3);
break;
case ']':
target.append("%5D", 3);
break;
default:
target.push_back(*value);
break;
}
++value;
}
return target;
}
} // namespace AWSCore