@@ -14,7 +14,9 @@ namespace Http {
1414class AwsChunkedIOStream : public Aws ::IOStream {
1515public:
1616 AwsChunkedIOStream (const std::shared_ptr<Aws::IOStream>& originalBody, Aws::Http::HttpRequest* request)
17- : Aws::IOStream(&m_streambuf), m_chunkStream(request, originalBody) {}
17+ : Aws::IOStream(nullptr ), m_chunkStream(request, originalBody), m_streambuf(m_chunkStream) {
18+ rdbuf (&m_streambuf);
19+ }
1820
1921private:
2022 class ChunkedStreamBuf : public std ::streambuf {
@@ -42,7 +44,7 @@ class AwsChunkedIOStream : public Aws::IOStream {
4244 };
4345
4446 Aws::Utils::Stream::AwsChunkedStream<> m_chunkStream;
45- ChunkedStreamBuf m_streambuf{m_chunkStream} ;
47+ ChunkedStreamBuf m_streambuf;
4648};
4749
4850ChunkingInterceptor::ModifyRequestOutcome ChunkingInterceptor::ModifyBeforeSigning (
@@ -62,7 +64,14 @@ ChunkingInterceptor::ModifyRequestOutcome ChunkingInterceptor::ModifyBeforeSigni
6264
6365 request->AddContentBody (chunkedBody);
6466
65- smithy::client::Utils::AppendHeaderValueToRequest (request, CONTENT_ENCODING_HEADER, AWS_CHUNKED_VALUE);
67+ // Only remove Content-Length if it wasn't explicitly set
68+ // If Content-Length exists, keep it and don't use Transfer-Encoding: chunked
69+ if (!request->HasHeader (Aws::Http::CONTENT_LENGTH_HEADER)) {
70+ request->SetHeaderValue (" Transfer-Encoding" , " chunked" );
71+ }
72+
73+ // Always set aws-chunked content encoding for checksum validation
74+ smithy::client::Utils::AppendHeaderValueToRequest (request, Aws::Http::CONTENT_ENCODING_HEADER, Aws::Http::AWS_CHUNKED_VALUE);
6675
6776 return request;
6877}
@@ -76,6 +85,9 @@ bool ChunkingInterceptor::ShouldApplyAwsChunking(const std::shared_ptr<Aws::Http
7685 if (!request || !request->GetContentBody ()) {
7786 return false ;
7887 }
88+
89+ // Apply aws-chunked encoding for all requests with checksums
90+ // This replaces the aws-chunked logic removed from HTTP clients
7991 const auto & hashPair = request->GetRequestHash ();
8092 return hashPair.second != nullptr ;
8193}
0 commit comments