—use
strict;
use
warnings;
use
Net::IMP;
use
Net::IMP::HTTP;
sub
RTYPES { ( IMP_PASS, IMP_PREPASS, IMP_REPLACE ) }
sub
new_analyzer {
my
(
$factory
,
%args
) =
@_
;
my
$analyzer
=
$factory
->SUPER::new_analyzer(
%args
);
# we are not interested in request data, only response
# but for http we need to see requests to pair with responses
$analyzer
->run_callback([IMP_PREPASS,0,IMP_MAXOFFSET]);
return
$analyzer
;
}
# data supports IMP_DATA_HTTP and IMP_DATA_HTTPRQ interface
sub
data {
my
(
$self
,
$dir
,
$data
,
$offset
,
$type
) =
@_
;
# request are handled by the pass maxoffset in new_analyzer
if
(
$dir
== 0 ) {
# if we speak httprq we can make the prepass to a pass
$self
->run_callback([IMP_PASS,0,IMP_MAXOFFSET])
if
$type
== IMP_DATA_HTTPRQ_HEADER;
return
;
}
$self
->{pos1} +=
length
(
$data
);
if
(
$type
== IMP_DATA_HTTP_HEADER
or
$type
== IMP_DATA_HTTPRQ_HEADER ) {
$data
=~s{\n}{\nX-Foo: bar\r\n};
my
@rv
= [
IMP_REPLACE,
1,
$self
->{pos1},
$data
];
if
(
$type
== IMP_DATA_HTTPRQ_HEADER ) {
# for httprq interface we can pass until end of request (maxoffset)
push
@rv
, [ IMP_PASS,1,IMP_MAXOFFSET ];
}
$self
->run_callback(
@rv
);
}
else
{
# for http we might get more requests
# these might be chunking etc so we probably don't know their length
# therefore we can pass only data we get until we get the next
# response header
$self
->run_callback([ IMP_PASS,1,
$self
->{pos1} ]);
}
}
1;
__END__
=head1 NAME
Net::IMP::HTTP::Example::AddXFooHeader - adds X-Foo header to HTTP response
=head1 DESCRIPTION
This module analyses HTTP streams and adds an X-Foo header add the end of each
HTTP response header it finds in the stream.
This module is not very useful by its own.
It is only used to show, how these kind of manipulations can be done.
=head1 AUTHOR
Steffen Ullrich <sullr@cpan.org>
=head1 COPYRIGHT
Copyright by Steffen Ullrich.
This module is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.