http - D std.zlib 使用 http 进行流压缩

标签 http gzip std d zlib

我正在尝试将 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 压缩。

最佳答案

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

交叉发布我在 D 新闻组上所说的话:http://forum.dlang.org/post/[email protected]

I'm trying to add gzip compression to a HTTP server i wrote in D. here is the code that dose the gzip encoding.

我知道 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) & (indexOf(client.getRequestHeaderFieldValue("Accept-Encoding"),"gzip") != -1)){

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

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

关于http - D std.zlib 使用 http 进行流压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24923850/

相关文章:

c++ - boost HTTP 服务器问题

python - 从 python 中的 gzip 文件中读取 utf-8 字符

c++ - 如何从 C++ 中的 vector 中删除不连续的元素

c++ - 如何在不复制的情况下将 std::vector<unsigned char> 转换为 vector<char>?

c++ - thread 不是 std c++ 的成员

java - 检查 HTTP 请求中的图像有效性

c# - 使用 IIS 但不使用 WCF 的基本 HTTP 服务

r - 使用 data.table 和 R.utils 获取 gzip 压缩文件的一致 md5 校验和

amazon-web-services - 如何从 AWS S3 提供 Gzip 压缩的 webpack 包

php - 通过来自 iOS 的 http post 请求在 php 中接收图像