2

我正在使用HTTP::Proxy来检查客户端-服务器应用程序的行为。我已经制作了一个过滤器来向客户端提供任意内容。

我要测试的应用程序是cvmfs。它是一个使用标准 http 连接挂载远程文件系统的软件。我们需要检查当服务器发送大于 cvmfs 缓存分区的文件时会发生什么。我们想检查cvmfs是否需要在丢弃它之前下载整个文件,或者它是否在清楚文件错误后立即停止。

客户端需要一个 10mb 的文件,而服务器将发送一个 100mb 的文件。当然,客户端会识别假文件,不会挂载存储库。我想检查客户端是否在 10mb 后停止加载,或者是否在关闭连接之前加载整个文件,我必须在服务器端检查它。

因此,一旦服务器开始发送文件(这项工作将由 HTTP::Proxy 完成,它将拦截调用并提供假文件),我想知道客户端何时停止下载它。

有没有办法做到这一点?知道转移是否成功就足够了,尽管直接检查转移了多少 mb 可能很有用。

编辑

这是我用来记录传输数据的过滤器(我正在使用建议的两种代理方法),它可以满足我的需求。不幸的是,它仅适用于纯文本文件。我怎样才能为可执行文件完成相同的操作(我正在导出可执行文件)?

package Filters::RecordTransfer;

######################################
# This filter is intended to be used for response
######################################

use strict;
use warnings;
use HTTP::Proxy::BodyFilter::simple;

our $body = HTTP::Proxy::BodyFilter::simple->new (
    sub {
        my ( $self, $dataref, $message, $protocol, $buffer ) = @_;
        my $record_file = '/tmp/transferred_data';

        if (-e $record_file) {
            my $fh;
            open($fh, '<', $record_file);
            my $actual_size = $fh->getline;
            close($fh);
            my $new_size = $actual_size + (length($$dataref));
            open($fh, '>', $record_file);
            print $fh $new_size;
            close($fh);
        }
        else {
            open (my $fh, '>', $record_file);
            print $fh length($$dataref);
            close($fh);
        }
    }
);

1;
4

1 回答 1

1

您以错误的方式读取文件。您必须设置适当的IO 层

use File::Slurp qw(read_file);
$$dataref = read_file '/tmp/cvmfs.faulty', { binmode => ':raw' };

当响应完成时,$count变量将包含经过过滤器的八位字节数。

use HTTP::Proxy qw();
use HTTP::Proxy::BodyFilter::simple qw();

my $count;
my $body = HTTP::Proxy::BodyFilter::simple->new(sub {
    $count += length ${ $_[1] };
    warn $count;
});

my $proxy = HTTP::Proxy->new(port => 3128);
$proxy->push_filter(response => $body, mime => '*/*');
$proxy->start;
于 2012-07-09T20:29:25.300 回答