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

use*_*410 6 apache perl mod-deflate lwp

我有一个客户端/服务器系统,使用通过使用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');
    }
Run Code Online (Sandbox Code Playgroud)

我把推线改为:

  push(@h, 'Content-Length' => $clen);
Run Code Online (Sandbox Code Playgroud)

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

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

J.J*_*.J. -1

我不确定我是否按照您想要的方式关注您,但我有一个自定义的 get/post 模块,我用它来做一些非标准的事情。下面的代码将读取通过邮寄或 STDIN 发送的任何内容。

read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
Run Code Online (Sandbox Code Playgroud)

不要使用 $ENV 的值,而是使用你的值。我希望这会有所帮助,如果没有帮助,很抱歉。