我如何发送gzip而不是通过跳过标题收缩

时间:2014-01-06 11:43:14

标签: c++ gzip zlib deflate

我写了一个c ++ http服务器(Microsoft http server api)

以gzip格式发送html页面文件

和gzip文件是静态的

例如文件page1.htm和page1.htm.gz在同一目录中

根据 http://en.wikipedia.org/wiki/Gzip

我知道gzip会因额外的标题而缩小 和deflate是gzip的一部分

我如何通过跳过标题发送gzip instade deflate

fileHandle=CreateFile( "page1.htm.gz"  ,dwAccess,dwShare,NULL,dwCreationFlags,dwAttributes,NULL);

....


ADD_KNOWN_HEADER(response, HttpHeaderContentEncoding, "deflate" );

HTTP_DATA_CHUNK dataChunk;
{     
   HTTP_DATA_CHUNK dataChunk;
   response.EntityChunkCount         = 1;                        
   dataChunk.DataChunkType           = HttpDataChunkFromFileHandle;
   dataChunk.FromFileHandle.FileHandle   =fileHandle;
   dataChunk.FromFileHandle.ByteRange.StartingOffset.QuadPart =9;// 9 is gzip header len
   dataChunk.FromFileHandle.ByteRange.Length.QuadPart = HTTP_BYTE_RANGE_TO_EOF;
   response.pEntityChunks=&dataChunk;
}     

 .....

1 个答案:

答案 0 :(得分:1)

deflate gzip 编码并不完全相同,尽管差异很小。

发送gzip时,请将代码更改为:

ADD_KNOWN_HEADER(response, HttpHeaderContentEncoding, "gzip" );

如果gzip列在Accept-Encoding中,你应该这样做。

以下是gzip常见问题解答的摘录:

  

“gzip”和“deflate”HTTP 1.1之间有什么区别   编码?

     

“gzip”是gzip格式,“deflate”是zlib格式。他们   应该调用第二个“zlib”来避免   与原始deflate压缩数据格式混淆。而HTTP   1.1 RFC 2616正确地指向RFC 1950中用于“deflate”传输编码的zlib规范,有报道称   不正确地生成或期望原始收缩的服务器和浏览器   RFC 1951中每个deflate specficiation的数据,最值得注意的是   微软。所以即使使用“deflate”传输编码   zlib格式将是更有效的方法(事实上,确切地说   zlib格式的用途是什么,使用“gzip”传输   由于不幸的选择,编码可能更可靠   HTTP 1.1作者的名称。“

     

http://www.gzip.org/zlib/zlib_faq.html#faq38