AnyEvent-Net-Curl-Queued
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/AnyEvent/Net/Curl/Queued/Multi.pm view on Meta::CPAN
package AnyEvent::Net::Curl::Queued::Multi;
# ABSTRACT: Net::Curl::Multi wrapped by Moo
use strict;
use utf8;
use warnings qw(all);
use AnyEvent;
use Carp qw(confess);
use Moo;
use MooX::Types::MooseLike::Base qw(
AnyOf
ArrayRef
HashRef
Int
Num
Object
Ref
);
use Net::Curl::Multi;
use Scalar::Util qw(set_prototype);
# kill Net::Curl::Mulii prototypes as they wreck around/before/after method modifiers
set_prototype \&Net::Curl::Multi::new => undef;
set_prototype \&Net::Curl::Multi::socket_action => undef;
set_prototype \&Net::Curl::Multi::add_handle => undef;
extends 'Net::Curl::Multi';
has active => (is => 'ro', isa => Int, default => sub { -1 }, writer => 'set_active');
has pool => (is => 'ro', isa => HashRef[Ref], default => sub { {} });
has timer => (is => 'ro', isa => AnyOf[ArrayRef, Object], writer => 'set_timer', clearer => 'clear_timer', predicate => 'has_timer', weak_ref => 0);
has max => (is => 'ro', isa => Num, default => sub { 4 });
has timeout => (is => 'ro', isa => Num, default => sub { 60.0 });
our $VERSION = '0.049'; # VERSION
sub BUILD {
my ($self) = @_;
$self->setopt(Net::Curl::Multi::CURLMOPT_MAXCONNECTS => $self->max << 2);
$self->setopt(Net::Curl::Multi::CURLMOPT_SOCKETFUNCTION => \&_cb_socket);
$self->setopt(Net::Curl::Multi::CURLMOPT_TIMERFUNCTION => \&_cb_timer);
return;
}
## no critic (RequireArgUnpacking)
sub BUILDARGS { return $_[-1] }
# socket callback: will be called by curl any time events on some
# socket must be updated
sub _cb_socket {
my ($self, undef, $socket, $poll) = @_;
# Right now $socket belongs to that $easy, but it can be
# shared with another easy handle if server supports persistent
# connections.
# This is why we register socket events inside multi object
# and not $easy.
# AnyEvent does not support registering a socket for both
# reading and writing. This is rarely used so there is no
# harm in separating the events.
my $keep = 0;
# register read event
if ($poll & Net::Curl::Multi::CURL_POLL_IN) {
$self->pool->{"r$socket"} = AE::io $socket, 0, sub {
$self->socket_action($socket, Net::Curl::Multi::CURL_CSELECT_IN);
};
++$keep;
}
# register write event
if ($poll & Net::Curl::Multi::CURL_POLL_OUT) {
$self->pool->{"w$socket"} = AE::io $socket, 1, sub {
$self->socket_action($socket, Net::Curl::Multi::CURL_CSELECT_OUT);
};
++$keep;
}
# deregister old io events
unless ($keep) {
delete $self->pool->{"r$socket"};
delete $self->pool->{"w$socket"};
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.517 second using v1.00-cache-2.02-grep-82fe00e-cpan-2c419f77a38b )