bool parseHttpResponse(CBuffer& buffer,bool& haserr) { assert(!buffer.empty()); if(buffer.empty()) return false; haserr = false; if(!bHeaderParsed) bHeaderParsed = ParseResponseHeader(buffer,bGZip,bChunked,nContentLen,nError); if(!bHeaderParsed) return false; if(200 != nError) return true; bool isEnd = false; if(!bChunked) { assert(nContentLen > 0); isEnd = ((int)buffer.cnt() >= nContentLen); } else { static char endChunked[] = "\r\n0\r\n\r\n"; static size_t endChunkedLen = strlen(endChunked); if(buffer.cnt() >= strlen(endChunked)) isEnd = (0 == memcmp(endChunked,(char*)buffer[buffer.rpos() + buffer.cnt() - strlen(endChunked)],strlen(endChunked))); } if(isEnd) { if(!bChunked) { if(bGZip) { // char* p_buf = NULL; // char* p_inbuf = (char*)(buffer[buffer.rpos()]); // int nResult = ungzip(p_inbuf, buffer.cnt(), &p_buf, 1); // assert(Z_OK == nResult); // if(Z_OK == nResult) // { // //gzip有10个字节的头部和8个字节的尾部 // // std::string sBuf(p_buf); // sBuf.erase(sBuf.rfind('}') + 1); // buffer.clear(); // //_pBuffer->Write((uint8*)p_buf,strlen(p_buf)-18); // buffer<<sBuf; // free(p_buf); // } CBuffer outBuffer; if(0 == ungzip2((char*)(buffer[buffer.rpos()]),buffer.cnt(),1,outBuffer)) { outBuffer.swap(buffer); } else { assert(false); } } } else { CBuffer thebuffer; while(!buffer.empty()) { const char* pStart = (const char*)buffer[buffer.rpos()]; char* pEnd = NULL; int datasize = strtol(pStart,&pEnd,16); if(0 == datasize && pEnd == pStart) { haserr = true; break; } if(0 > datasize) { haserr = true; break; } if(datasize > (int)buffer.cnt() -2) { haserr = true; break; } buffer.rpos(buffer.rpos() + (pEnd - pStart) + 2); if(datasize > 0) thebuffer.Write(buffer[buffer.rpos()],datasize); buffer.rpos(buffer.rpos() + datasize + 2); if(0 >= datasize) break; } assert(!haserr); buffer.swap(thebuffer); } } return isEnd; }