首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

HTTP协议分析,求指导!chunked + gzip 如何解析?帮上小弟我呀

2012-09-23 
HTTP协议分析,求指导!!!chunked + gzip 怎么解析?!!帮下我呀兄弟们指导下我吧,我在分析HTTP协议,但是当收

HTTP协议分析,求指导!!!chunked + gzip 怎么解析?!!帮下我呀
兄弟们指导下我吧,我在分析HTTP协议,但是当收到传输编码为chunked,内容编码为gzip时,就没法解析数据包的内容,采用下面的代码解析时,采用GDB调试,发现数据并没有完全的传入子函数中,怎么办呀,愁死了

C/C++ code
/*pSrc: 原 chunked 数据包nSize: 数据包大小pDes: 解析完成后的数据*/int DecodeChunked(const char* pSrc,int nSize,  char** pDes){         int nRetSize = 0, nLeftSize = 0;        printf("total data length=%d;   /n",nSize);        *pDes = (unsigned char*)malloc(nSize);        if(pDes == NULL)                return -1;         char *pBegin = strstr(pSrc,"/r/n/r/n");//程序运行到这里pBegin为空,大家说怎么办        if (pBegin == NULL)                return -1;         pBegin += 4;        while(1)        {                int ChunkedSize = 0;                sscanf(pBegin,"%x",&ChunkedSize);                if( 0==ChunkedSize )                {                        puts("endof chunkeds");                        break;                }                pBegin = strstr(pBegin,"/r/n");                if (pBegin == NULL)                        return -1;                pBegin += 2; // /r/n                 nLeftSize = nSize - (pBegin - pSrc);                if (ChunkedSize > nLeftSize)                        ChunkedSize = nLeftSize;                memcpy(*pDes+nRetSize,pBegin,ChunkedSize);                nRetSize += ChunkedSize;                 if (ChunkedSize == nLeftSize) /* 数据包不全 */                        break;                pBegin += ChunkedSize;                if (strstr(pBegin,"/r/n") != NULL)                        pBegin += 2; // /r/n                else break;        }        return nRetSize;}


GDB调试情况:
Assembly code
Breakpoint 1, need_to_parse_chunked_data (data=0xbffddbbc "a\r\n\037\213\b", len=15, buf=0xbffbdbbc "") at http.c:281281             char strlength[10]={0}; (gdb) n283             char * temp = buf; (gdb) 284             int total =0,  length = 0, nBytes = 0; (gdb) 286             pTemp = strstr(pStart, "\r\n"); (gdb) n287             if( NULL == pTemp )(gdb) p data $1 = 0xbffddbbc "a\r\n\037\213\b" 这个数据包其实有1209个字节,但子函数里就只能看到这么一点点,我怀疑就是这里出问题了,但我又没有好的办法。gzip 文件中时包好多的0字符串,不知道有影响没(gdb)



[解决办法]
探讨

我会用呀,而且可以解压gzip类型的数据,就是chunked分多个包时传输时就会出问题,比如说:chunked类型的编码方式是这样的,长度\r\n体内容\r\n长度\r\n体内容\r\n0\r\n,当看到0时才知道数据传输结束,而这次传输的数据长度时各个长度相加,但会有这样的一个问题,当chunked传输类型的数据包,并不一定就是一个包发完数据,有时会分很多个包,这个结束符标志0就可能在别的包里……

热点排行
Bad Request.