[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