我正在尝试将 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/