POE-Component-SmokeBox-Recent
view release on metacpan or search on metacpan
lib/POE/Component/SmokeBox/Recent.pm view on Meta::CPAN
my $self = bless \%opts, $package;
$self->{recent} = [];
$self->{uri} = URI->new( $self->{url} );
croak "url provided is of an unsupported scheme\n"
unless $self->{uri}->scheme and $self->{uri}->scheme =~ /^(ht|f)tp|file$/;
$self->{session_id} = POE::Session->create(
object_states => [
$self => [ qw(_start _process_http _process_ftp _process_file _recent _sig_child _epoch _epoch_fail) ],
$self => {
http_sockerr => '_get_connect_error',
http_timeout => '_get_connect_error',
http_response => '_http_response',
ftp_sockerr => '_get_connect_error',
ftp_error => '_get_error',
ftp_data => '_get_data',
ftp_done => '_get_done', },
],
heap => $self,
( ref($options) eq 'HASH' ? ( options => $options ) : () ),
)->ID();
return $self;
}
sub _start {
my ($kernel,$sender,$self) = @_[KERNEL,SENDER,OBJECT];
$self->{session_id} = $_[SESSION]->ID();
if ( $kernel == $sender and !$self->{session} ) {
croak "Not called from another POE session and 'session' wasn't set\n";
}
my $sender_id;
if ( $self->{session} ) {
if ( my $ref = $kernel->alias_resolve( $self->{session} ) ) {
$sender_id = $ref->ID();
}
else {
croak "Could not resolve 'session' to a valid POE session\n";
}
}
else {
$sender_id = $sender->ID();
}
$kernel->refcount_increment( $sender_id, __PACKAGE__ );
$kernel->detach_myself();
$self->{sender_id} = $sender_id;
if ( $self->{epoch} ) {
$kernel->yield( '_epoch' );
return;
}
$kernel->yield( '_process_' . $self->{uri}->scheme );
return;
}
sub _recent {
my ($kernel,$self,$type) = @_[KERNEL,OBJECT,ARG0];
my $target = delete $self->{sender_id};
my %reply;
$reply{recent} = delete $self->{recent} if $self->{recent};
$reply{error} = delete $self->{error} if $self->{error};
$reply{context} = delete $self->{context} if $self->{context};
$reply{url} = delete $self->{url};
@{ $reply{recent} } = grep { my @parts = split m!/!; $parts[3] !~ m!^perl6$!i } @{ $reply{recent} };
my $event = delete $self->{event};
$kernel->post( $target, $event, \%reply );
$kernel->refcount_decrement( $target, __PACKAGE__ );
return;
}
sub _process_http {
my ($kernel,$self) = @_[KERNEL,OBJECT];
my @path = $self->{rss} ? ( 'modules', '01modules.mtime.rss' ) : ( 'RECENT' );
$self->{uri}->path( File::Spec::Unix->catfile( $self->{uri}->path(), @path ) );
POE::Component::SmokeBox::Recent::HTTP->spawn(
uri => $self->{uri},
);
return;
}
sub _http_response {
my ($kernel,$self,$response) = @_[KERNEL,OBJECT,ARG0];
if ( $response->code() == 200 ) {
if ( $self->{rss} ) {
for ( split /\n/, $response->content() ) {
next unless m#<link>(.+?)</link>#i;
next unless m#by-authors#i;
my ($link) = $_ =~ m#id/(.+?)</link>\s*$#i;
next unless $link;
unshift @{ $self->{recent} }, $link;
}
}
else {
for ( split /\n/, $response->content() ) {
next unless /^authors/;
next unless /\.(tar\.gz|tgz|tar\.bz2|zip)$/;
s!authors/id/!!;
push @{ $self->{recent} }, $_;
}
}
}
else {
$self->{error} = $response->as_string();
}
$kernel->yield( '_recent', 'http' );
return;
}
sub _process_ftp {
my ($kernel,$self) = @_[KERNEL,OBJECT];
my @path = $self->{rss} ? ( 'modules', '01modules.mtime.rss' ) : ( 'RECENT' );
POE::Component::SmokeBox::Recent::FTP->spawn(
Username => 'anonymous',
Password => 'anon@anon.org',
address => $self->{uri}->host,
port => $self->{uri}->port,
path => File::Spec::Unix->catfile( $self->{uri}->path, @path ),
);
return;
}
sub _get_connect_error {
my ($kernel,$self,@args) = @_[KERNEL,OBJECT,ARG0..$#_];
$self->{error} = join ' ', @args;
( run in 1.102 second using v1.01-cache-2.11-cpan-71847e10f99 )