我正在使用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;