void ClientSideResponse::_ReadChunkedBody(XRef<XStreamIO> socket) { char lineBuf[MAX_HEADER_LINE+1]; bool moreChunks = true; while(moreChunks) { memset(lineBuf, 0, MAX_HEADER_LINE+1); _ReadHeaderLine(socket, lineBuf, false); if(lineBuf[0] == '0') { _ConsumeFooter(socket); return; } if(_EmbedNull(lineBuf)) { const XString chunkLenS = lineBuf; const uint32_t chunkLen = chunkLenS.ToUInt(16); // We read our chunk into a temporary "chunk" XMemory object, we then optionally // call our "chunk callback" function... Finally, we copy the new chunk into the // main body contents object. _chunk->Clear(); if(!_ReceiveData(socket, &_chunk->Extend(chunkLen), chunkLen)) X_STHROW(WebbyException, ("Failed to read data from socket->")); // call callback here... if(_ch) moreChunks = _ch(_chunkHandlerContext, _chunk, *this); // We only append a chunk to our "_bodyContents" if we are not streaming ( // because "streams" potentially have no end, so an XMemory that contains the // complete body contents would just grow forever). if(!_streaming) memcpy(&(_bodyContents->Extend(chunkLen)), _chunk->Map(), chunkLen); _ReadEndOfLine(socket); } } }