Skip to content

Commit 5c3b3c5

Browse files
committed
refactor out chunk framing
1 parent 6bedf17 commit 5c3b3c5

File tree

6 files changed

+43
-55
lines changed

6 files changed

+43
-55
lines changed

src/aws-cpp-sdk-core/include/aws/core/http/windows/WinHttpSyncHttpClient.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ namespace Aws
5151
bool DoReceiveResponse(void* httpRequest) const override;
5252
bool DoQueryHeaders(void* httpRequest, std::shared_ptr<Aws::Http::HttpResponse>& response, Aws::StringStream& ss, uint64_t& read) const override;
5353
bool DoSendRequest(void* httpRequest) const override;
54-
bool DoSendRequest(void* httpRequest, const std::shared_ptr<HttpRequest>& request) const;
5554
bool DoQueryDataAvailable(void* hHttpRequest, uint64_t& available) const override;
5655
bool DoReadData(void* hHttpRequest, char* body, uint64_t size, uint64_t& read) const override;
5756
void* GetClientModule() const override;

src/aws-cpp-sdk-core/include/aws/core/http/windows/WinINetSyncHttpClient.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ namespace Aws
4949
bool DoReceiveResponse(void* hHttpRequest) const override;
5050
bool DoQueryHeaders(void* hHttpRequest, std::shared_ptr<Aws::Http::HttpResponse>& response, Aws::StringStream& ss, uint64_t& read) const override;
5151
bool DoSendRequest(void* hHttpRequest) const override;
52-
bool DoSendRequest(void* hHttpRequest, const std::shared_ptr<HttpRequest>& request) const override;
5352
bool DoQueryDataAvailable(void* hHttpRequest, uint64_t& available) const override;
5453
bool DoReadData(void* hHttpRequest, char* body, uint64_t size, uint64_t& read) const override;
5554
void* GetClientModule() const override;

src/aws-cpp-sdk-core/include/aws/core/http/windows/WinSyncHttpClient.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#include <aws/core/auth/AWSAuthSigner.h>
1212
#include <aws/core/http/HttpClient.h>
1313
#include <aws/core/http/standard/StandardHttpResponse.h>
14-
#include <aws/core/utils/UnreferencedParam.h>
1514

1615
namespace Aws
1716
{
@@ -93,10 +92,6 @@ namespace Aws
9392
virtual bool DoReceiveResponse(void* hHttpRequest) const = 0;
9493
virtual bool DoQueryHeaders(void* hHttpRequest, std::shared_ptr<Aws::Http::HttpResponse>& response, Aws::StringStream& ss, uint64_t& read) const = 0;
9594
virtual bool DoSendRequest(void* hHttpRequest) const = 0;
96-
virtual bool DoSendRequest(void* hHttpRequest, const std::shared_ptr<HttpRequest>& request) const {
97-
AWS_UNREFERENCED_PARAM(request);
98-
return DoSendRequest(hHttpRequest);
99-
}
10095
virtual bool DoQueryDataAvailable(void* hHttpRequest, uint64_t& available) const = 0;
10196
virtual bool DoReadData(void* hHttpRequest, char* body, uint64_t size, uint64_t& read) const = 0;
10297
virtual void* GetClientModule() const = 0;

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

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -735,25 +735,6 @@ bool WinHttpSyncHttpClient::DoSendRequest(void* hHttpRequest) const
735735
return success;
736736
}
737737

738-
bool WinHttpSyncHttpClient::DoSendRequest(void* hHttpRequest, const std::shared_ptr<HttpRequest>& request) const
739-
{
740-
// Check if this is a Transfer-Encoding: chunked request
741-
if (request->HasTransferEncoding() && request->GetTransferEncoding().find("chunked") != Aws::String::npos) {
742-
// For chunked requests, use WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH
743-
bool success = WinHttpSendRequest(hHttpRequest, NULL, 0, NULL, 0, 0xFFFFFFFF, 0) != 0;
744-
if (!success)
745-
{
746-
DWORD lastError = GetLastError();
747-
AWS_LOGSTREAM_ERROR(GetLogTag(), "WinHttpSendRequest failed for chunked request. Error: " << lastError << " (0x" << std::hex << lastError << std::dec << ")");
748-
AzWinHttpLogLastError("WinHttpSendRequest");
749-
}
750-
return success;
751-
} else {
752-
// For regular requests, use the original method
753-
return DoSendRequest(hHttpRequest);
754-
}
755-
}
756-
757738
bool WinHttpSyncHttpClient::DoQueryDataAvailable(void* hHttpRequest, uint64_t& available) const
758739
{
759740
return (WinHttpQueryDataAvailable(hHttpRequest, (LPDWORD)&available) != 0);

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

Lines changed: 39 additions & 21 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
@@ -216,21 +249,6 @@ bool WinINetSyncHttpClient::DoSendRequest(void* hHttpRequest) const
216249
return (HttpSendRequestEx(hHttpRequest, NULL, NULL, 0, 0) != 0);
217250
}
218251

