Skip to content

Commit 722aacc

Browse files
committed
revert changes
1 parent 5544f25 commit 722aacc

File tree

3 files changed

+138
-14
lines changed

3 files changed

+138
-14
lines changed

src/aws-cpp-sdk-core/source/http/windows/WinHttpSyncHttpClient.cpp

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -627,19 +627,52 @@ void WinHttpSyncHttpClient::DoAddHeaders(void* hHttpRequest, Aws::String& header
627627

628628
uint64_t WinHttpSyncHttpClient::DoWriteData(void* hHttpRequest, char* streamBuffer, uint64_t bytesRead, bool isChunked) const
629629
{
630-
AWS_UNREFERENCED_PARAM(isChunked);
631630
DWORD bytesWritten = 0;
632-
if (!AzCallWinHttp("WinHttpWriteData", WinHttpWriteData, hHttpRequest, streamBuffer, (DWORD)bytesRead, &bytesWritten))
631+
uint64_t totalBytesWritten = 0;
632+
const char CRLF[] = "\r\n";
633+
634+
if (isChunked)
633635
{
634-
return 0;
636+
Aws::String chunkSizeHexString = StringUtils::ToHexString(bytesRead) + CRLF;
637+
638+
if (!AzCallWinHttp("WinHttpWriteData", WinHttpWriteData, hHttpRequest, chunkSizeHexString.c_str(), (DWORD)chunkSizeHexString.size(), &bytesWritten))
639+
{
640+
return totalBytesWritten;
641+
}
642+
totalBytesWritten += bytesWritten;
643+
if (!AzCallWinHttp("WinHttpWriteData", WinHttpWriteData, hHttpRequest, streamBuffer, (DWORD)bytesRead, &bytesWritten))
644+
{
645+
return totalBytesWritten;
646+
}
647+
totalBytesWritten += bytesWritten;
648+
if (!AzCallWinHttp("WinHttpWriteData", WinHttpWriteData, hHttpRequest, CRLF, (DWORD)(sizeof(CRLF) - 1), &bytesWritten))
649+
{
650+
return totalBytesWritten;
651+
}
652+
totalBytesWritten += bytesWritten;
635653
}
636-
return bytesWritten;
654+
else
655+
{
656+
if (!AzCallWinHttp("WinHttpWriteData", WinHttpWriteData, hHttpRequest, streamBuffer, (DWORD)bytesRead, &bytesWritten))
657+
{
658+
return totalBytesWritten;
659+
}
660+
totalBytesWritten += bytesWritten;
661+
}
662+
663+
return totalBytesWritten;
637664
}
638665

639666
uint64_t WinHttpSyncHttpClient::FinalizeWriteData(void* hHttpRequest) const
640667
{
641-
AWS_UNREFERENCED_PARAM(hHttpRequest);
642-
return 0;
668+
DWORD bytesWritten = 0;
669+
const char trailingCRLF[] = "0\r\n\r\n";
670+
if (!AzCallWinHttp("WinHttpWriteData", WinHttpWriteData, hHttpRequest, trailingCRLF, (DWORD)(sizeof(trailingCRLF) - 1), &bytesWritten))
671+
{
672+
return 0;
673+
}
674+
675+
return bytesWritten;
643676
}
644677

645678
bool WinHttpSyncHttpClient::DoReceiveResponse(void* httpRequest) const

src/aws-cpp-sdk-core/source/http/windows/WinINetSyncHttpClient.cpp

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,19 +161,52 @@ void WinINetSyncHttpClient::DoAddHeaders(void* hHttpRequest, Aws::String& header
161161

162162
uint64_t WinINetSyncHttpClient::DoWriteData(void* hHttpRequest, char* streamBuffer, uint64_t bytesRead, bool isChunked) const
163163
{
164-
AWS_UNREFERENCED_PARAM(isChunked);
165164
DWORD bytesWritten = 0;
166-
if (!InternetWriteFile(hHttpRequest, streamBuffer, (DWORD)bytesRead, &bytesWritten))
165+
uint64_t totalBytesWritten = 0;
166+
const char CRLF[] = "\r\n";
167+
168+
if (isChunked)
167169
{
168-
return 0;
170+
Aws::String chunkSizeHexString = StringUtils::ToHexString(bytesRead) + CRLF;
171+
172+
if (!InternetWriteFile(hHttpRequest, chunkSizeHexString.c_str(), (DWORD)chunkSizeHexString.size(), &bytesWritten))
173+
{
174+
return totalBytesWritten;
175+
}
176+
totalBytesWritten += bytesWritten;
177+
if (!InternetWriteFile(hHttpRequest, streamBuffer, (DWORD)bytesRead, &bytesWritten))
178+
{
179+
return totalBytesWritten;
180+
}
181+
totalBytesWritten += bytesWritten;
182+
if (!InternetWriteFile(hHttpRequest, CRLF, (DWORD)(sizeof(CRLF) - 1), &bytesWritten))
183+
{
184+
return totalBytesWritten;
185+
}
186+
totalBytesWritten += bytesWritten;
169187
}
170-
return bytesWritten;
188+
else
189+
{
190+
if (!InternetWriteFile(hHttpRequest, streamBuffer, (DWORD)bytesRead, &bytesWritten))
191+
{
192+
return totalBytesWritten;
193+
}
194+
totalBytesWritten += bytesWritten;
195+
}
196+
197+
return totalBytesWritten;
171198
}
172199

173200
uint64_t WinINetSyncHttpClient::FinalizeWriteData(void* hHttpRequest) const
174201
{
175-
AWS_UNREFERENCED_PARAM(hHttpRequest);
176-
return 0;
202+
DWORD bytesWritten = 0;
203+
const char trailingCRLF[] = "0\r\n\r\n";
204+
if (!InternetWriteFile(hHttpRequest, trailingCRLF, (DWORD)(sizeof(trailingCRLF) - 1), &bytesWritten))
205+
{
206+
return 0;
207+
}
208+
209+
return bytesWritten;
177210
}
178211

179212
bool WinINetSyncHttpClient::DoReceiveResponse(void* hHttpRequest) const

src/aws-cpp-sdk-core/source/http/windows/WinSyncHttpClient.cpp

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <aws/core/http/HttpRequest.h>
88
#include <aws/core/http/standard/StandardHttpResponse.h>
99
#include <aws/core/utils/StringUtils.h>
10+
#include <aws/core/utils/HashingUtils.h>
1011
#include <aws/core/utils/logging/LogMacros.h>
1112
#include <aws/core/utils/stream/StreamBufProtectedWriter.h>
1213
#include <aws/core/client/ClientConfiguration.h>
@@ -98,14 +99,22 @@ void WinSyncHttpClient::AddHeadersToRequest(const std::shared_ptr<HttpRequest>&
9899
bool WinSyncHttpClient::StreamPayloadToRequest(const std::shared_ptr<HttpRequest>& request, void* hHttpRequest, Aws::Utils::RateLimits::RateLimiterInterface* writeLimiter) const
99100
{
100101
bool success = true;
102+
bool isChunked = request->HasTransferEncoding() && request->GetTransferEncoding() == Aws::Http::CHUNKED_VALUE;
103+
bool isAwsChunked = request->HasHeader(Aws::Http::CONTENT_ENCODING_HEADER) &&
104+
request->GetHeaderValue(Aws::Http::CONTENT_ENCODING_HEADER).find(Aws::Http::AWS_CHUNKED_VALUE) != Aws::String::npos;
101105
auto payloadStream = request->GetContentBody();
106+
const char CRLF[] = "\r\n";
102107
if(payloadStream)
103108
{
104109
uint64_t bytesWritten;
105110
uint64_t bytesToRead = HTTP_REQUEST_WRITE_BUFFER_LENGTH;
106111
auto startingPos = payloadStream->tellg();
107112
bool done = false;
108-
char streamBuffer[HTTP_REQUEST_WRITE_BUFFER_LENGTH];
113+
// aws-chunk = hex(chunk-size) + CRLF + chunk-data + CRLF
114+
// Length of hex(HTTP_REQUEST_WRITE_BUFFER_LENGTH) is 4;
115+
// Length of each CRLF is 2.
116+
// Reserve 8 bytes in total, should the request be aws-chunked.
117+
char streamBuffer[ HTTP_REQUEST_WRITE_BUFFER_LENGTH + 8 ];
109118
while(success && !done)
110119
{
111120
payloadStream->read(streamBuffer, bytesToRead);
@@ -115,7 +124,22 @@ bool WinSyncHttpClient::StreamPayloadToRequest(const std::shared_ptr<HttpRequest
115124
bytesWritten = 0;
116125
if (bytesRead > 0)
117126
{
118-
bytesWritten = DoWriteData(hHttpRequest, streamBuffer, bytesRead, false);
127+
if (isAwsChunked)
128+
{
129+
if (request->GetRequestHash().second != nullptr)
130+
{
131+
request->GetRequestHash().second->Update(reinterpret_cast<unsigned char*>(streamBuffer), static_cast<size_t>(bytesRead));
132+
}
133+
134+
Aws::String hex = Aws::Utils::StringUtils::ToHexString(static_cast<uint64_t>(bytesRead));
135+
memcpy(streamBuffer + hex.size() + 2, streamBuffer, static_cast<size_t>(bytesRead));
136+
memcpy(streamBuffer + hex.size() + 2 + bytesRead, CRLF, 2);
137+
memcpy(streamBuffer, hex.c_str(), hex.size());
138+
memcpy(streamBuffer + hex.size(), CRLF, 2);
139+
bytesRead += hex.size() + 4;
140+
}
141+
142+
bytesWritten = DoWriteData(hHttpRequest, streamBuffer, bytesRead, isChunked);
119143
if (!bytesWritten)
120144
{
121145
success = false;
@@ -140,6 +164,40 @@ bool WinSyncHttpClient::StreamPayloadToRequest(const std::shared_ptr<HttpRequest
140164
success = success && ContinueRequest(*request) && IsRequestProcessingEnabled();
141165
}
142166

167+
if (success && isAwsChunked)
168+
{
169+
Aws::StringStream chunkedTrailer;
170+
chunkedTrailer << "0" << CRLF;
171+
if (request->GetRequestHash().second != nullptr)
172+
{
173+
chunkedTrailer << "x-amz-checksum-" << request->GetRequestHash().first << ":"
174+
<< Aws::Utils::HashingUtils::Base64Encode(request->GetRequestHash().second->GetHash().GetResult()) << CRLF;
175+
}
176+
chunkedTrailer << CRLF;
177+
bytesWritten = DoWriteData(hHttpRequest, const_cast<char*>(chunkedTrailer.str().c_str()), chunkedTrailer.str().size(), isChunked);
178+
if (!bytesWritten)
179+
{
180+
success = false;
181+
}
182+
else if(writeLimiter)
183+
{
184+
writeLimiter->ApplyAndPayForCost(bytesWritten);
185+
}
186+
}
187+
188+
if (success && isChunked)
189+
{
190+
bytesWritten = FinalizeWriteData(hHttpRequest);
191+
if (!bytesWritten)
192+
{
193+
success = false;
194+
}
195+
else if (writeLimiter)
196+
{
197+
writeLimiter->ApplyAndPayForCost(bytesWritten);
198+
}
199+
}
200+
143201
payloadStream->clear();
144202
payloadStream->seekg(startingPos, payloadStream->beg);
145203
}

0 commit comments

Comments
 (0)