[Moscow.pm] Вопрос знатокам POE :)
Orlovsky Alexander
nordicdyno на yandex.ru
Пт Фев 15 06:43:19 PST 2008
Ковыряю POE, пробую использовать POE::Component::Client::HTTP
Ковыряю пока поверхностно. Вот.
И пока не могу понять, как мне вызвать cancel для потоковых запросов.
Может кто чего подскажет?
Вот такой код не работает:
#!/usr/bin/perl
use strict;
use warnings;
use POE;
use POE::Component::Client::HTTP;
use HTTP::Request;
use HTML::Parser;
use Data::Dumper;
POE::Component::Client::HTTP->spawn(
Agent => 'robot',
Alias => 'ua',
Timeout => 60,
Streaming => 20,
FollowRedirects => 1,
);
our $CANCEL = 0;
my @url_list = (
);
POE::Session->create(
inline_states =>
{
_start =>
sub {
my $url = 'http://poe.perl.org/misc/test.html';
my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
my $request = HTTP::Request->new( GET => $url );
my $parser =
HTML::Parser->new(
api_version => 3,
start_h => [\&start_tag, "tagname, attr, skipped_text"],
end_h => [\&end_tag, "tagname, skipped_text"],
);
$parser->report_tags( qw(title) );
$heap->{URLS}{$request}{HTML_PARSER} = $parser;
$kernel->post( ua => 'request', got_response => $request );
},
got_response => \&got_response_handler,
}
);
$poe_kernel->run();
exit 0;
sub start_tag
{
my ($tag, $attr, $text) = @_;
}
sub end_tag
{
my ($tag,$text) = @_;
print "END_TAG:\n";
print "-" x 60 , "\n";
print Dumper(\@_);
print "-" x 60 , "\n";
$CANCEL=1;
}
sub got_response_handler
{
print "Call got_response_handler()\n";
my ( $kernel, $heap, $request_packet, $response_packet ) =
@_[ KERNEL, HEAP, ARG0, ARG1 ];
#HTTP::Request
my $request_object = $request_packet->[0];
if ($CANCEL) {
print "Try to cancel!\n";
$_[KERNEL]->call( $_[SESSION], 'cancel' );
}
# HTTP::Response
my $response_object = $response_packet->[0];
my $stream_chunk;
if ( (not defined $response_object->content)
or (length $response_object->content < 1 ) )
{
$stream_chunk = $response_packet->[1];
}
if ( defined $stream_chunk ) {
$heap->{URLS}{$request_object}{HTML_PARSER}->parse($stream_chunk);
# print "L = ", length($stream_chunk), "\n",
# "~" x 80, "\n",
# print "L = ", length($stream_chunk), "\n",
# "~" x 80, "\n",
# $stream_chunk, "\n",
# "~" x 80, "\n"
# ;
}
print "*" x 78, "\n";
}
Подробная информация о списке рассылки Moscow-pm