219-
bool WinINetSyncHttpClient::DoSendRequest(void* hHttpRequest, const std::shared_ptr<HttpRequest>& request) const
220-
{
221-
// Check if this is a Transfer-Encoding: chunked request
222-
if (request->HasTransferEncoding() && request->GetTransferEncoding().find("chunked") != Aws::String::npos) {
223-
// For chunked encoding, use HttpSendRequestEx with unknown total length
224-
INTERNET_BUFFERSA buffers = {0};
225-
buffers.dwStructSize = sizeof(INTERNET_BUFFERSA);
226-
buffers.dwBufferTotal = 0; // Unknown total length for chunked
227-
return (HttpSendRequestExA(hHttpRequest, &buffers, NULL, 0, 0) != 0);
228-
} else {
229-
// For regular requests, use the simple HttpSendRequestEx
230-
return (HttpSendRequestExA(hHttpRequest, NULL, NULL, 0, 0) != 0);
231-
}
232-
}
233-
234252
bool WinINetSyncHttpClient::DoQueryDataAvailable(void* hHttpRequest, uint64_t& available) const
235253
{
236254
return (InternetQueryDataAvailable(hHttpRequest, (LPDWORD)&available, /*reserved*/ 0, /*reserved*/ 0) != 0);

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,10 @@ void WinSyncHttpClient::AddHeadersToRequest(const std::shared_ptr<HttpRequest>&
9898
bool WinSyncHttpClient::StreamPayloadToRequest(const std::shared_ptr<HttpRequest>& request, void* hHttpRequest, Aws::Utils::RateLimits::RateLimiterInterface* writeLimiter) const
9999
{
100100
bool success = true;
101+
bool isChunked = request->HasTransferEncoding() && request->GetTransferEncoding() == Aws::Http::CHUNKED_VALUE;
101102
auto payloadStream = request->GetContentBody();
102103
if(payloadStream)
103104
{
104-
// Check if this is AWS chunked encoding
105-
bool isChunked = request->HasHeader("content-encoding") &&
106-
request->GetHeaderValue("content-encoding").find("aws-chunked") != Aws::String::npos;
107-
108105
uint64_t bytesWritten;
109106
uint64_t bytesToRead = HTTP_REQUEST_WRITE_BUFFER_LENGTH;
110107
auto startingPos = payloadStream->tellg();
@@ -148,10 +145,9 @@ bool WinSyncHttpClient::StreamPayloadToRequest(const std::shared_ptr<HttpRequest
148145
payloadStream->seekg(startingPos, payloadStream->beg);
149146
}
150147

151-
// For chunked requests, finalize the transfer
152-
if (success && request->HasTransferEncoding() && request->GetTransferEncoding().find("chunked") != Aws::String::npos)
148+
if (success && isChunked)
153149
{
154-
FinalizeWriteData(hHttpRequest);
150+
FinalizeWriteData(hHttpRequest);
155151
}
156152

157153
if(success)
@@ -360,7 +356,7 @@ std::shared_ptr<HttpResponse> WinSyncHttpClient::MakeRequest(const std::shared_p
360356

361357
AddHeadersToRequest(request, hHttpRequest);
362358
OverrideOptionsOnRequestHandle(hHttpRequest);
363-
if (DoSendRequest(hHttpRequest, request) && StreamPayloadToRequest(request, hHttpRequest, writeLimiter))
359+
if (DoSendRequest(hHttpRequest) && StreamPayloadToRequest(request, hHttpRequest, writeLimiter))
364360
{
365361
success = BuildSuccessResponse(request, response, hHttpRequest, readLimiter);
366362
}

0 commit comments

Comments
 (0)