2012-07-09 38 views
1

我使用HTTP::Proxy来检查客户端 - 服务器应用程序的行为。我已经制作了一个过滤器来向客户端传递任意内容。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; 
+1

我很困惑。谁在发送谁的东西?请尽量将其描述得更简洁一点。 – simbabque 2012-07-09 11:27:37

+0

我不认为它可能有用,因为我的问题不依赖于此...但是,我添加了一些解释(但现在的问题有点多余)。 – Zagorax 2012-07-09 12:01:09

+0

至少现在我们明白你的意思是'仓库'。那不清楚。谢谢。无论如何...总结通过过滤器的所有消息的“lenght()”怎么样?或者是这样简单?我现在无法测试。 – simbabque 2012-07-09 12:09:16

回答

1

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

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; 
+0

对不起,不了解这个解决方案。通过这种方式,我可以将'$$ dataref'设置为我的错误文件。我会先做,因为我需要发送这个文件。但是,接下来,我将这个文件分割成许多数据块,并且我想要检索这些块的大小(以字节为单位)。我怎么能用你的例子来做到这一点? – Zagorax 2012-07-09 20:58:55

+0

我不知道你在说什么“然后”和“块”。我指的是[revision 4](http://stackoverflow.com/revisions/11392193/4)中的代码 - 这是读取'/ tmp/cvmfs.faulty'文件的错误方法。 – daxim 2012-07-09 21:03:02

+0

我注意到了,我会改变它。 :)但问题是关于在客户端将文件识别为错误之前发现有多少字节被传输。其实我试图用两个代理来实现它。第一个将用cvmfs.faulty(使用你的系统)替换整个身体响应,而第二个代理将接收这个文件,所以'$$ dataref'将每次都是这个文件的一部分。我想知道当$$ dataref没有指向一个文本文件时(这种情况下,我可以用'length()')来做这个部分多长时间。 – Zagorax 2012-07-09 21:09:23

相关问题