HttpRequest.cpp 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /**
  2. * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
  3. * SPDX-License-Identifier: Apache-2.0.
  4. */
  5. #include <aws/core/http/HttpRequest.h>
  6. #include <aws/core/utils/memory/stl/AWSStringStream.h>
  7. #include <aws/http/request_response.h>
  8. #include <aws/crt/Types.h>
  9. #include <aws/crt/http/HttpRequestResponse.h>
  10. namespace Aws
  11. {
  12. namespace Http
  13. {
  14. const char DATE_HEADER[] = "date";
  15. const char AWS_DATE_HEADER[] = "X-Amz-Date";
  16. const char AWS_SECURITY_TOKEN[] = "X-Amz-Security-Token";
  17. const char ACCEPT_HEADER[] = "accept";
  18. const char ACCEPT_CHAR_SET_HEADER[] = "accept-charset";
  19. const char ACCEPT_ENCODING_HEADER[] = "accept-encoding";
  20. const char AUTHORIZATION_HEADER[] = "authorization";
  21. const char AWS_AUTHORIZATION_HEADER[] = "authorization";
  22. const char COOKIE_HEADER[] = "cookie";
  23. const char DECODED_CONTENT_LENGTH_HEADER[] = "x-amz-decoded-content-length";
  24. const char CONTENT_LENGTH_HEADER[] = "content-length";
  25. const char CONTENT_TYPE_HEADER[] = "content-type";
  26. const char CONTENT_ENCODING_HEADER[] = "content-encoding";
  27. const char TRANSFER_ENCODING_HEADER[] = "transfer-encoding";
  28. const char USER_AGENT_HEADER[] = "user-agent";
  29. const char VIA_HEADER[] = "via";
  30. const char HOST_HEADER[] = "host";
  31. const char AMZ_TARGET_HEADER[] = "x-amz-target";
  32. const char X_AMZ_EXPIRES_HEADER[] = "X-Amz-Expires";
  33. const char CONTENT_MD5_HEADER[] = "content-md5";
  34. const char API_VERSION_HEADER[] = "x-amz-api-version";
  35. const char AWS_TRAILER_HEADER[] = "x-amz-trailer";
  36. const char SDK_INVOCATION_ID_HEADER[] = "amz-sdk-invocation-id";
  37. const char SDK_REQUEST_HEADER[] = "amz-sdk-request";
  38. const char CHUNKED_VALUE[] = "chunked";
  39. const char AWS_CHUNKED_VALUE[] = "aws-chunked";
  40. const char X_AMZN_TRACE_ID_HEADER[] = "X-Amzn-Trace-Id";
  41. const char ALLOCATION_TAG[] = "HttpRequestConversion";
  42. const char X_AMZN_ERROR_TYPE[] = "x-amzn-errortype";
  43. std::shared_ptr<Aws::Crt::Http::HttpRequest> HttpRequest::ToCrtHttpRequest()
  44. {
  45. auto request = Aws::MakeShared<Aws::Crt::Http::HttpRequest>(ALLOCATION_TAG);
  46. request->SetBody([&]() -> std::shared_ptr<IOStream> {
  47. const std::shared_ptr<Aws::IOStream>& body = GetContentBody();
  48. if (body) {
  49. return body;
  50. }
  51. // Return an empty string stream for no body
  52. return Aws::MakeShared<Aws::StringStream>(ALLOCATION_TAG, "");
  53. }());
  54. auto headers = GetHeaders();
  55. for (const auto& it: headers)
  56. {
  57. Aws::Crt::Http::HttpHeader header;
  58. header.name = Aws::Crt::ByteCursorFromCString(it.first.c_str());
  59. header.value = Aws::Crt::ByteCursorFromCString(it.second.c_str());
  60. request->AddHeader(header);
  61. }
  62. // Need a different URL encoding here.
  63. // CRT sigv4 don't any encoding if double encoding is off, need to encode the path before passing to CRT.
  64. const URI& uri = m_uri;
  65. Aws::StringStream ss;
  66. Aws::StringStream port;
  67. if (uri.GetScheme() == Scheme::HTTP && uri.GetPort() != HTTP_DEFAULT_PORT)
  68. {
  69. port << ":" << uri.GetPort();
  70. }
  71. else if (uri.GetScheme() == Scheme::HTTPS && uri.GetPort() != HTTPS_DEFAULT_PORT)
  72. {
  73. port << ":" << uri.GetPort();
  74. }
  75. ss << SchemeMapper::ToString(uri.GetScheme()) << SEPARATOR << uri.GetAuthority() << port.str()
  76. << ((uri.GetPath() == "/") ? "" : URI::URLEncodePath(uri.GetPath()))
  77. << uri.GetQueryString();
  78. request->SetPath(Aws::Crt::ByteCursorFromCString(ss.str().c_str()));
  79. const char *method = HttpMethodMapper::GetNameForHttpMethod(m_method);
  80. request->SetMethod(Aws::Crt::ByteCursorFromCString(method));
  81. return request;
  82. }
  83. } // Http
  84. } // Aws