当前位置:  开发笔记 > 编程语言 > 正文

使用LWP,Apache和mod_deflate压缩HTTP请求

如何解决《使用LWP,Apache和mod_deflate压缩HTTP请求》经验,为你挑选了0个好方法。

我有一个客户端/服务器系统,使用通过使用Perl的LWP的客户端使用HTTP请求和响应传输的XML以及通过Apache运行Perl的CGI.pm的服务器来执行通信.此外,流使用SSL加密,并为服务器和所有客户端提供证书.

该系统运行良好,但客户端需要定期发送大量数据.一个明显的解决方案是压缩客户端上的数据,将其发送出去,然后在服务器上解压缩.而不是这样的实现我自己,我希望能使用Apache的mod_deflate模块的"输入减压"描述这里.

描述警告:

如果您自己评估请求正文,请不要相信Content-Length标头!Content-Length标头反映了来自客户端的传入数据的长度,而不是解压缩数据流的字节数.

因此,如果我提供与压缩数据大小匹配的Content-Length值,则会截断数据.这是因为mod_deflate解压缩了流,但CGI.pm只读取Content-Length限制.

或者,如果我试图超越它并用解压缩的数据大小覆盖Content-Length标头,LWP会抱怨并将值重置为压缩长度,从而给我留下同样的问题.

最后,我试图破解LWP中进行修正的部分.原始代码是:

    # Set (or override) Content-Length header
    my $clen = $request_headers->header('Content-Length');
    if (defined($$content_ref) && length($$content_ref)) {
        $has_content = length($$content_ref);
        if (!defined($clen) || $clen ne $has_content) {
            if (defined $clen) {
                warn "Content-Length header value was wrong, fixed";
                hlist_remove(\@h, 'Content-Length');
            }
            push(@h, 'Content-Length' => $has_content);
        }
    }
    elsif ($clen) {
        warn "Content-Length set when there is no content, fixed";
        hlist_remove(\@h, 'Content-Length');
    }

我把推线改为:

  push(@h, 'Content-Length' => $clen);

不幸的是,这会导致一些问题,即内容(截断或不截断)甚至无法访问我的CGI脚本.

有没有人做过这项工作?我发现这在上传之前对文件进行了压缩,但没有压缩通用请求.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有