2

HTTP :: Proxyを使用して、クライアントサーバーアプリケーションの動作を確認しています。クライアントに任意のコンテンツを配信するためのフィルターをすでに作成しました。

私がテストしなければならないアプリケーションはcvmfsです。これは、標準のhttp接続を使用してリモートファイルシステムをマウントするソフトウェアです。サーバーがcvmfsキャッシュパーティションより大きいファイルを送信するとどうなるかを確認する必要があります。また、cvmfsがファイル全体をダウンロードしてから破棄する必要があるかどうか、またはファイルが間違っていることが明らかになるとすぐに停止するかどうかを確認したいと思います。

クライアントは10MBのファイルを期待していますが、サーバーは100MBのファイルを送信します。もちろん、クライアントは偽のファイルを認識し、リポジトリをマウントしません。クライアントが10MB後にロードを停止するかどうか、または接続を閉じる前にファイル全体をロードするかどうかを確認したいので、サーバー側で確認する必要があります。

したがって、サーバーがファイルの送信を開始すると(この作業は、呼び出しをインターセプトして偽のファイルを提供するHTTP :: Proxyによって実行されます)、クライアントがいつファイルのダウンロードを停止するかを知りたいです。

それを行う方法はありますか?転送が成功したかどうかを知るだけで十分ですが、転送されたmbの数を直接確認することは有用です。

編集

これは、転送されたデータをログに記録するために使用しているフィルターであり(2つのプロキシアプローチを使用しています)、必要な処理を実行します。残念ながら、プレーンテキストファイルに対してのみ正しく機能します。実行可能ファイル(実行可能ファイルをエクスポートしています)に対して同じことをどのように達成できますか?

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 に答える