C解压缩Gzipped http响应 [英] C Decompress Gzipped http response

查看:195
本文介绍了C解压缩Gzipped http响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在解压缩gzip压缩响应方面遇到了一些问题,我将数据部分与标题分开,但其gzip标题和消息包含\ 0字符,因为复制gzip压缩数据存在问题。



我使用了libcurl,但它比C套接字慢。



这里有一部分样本回复:



I have few issues in decompressing gzipped http response, I separated data part from headers but its gzip header and message contain \0 characters due to which there is problem in copying gzipped data.

I've used libcurl but it is relatively slower than C sockets.

Here is some part of a sample response:

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/html; charset=utf-8
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 12605
Date: Mon, 05 Mar 2012 11:46:30 GMT
Connection: keep-alive
Set-Cookie: _FP=EM=1; expires=Wed, 05-Mar-2014 11:46:29 GMT; domain=.bing.com; path=/

---BINARY DATA---



示例代码:




Sample code:

#define MAXDATASIZE 1024

char *recvData; // Holds entire gzip data
char recvBuff[MAXDATASIZE]; // Holds gzip chunk
int offset=0;
while(1){
    recvBytes = recv(sockfd, &recvBuff, MAXDATASIZE-1, 0);
    totalRecvBytes += recvBytes;

    // cl = content length, used regex here to extract it
		if(!clfnd){
			cl = atoi(clarr);
			clfnd=1;
			recvData = malloc(cl * sizeof(char));
			memset(recvData, 0, sizeof recvData);
		}

    // get data part from 1st iteration, furthur iterations contain only data
    if(!datasplit){
        int strtidx;
        char *datastrt = strstr(&recvBuff, "\r\n\r\n");
        if(datastrt != NULL){
            strtidx = datastrt - recvBuff + 4;
            // Following memcpy() is problematic due to second parameter i guess
            memcpy(recvData, recvBuff + strtidx, recvBytes-strtidx);
            datasplit=1;
            offset = recvBytes-strtidx;
        }
    }
    else{
        memcpy(recvData + offset, recvBuff, recvBytes);
        offset += recvBytes;
    }
    // program uses blocking socket so after reading last 420 bytes it exits the loop
    if (recvBytes<MAXDATASIZE-1)
        break;
}

char *outData = malloc(offset*4 * sizeof(char));
memset(outData, 0, sizeof outData);
int ret = inf(recvData, offset, outData, offset*4);





充气函数:





Inflate function:

int inf(const char *src, int srcLen, const char *dst, int dstLen){
z_stream strm;
strm.zalloc=NULL;
strm.zfree=NULL;
strm.opaque=NULL;

strm.avail_in = srcLen;
strm.avail_out = dstLen;
strm.next_in = (Bytef *)src;
strm.next_out = (Bytef *)dst;

int err=-1, ret=-1;
err = inflateInit2(&strm, MAX_WBITS+16);
if (err == Z_OK){
    err = inflate(&strm, Z_FINISH);
    if (err == Z_STREAM_END){
        ret = strm.total_out;
    }
    else{
        inflateEnd(&strm);
        return err;
    }
}
else{
    inflateEnd(&strm);
    return err;
}
inflateEnd(&strm);
printf("%s\n", dst);
return err;
}

推荐答案

问题解决了! memcpy()正在复制\0字符,但是eclipse调试器没有显示整个gzip块并且正在打破\0。更新了上面的代码。
Problem solved ! memcpy() was copying \0 chars but eclipse debugger was not showing entire gzip chunk and was breaking at \0. Updated the above code.


这篇关于C解压缩Gzipped http响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