App-HTTP_Proxy_IMP
view release on metacpan or search on metacpan
examples/DelayRequest.pm view on Meta::CPAN
use strict;
use warnings;
package DelayRequest;
use base 'Net::IMP::HTTP::Request';
use fields qw(delayed);
use Net::IMP;
use Net::IMP::HTTP;
use Net::IMP::Debug;
use Scalar::Util 'weaken';
sub RTYPES { ( IMP_PASS ) }
sub new_analyzer {
my ($class,%args) = @_;
my $self = $class->SUPER::new_analyzer(%args);
$self->run_callback(
# we don't need to look at response
[ IMP_PASS,1,IMP_MAXOFFSET ],
);
return $self;
}
sub validate_cfg {
my ($class,%cfg) = @_;
delete $cfg{delay};
return $class->SUPER::validate_cfg(%cfg);
}
sub data {
my ($self,$dir,$data,$offset,$type) = @_;
if ( $dir == 0 # request
&& $type == IMP_DATA_HTTPRQ_HEADER # header
&& $data =~m{\AGET ((http://[^/]+/)[^\s]*)}
) {
if(0) {
my ($base,$path) = ($2,$1);
if (
$data =~m{^Referer:\s*\Q$base}mi # same origin
|| $data =~m{^Referer:\s*https?://}mi # at least from another site
) {
# no delay
$self->run_callback([ IMP_PASS,0,IMP_MAXOFFSET ]);
return;
}
}
weaken(my $wself = $self);
$self->{delayed} = $self->{factory_args}{eventlib}->timer(
$self->{factory_args}{delay} || 0.5,
sub {
# pass thru everything
$wself or return;
$wself->{delayed} = undef;
$wself->run_callback([ IMP_PASS,0,IMP_MAXOFFSET ]);
}
);
}
}
1;
__END__
=head1 NAME
DelayRequest - delays sending of request
=head1 SYNOPSIS
perl bin/http_proxy_imp --filter DelayRequest=delay=0.5 ip:port
( run in 0.621 second using v1.01-cache-2.11-cpan-39bf76dae61 )