AnyEvent-Net-Curl-Queued
view release on metacpan or search on metacpan
lib/AnyEvent/Net/Curl/Queued/Easy.pm view on Meta::CPAN
$self->on_finish->($self, $result) if ref($self->on_finish) eq 'CODE';
return;
}
sub clone {
my ($self, $param) = @_;
# silently ignore unsupported parameters
$param = {} unless 'HASH' eq ref $param;
my $class = ref($self);
$param->{$_} = $self->$_()
for qw(
http_response
initial_url
retry
use_stats
);
--$param->{retry};
$param->{force} = 1;
$param->{on_init} = $self->on_init if ref($self->on_init) eq 'CODE';
$param->{on_finish} = $self->on_finish if ref($self->on_finish) eq 'CODE';
my $post_content = $self->post_content;
return ($post_content eq '')
? sub { $class->new($param) }
: sub {
my $new = $class->new($param);
$new->setopt(Net::Curl::Easy::CURLOPT_POSTFIELDS, $post_content);
return $new;
};
}
around setopt => sub {
my $orig = shift;
my $self = shift;
if (@_) {
my %param;
if (scalar @_ % 2 == 0) {
%param = @_;
} elsif (ref($_[0]) eq 'HASH') {
my $param = shift;
%param = %{$param};
} else {
carp "setopt() expects OPTION/VALUE pair, OPTION/VALUE hash or hashref!";
}
while (my ($key, $val) = each %param) {
$key = AnyEvent::Net::Curl::Const::opt($key);
if ($key == Net::Curl::Easy::CURLOPT_POSTFIELDS) {
my $is_json = 0;
($val, $is_json) = $self->_setopt_postfields($val);
$orig->($self =>
Net::Curl::Easy::CURLOPT_HTTPHEADER,
[ 'Content-Type: application/json; charset=utf-8' ],
) if $is_json;
} elsif ($key == Net::Curl::Easy::CURLOPT_ENCODING) {
$self->_autodecoded(1);
$val = $self->_setopt_encoding($val);
}
$orig->($self => $key, $val);
}
} else {
carp "Specify at least one OPTION/VALUE pair!";
}
};
sub _setopt_postfields {
my ($self, $val) = @_;
my $is_json = 0;
if ('HASH' eq ref $val) {
++$is_json;
$val = $self->json->encode($val);
} else {
# some DWIMmery here!
# application/x-www-form-urlencoded is supposed to have a 7-bit encoding
$val = encode_utf8($val)
if utf8::is_utf8($val);
my $obj;
++$is_json if 'HASH' eq ref($obj = eval { $self->json->decode($val) });
}
return ($self->set_post_content($val), $is_json);
}
sub _setopt_encoding {
my ($self, $val) = @_;
# stolen from LWP::Protocol::Net::Curl
my @encoding =
map { /^(?:x-)?(deflate|gzip|identity)$/ix ? lc $1 : () }
split /\s*,\s*/x, $val;
return join q(,) => @encoding;
}
around getinfo => sub {
my $orig = shift;
my $self = shift;
for (ref($_[0])) {
when ('ARRAY') {
my @val;
for my $name (@{$_[0]}) {
my $const = AnyEvent::Net::Curl::Const::info($name);
next unless defined $const;
push @val, $self->$orig($const);
}
return @val;
} when ('HASH') {
my %val;
for my $name (keys %{$_[0]}) {
lib/AnyEvent/Net/Curl/Queued/Easy.pm view on Meta::CPAN
Useful to successfully enqueue POST parameters.
=head2 init()
Initialize the instance.
We can't use the default C<BUILD> method as we need the initialization to be done B<after> the instance is in the queue.
You are supposed to build your own stuff after/around/before this method using L<method modifiers|Moose::Manual::MethodModifiers>.
=head2 has_error()
Error handling: if C<has_error> returns true, the request is re-enqueued (until the retries number is exhausted).
You are supposed to build your own stuff after/around/before this method using L<method modifiers|Moose::Manual::MethodModifiers>.
For example, to retry on server error (HTTP 5xx response code):
around has_error => sub {
my $orig = shift;
my $self = shift;
return 1 if $self->$orig(@_);
return 1 if $self->getinfo('response_code') =~ m{^5[0-9]{2}$};
};
=head2 finish($result)
Called when the download is finished.
C<$result> holds the C<Net::Curl::Easy::Code>.
You are supposed to build your own stuff after/around/before this method using L<method modifiers|Moose::Manual::MethodModifiers>.
=head2 clone()
Clones the instance, for re-enqueuing purposes.
You are supposed to build your own stuff after/around/before this method using L<method modifiers|Moose::Manual::MethodModifiers>.
=head2 setopt(OPTION => VALUE [, OPTION => VALUE])
Extends L<Net::Curl::Easy> C<setopt()>, allowing option lists:
$self->setopt(
CURLOPT_ENCODING, '',
CURLOPT_FOLLOWLOCATION, 1,
CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
CURLOPT_VERBOSE, 1,
);
Or even shorter:
$self->setopt(
encoding => '',
followlocation => 1,
useragent => 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
verbose => 1,
);
Complete list of options: L<http://curl.haxx.se/libcurl/c/curl_easy_setopt.html>
If C<CURLOPT_POSTFIELDS> is a C<HashRef> or looks like a valid JSON (validates via L<JSON>),
it is encoded as UTF-8 and C<Content-Type: application/json; charset=utf-8> header is set automatically.
=head2 getinfo(VAR_NAME [, VAR_NAME])
Extends L<Net::Curl::Easy> C<getinfo()> so it is able to get several variables at once;
C<HashRef> parameter under void context will fill respective values in the C<HashRef>:
my $x = {
content_type => 0,
speed_download => 0,
primary_ip => 0,
};
$self->getinfo($x);
C<HashRef> parameter will return another C<HashRef>:
my $x = $self->getinfo({
content_type => 0,
speed_download => 0,
primary_ip => 0,
});
C<ArrayRef> parameter will return a list:
my ($content_type, $speed_download, $primary_ip) =
$self->getinfo([qw(content_type speed_download primary_ip)]);
Complete list of options: L<http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html>
=head1 FUNCTIONS
=head2 FOREIGNBUILDARGS
Internal.
Required for L<Moo> to operate properly on C<new> parameters.
=for Pod::Coverage BUILDARGS
res
=head1 SEE ALSO
=over 4
=item *
L<Moo>
=item *
L<Net::Curl::Easy>
=back
=head1 AUTHOR
Stanislaw Pusep <stas@sysd.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2021 by Stanislaw Pusep.
( run in 1.185 second using v1.01-cache-2.11-cpan-6aa56a78535 )