HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Mon, 28 May 2012 09:56:44 GMT
Connection: close
a
如何对这种数据解析解码?有高手知道吗。
------解决方案--------------------
我写的代理工具里刚好做了这个处理,代码见此处:https://github.com/AlloyTeam/Rythem/blob/master/proxy/rypipedata.cpp
工具介绍:http://www.alloyteam.com/2012/05/web-front-end-tool-rythem-1/
chunked格式为:
size\r\n
content
size\r\n
content\r\n
...
0\r\n
size为16进制字符
相关代码:
- C/C++ code
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;}