bool HTTP::readResponseBody()

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;
    }
}