RequestBuilder.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Framework/RequestBuilder.h>
  9. namespace AWSCore
  10. {
  11. RequestBuilder::RequestBuilder()
  12. : m_httpMethod(Aws::Http::HttpMethod::HTTP_GET)
  13. {
  14. }
  15. bool RequestBuilder::SetPathParameterUnescaped(const char* key, const char* value)
  16. {
  17. size_t start_pos = m_requestUrl.find(key);
  18. if (start_pos == Aws::String::npos)
  19. {
  20. AZ_Error("TODO", false, "Key \"%s\" not found in url \"%s\".", key, m_requestUrl.c_str());
  21. return false;
  22. }
  23. else
  24. {
  25. m_requestUrl.replace(start_pos, strlen(key), value);
  26. return true;
  27. }
  28. }
  29. bool RequestBuilder::SetPathParameter(const char* key, const AZStd::string& value)
  30. {
  31. return SetPathParameterUnescaped(key, escape(value.c_str()).c_str());
  32. }
  33. bool RequestBuilder::SetPathParameter(const char* key, const char* value)
  34. {
  35. return SetPathParameterUnescaped(key, escape(value).c_str());
  36. }
  37. bool RequestBuilder::SetPathParameter(const char* key, double value)
  38. {
  39. return SetPathParameterUnescaped(key, AZStd::string::format("%f", value).c_str());
  40. }
  41. bool RequestBuilder::SetPathParameter(const char* key, bool value)
  42. {
  43. return SetPathParameterUnescaped(key, value ? "true" : "false");
  44. }
  45. bool RequestBuilder::SetPathParameter(const char* key, int value)
  46. {
  47. return SetPathParameterUnescaped(key, AZStd::string::format("%i", value).c_str());
  48. }
  49. bool RequestBuilder::SetPathParameter(const char* key, unsigned value)
  50. {
  51. return SetPathParameterUnescaped(key, AZStd::string::format("%u", value).c_str());
  52. }
  53. bool RequestBuilder::SetPathParameter(const char* key, int64_t value)
  54. {
  55. return SetPathParameterUnescaped(key, AZStd::string::format("%" PRId64, static_cast<int64_t>(value)).c_str());
  56. }
  57. bool RequestBuilder::SetPathParameter(const char* key, uint64_t value)
  58. {
  59. return SetPathParameterUnescaped(key, AZStd::string::format("%" PRIu64, static_cast<uint64_t>(value)).c_str());
  60. }
  61. bool RequestBuilder::AddQueryParameterUnescaped(const char* name, const char* value)
  62. {
  63. m_requestUrl.append(m_requestUrl.find('?') == Aws::String::npos ? "?" : "&");
  64. m_requestUrl.append(name);
  65. m_requestUrl.append("=");
  66. m_requestUrl.append(value);
  67. return true;
  68. }
  69. bool RequestBuilder::AddQueryParameter(const char* name, const AZStd::string& value)
  70. {
  71. return AddQueryParameterUnescaped(name, escape(value.c_str()).c_str());
  72. }
  73. bool RequestBuilder::AddQueryParameter(const char* name, const char* value)
  74. {
  75. return AddQueryParameterUnescaped(name, escape(value).c_str());
  76. }
  77. bool RequestBuilder::AddQueryParameter(const char* name, double value)
  78. {
  79. return AddQueryParameterUnescaped(name, AZStd::string::format("%f", value).c_str());
  80. }
  81. bool RequestBuilder::AddQueryParameter(const char* name, bool value)
  82. {
  83. return AddQueryParameterUnescaped(name, value ? "true" : "false");
  84. }
  85. bool RequestBuilder::AddQueryParameter(const char* name, int value)
  86. {
  87. return AddQueryParameterUnescaped(name, AZStd::string::format("%d", value).c_str());
  88. }
  89. bool RequestBuilder::AddQueryParameter(const char* name, unsigned value)
  90. {
  91. return AddQueryParameterUnescaped(name, AZStd::string::format("%u", value).c_str());
  92. }
  93. bool RequestBuilder::AddQueryParameter(const char* name, int64_t value)
  94. {
  95. return AddQueryParameterUnescaped(name, AZStd::string::format("%" PRId64, static_cast<int64_t>(value)).c_str());
  96. }
  97. bool RequestBuilder::AddQueryParameter(const char* name, uint64_t value)
  98. {
  99. return AddQueryParameterUnescaped(name, AZStd::string::format("%" PRIu64, static_cast<uint64_t>(value)).c_str());
  100. }
  101. Aws::String RequestBuilder::escape(const char* value)
  102. {
  103. Aws::String target;
  104. while (*value != '\0')
  105. {
  106. switch (*value)
  107. {
  108. case ' ':
  109. target.append("%20", 3);
  110. break;
  111. case '!':
  112. target.append("%21", 3);
  113. break;
  114. case '#':
  115. target.append("%23", 3);
  116. break;
  117. case '$':
  118. target.append("%24", 3);
  119. break;
  120. case '%':
  121. target.append("%25", 3);
  122. break;
  123. case '&':
  124. target.append("%26", 3);
  125. break;
  126. case '\'':
  127. target.append("%27", 3);
  128. break;
  129. case '(':
  130. target.append("%28", 3);
  131. break;
  132. case ')':
  133. target.append("%29", 3);
  134. break;
  135. case '*':
  136. target.append("%2A", 3);
  137. break;
  138. case '+':
  139. target.append("%2B", 3);
  140. break;
  141. case ',':
  142. target.append("%2C", 3);
  143. break;
  144. case '/':
  145. target.append("%2F", 3);
  146. break;
  147. case ':':
  148. target.append("%3A", 3);
  149. break;
  150. case ';':
  151. target.append("%3B", 3);
  152. break;
  153. case '=':
  154. target.append("%3D", 3);
  155. break;
  156. case '?':
  157. target.append("%3F", 3);
  158. break;
  159. case '@':
  160. target.append("%40", 3);
  161. break;
  162. case '[':
  163. target.append("%5B", 3);
  164. break;
  165. case ']':
  166. target.append("%5D", 3);
  167. break;
  168. default:
  169. target.push_back(*value);
  170. break;
  171. }
  172. ++value;
  173. }
  174. return target;
  175. }
  176. } // namespace AWSCore