6#include <aws/core/utils/HashingUtils.h>
7#include <aws/core/utils/Outcome.h>
8#include <aws/core/utils/crypto/Hash.h>
9#include <aws/crt/io/Stream.h>
17template <
size_t DataBufferSize = AWS_DATA_BUFFER_SIZE>
21 : StdIOStreamInputStream{stream},
25 assert(m_stream !=
nullptr);
26 if (m_stream ==
nullptr) {
27 AWS_LOGSTREAM_ERROR(
"AwsChunkedStream",
"stream is null");
29 assert(request !=
nullptr);
30 if (request ==
nullptr) {
31 AWS_LOGSTREAM_ERROR(
"AwsChunkedStream",
"request is null");
36 assert(dst !=
nullptr);
40 if (m_stream->good()) {
43 size_t bytesRead =
static_cast<size_t>(m_stream->gcount());
44 writeChunk(bytesRead);
48 if ((m_stream->peek() == EOF || m_stream->eof()) && !m_stream->bad()) {
49 writeTrailerToUnderlyingStream();
54 if ((m_chunkingStream->peek() == EOF || m_chunkingStream->eof()) && !m_chunkingStream->bad()) {
59 m_chunkingStream->read(dst, amountToRead);
60 return static_cast<size_t>(m_chunkingStream->gcount());
64 bool ReadImpl(Crt::ByteBuf &dstBuffer)
noexcept override {
65 size_t amountToRead = dstBuffer.capacity - dstBuffer.len;
66 const auto bytesRead =
BufferedRead(
reinterpret_cast<char *
>(dstBuffer.buffer), amountToRead);
67 dstBuffer.len += bytesRead;;
72 void writeTrailerToUnderlyingStream() {
74 chunkedTrailerStream <<
"0\r\n";
76 chunkedTrailerStream <<
"x-amz-checksum-" << m_request->
GetRequestHash().first <<
":"
79 chunkedTrailerStream <<
"\r\n";
80 const auto chunkedTrailer = chunkedTrailerStream.str();
81 if (m_chunkingStream->eof()) {
82 m_chunkingStream->clear();
84 *m_chunkingStream << chunkedTrailer;
87 void writeChunk(
size_t bytesRead) {
92 if (bytesRead > 0 && m_chunkingStream !=
nullptr && !m_chunkingStream->bad()) {
93 if (m_chunkingStream->eof()) {
94 m_chunkingStream->clear();
98 *m_chunkingStream <<
"\r\n";
103 std::shared_ptr<Aws::IOStream> m_chunkingStream;
104 Http::HttpRequest *m_request{
nullptr};
105 std::shared_ptr<Aws::IOStream> m_stream;
const std::pair< Aws::String, std::shared_ptr< Aws::Utils::Crypto::Hash > > & GetRequestHash() const
T * GetUnderlyingData() const
static Aws::String Base64Encode(const ByteBuffer &byteBuffer)
AwsChunkedStream(Http::HttpRequest *request, const std::shared_ptr< Aws::IOStream > &stream)
bool ReadImpl(Crt::ByteBuf &dstBuffer) noexcept override
size_t BufferedRead(char *dst, size_t amountToRead)
static Aws::String ToHexString(T value)
static const size_t AWS_DATA_BUFFER_SIZE
std::shared_ptr< T > MakeShared(const char *allocationTag, ArgTypes &&... args)
std::basic_stringstream< char, std::char_traits< char >, Aws::Allocator< char > > StringStream