【问题标题】:D std.zlib stream compression with httpD std.zlib 流压缩与 http
【发布时间】:2014-07-24 01:48:11
【问题描述】:

我正在尝试将 gzip 压缩添加到我在 D 中编写的 HTTP 服务器。这是执行 gzip 编码的代码。

if ((Info.modGzip) & (indexOf(client.getRequestHeaderFieldValue("Accept-Encoding"),"gzip") != -1)){
    writeln("gzip");
    auto gzip = new Compress(HeaderFormat.gzip);
    client.addToResponseHeader("Content-Encoding: gzip");
    client.sendHeader("200 ok");
    while (0 < (filestream.readBlock(readbuffer))){
        client.client.send(gzip.compress(readbuffer));
    }
    client.sendData(gzip.flush(Z_FINISH));
    delete gzip;
    } else {
        writeln("no gzip");
        client.sendHeader("200 ok");
        while (0 < (filestream.readBlock(readbuffer))){
        client.client.send(readbuffer);
    }
    delete filestream;
}

但是当我在 Firefox、Internet Explorer 和 chrome 上测试它时说编码或压缩不好。为什么?数据使用 gzip 压缩。

【问题讨论】:

    标签: http gzip std d zlib


    【解决方案1】:

    您的代码未发送适当的标头。压缩部分很好,但它周围的东西有一些需要修复的错误。

    交叉发布我在 D 新闻组上所说的内容:http://forum.dlang.org/post/rngupyejcsbzkzqwgojp@forum.dlang.org

    我正在尝试将 gzip 压缩添加到我编写的 HTTP 服务器 D. 这里是 gzip 编码的代码。

    我知道 zlib gzip 适用于 http,我在我的 cgi.d 中使用过它

                if(gzipResponse && acceptsGzip && isAll) {
                        auto c = new Compress(HeaderFormat.gzip); // want gzip
    
                        auto data = c.compress(t);
                        data ~= c.flush();
    
                        t = data;
                }
    

    但是您的 http 服务器在很多方面都存在问题。它不回复 curl 并且不保持连接打开以发出手动请求。

    在我看到快速查看它的错误中:

    server.d getRequestHeaderFieldValue,你不检查 epos 是否为-1。如果是,您应该返回 null 或其他内容,而不是尝试使用它 - 由于越界数组读取杀死了处理程序,连接将挂起。

    你还写道:

    if ((Info.modGzip) &amp; (indexOf(client.getRequestHeaderFieldValue("Accept-Encoding"),"gzip") != -1)){

    注意 & 而不是 &&。在 fspipedserver.d 中。

    最后,您编写了 client.client.send... 它从未将标头发送回客户端,因此它不知道您正在压缩!将其更改为 client.sendData(并将 server.d 中的 sendData 更改为采用“in void[]”而不是“void[]”),然后它发送标头,我的目测似乎可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 2014-03-31
      • 2021-01-19
      • 2012-07-10
      • 1970-01-01
      • 2011-04-19
      • 2013-09-21
      • 1970-01-01
      相关资源
      最近更新 更多