in src/dxapi/native/tickdb/http/tickdb_http.cpp [1026:1094]
bool HTTP::readResponseBody(string& responseBody, DataReaderInternal& reader, intptr contentLength)
{
responseBody.clear();
if (contentLength > 0) {
// Normal encoding
responseBody.resize(contentLength);
for (intptr i = 0; i < contentLength; ++i) {
responseBody[i] = reader.getByte();
}
return true;
}
if (0 == contentLength) {
try {
while (1) responseBody.push_back(reader.getByte());
}
catch (IOStreamDisconnectException &) {
return true;
}
}
else {
// Chunked encoding Read chunked stream into string
intptr chunkSize;
string sizeText;
while (1) {
sizeText.clear();
while (1) {
byte ch = reader.getByte();
if (!((ch - '0') < 10U || (ch - 'a') < 6U || (ch - 'A') < 6U)) {
if (';' == ch) {
// Try to skip chunk extension
while ('\r' != reader.getByte())
{}
} else
if (ch != '\r') {
// Chunk length is terminated incorrectly
DBGLOG("chuck length is terminated incorrectly");
return false;
}
break;
}
sizeText.push_back(ch);
}
if (sizeText.size() < 1) {
// At least one digit required!
DBGLOG("At least one digit required!");
return false;
}
chunkSize = strtoul(sizeText.c_str(), NULL, 0x10);
if (0 == chunkSize)
break;
reader.skip(1); // Skip LF
intptr prevSize = responseBody.size();
responseBody.resize(prevSize + chunkSize);
for (intptr i = 0; i < chunkSize; ++i) {
responseBody[prevSize + i] = reader.getByte();
}
reader.skip(2); // Skip CRLF
}
return true;
}
}