16,211
社区成员
发帖
与我相关
我的任务
分享
int RyPipeData::readChunk(int chunkSize,QByteArray* chunkData,QByteArray* unChunkDes){
int sourceSize = (*chunkData).size();
if(sourceSize < chunkSize){
(*unChunkDes).append(*chunkData);
(*chunkData).clear();
return sourceSize;
}else{
QByteArray ba = (*chunkData).left(chunkSize);
(*unChunkDes).append(chunkData->left(chunkSize));
(*chunkData).remove(0,chunkSize);
return chunkSize;
}
}
int RyPipeData::getChunkSize(QByteArray* chunkedData){
QByteArray theBody = *chunkedData;
//qDebug()<<"_lastChunkSizeByteArray:"<<_lastChunkSizeByteArray;
int chunkEndNewLineSize = 2; // if using \r\n
int beginOfLength = 0;
int endOfLength = 0;
if(theBody.startsWith("\r\n")){
beginOfLength = 2;
}else if(theBody.startsWith("\n")){
beginOfLength = 1;
}
if(!_lastChunkSizeByteArray.isEmpty()){
if(beginOfLength==0){
//the cach chunksize bytes was whole bytes
// do nothing here
}else{
endOfLength = theBody.indexOf("\r\n");
if(endOfLength==-1){
// not ending with \r\n
// try \n
endOfLength = theBody.indexOf("\n");
chunkEndNewLineSize = 1; // using \n
}
if(endOfLength == -1){
// newLine not found
// append bytes to _lastChunkSizeByteArray
// and return -1 to identify not found
/*
qDebug()<<"A invalid getChunkSize\n"
<<chunkedData->size()
<<"\n<===>\n"
<<theBody.replace("\r","\\r").replace("\n","\\n")
<<"\n<===>\n"
<<beginOfLength;
qDebug()<<"\n_lastChunkSizeByteArray="<<_lastChunkSizeByteArray;
*/
/*
meet this condition:
the data doesn't contains whole chunksize bytes
*/
_lastChunkSizeByteArray.append(theBody);
(*chunkedData).clear();
return -1;
}else{
// found new line
// update _lastChunkSizeByteArray and calculate and clear it
_lastChunkSizeByteArray.append(theBody.left(endOfLength));
}
}
}else{
// has no chunksizeByte cache
//theBody.mid(beginOfLength,endOfLength-beginOfLength).trimmed()
endOfLength = theBody.indexOf("\r\n",beginOfLength);
if(endOfLength==-1){
endOfLength = theBody.indexOf("\n",beginOfLength);
chunkEndNewLineSize = 1; // using \n
}
if(endOfLength == -1){
// newLine not found
// cache bytes to _lastChunkSizeByteArray
// and return -1 to identify not found
_lastChunkSizeByteArray.append(chunkedData->mid(beginOfLength));
/*
qDebug()<<"B invalid getChunkSize\n"
<<chunkedData->size()
<<"\n<===>\n"
<<theBody.replace("\r","\\r").replace("\n","\\n")
<<"\n<===>\n"
<<beginOfLength;
qDebug()<<"\n_lastChunkSizeByteArray="<<_lastChunkSizeByteArray;
*/
(*chunkedData).clear();
return -1;
}else{
_lastChunkSizeByteArray = (*chunkedData).mid(beginOfLength,endOfLength-beginOfLength).trimmed();
}
}
bool isChunkValid;
//qDebug()<<"chunkSize ba="<<theBody.mid(beginOfLength,endOfLength-beginOfLength).trimmed();
_lastChunkSizeByteArray = _lastChunkSizeByteArray.trimmed();
int chunkSize = _lastChunkSizeByteArray.toULongLong(&isChunkValid,16);
_lastChunkSizeByteArray.clear();
if(!isChunkValid){
qDebug()<<"CHUNKED PARSE ERROR:invalid getChunkSize\n"
<<theBody.replace("\r","\\r").replace("\n","\\n")
<<"\n"<<_lastChunkSizeByteArray;
return -1;
}
(*chunkedData).remove(0,endOfLength+chunkEndNewLineSize);
return chunkSize;
}