App-cpanurl
view release on metacpan or search on metacpan
script/cpanurl view on Meta::CPAN
return '' unless ( length substr( $self->{incr_text}, 0, $p ) );
local $Carp::CarpLevel = 2;
$self->{incr_p} = $restore;
$self->{incr_c} = $p;
my ( $obj, $tail ) = $coder->PP_decode_json( substr( $self->{incr_text}, 0, $p ), 0x10000001 );
$self->{incr_text} = substr( $self->{incr_text}, $p );
$self->{incr_p} = 0;
return $obj or '';
}
sub incr_text {
if ( $_[0]->{incr_parsing} ) {
Carp::croak("incr_text can not be called when the incremental parser already started parsing");
}
$_[0]->{incr_text};
}
sub incr_skip {
my $self = shift;
$self->{incr_text} = substr( $self->{incr_text}, $self->{incr_c} );
$self->{incr_p} = 0;
}
sub incr_reset {
my $self = shift;
$self->{incr_text} = undef;
$self->{incr_p} = 0;
$self->{incr_mode} = 0;
$self->{incr_nest} = 0;
$self->{incr_parsing} = 0;
}
package
App::cpanurl::UserAgent;
our @ISA = ('App::cpanurl::Object::Simple');
use strict;
use warnings;
sub has { __PACKAGE__->App::cpanurl::Object::Simple::attr(@_) }
has 'lwp';
has 'used_class';
sub req {
my ($self, $method, $url, $body) = @_;
my $lwp = $self->lwp;
my $res;
if ($lwp eq 'use' || $lwp eq 'auto' && eval { require LWP::UserAgent; LWP::UserAgent->VERSION(5.802) })
{
require LWP::UserAgent;
require HTTP::Request;
my $ua = LWP::UserAgent->new(
parse_head => 0,
env_proxy => 1,
agent => "App::cpanurl/$VERSION",
timeout => 30
);
my $r;
if ($method eq 'post') {
my $req = HTTP::Request->new('POST', $url);
$req->header('Content-Type' => 'application/json');
$req->content($body);
$r = $ua->request($req);
}
else { $r = $ua->get($url) }
$res->{success} = $r->is_success;
$res->{status_line} = $r->status_line;
$res->{content} = $r->content;
$self->used_class('LWP::UserAgent');
}
else {
my $ua = App::cpanurl::HTTP::Tiny->new;
my $r;
if ($method eq 'post') {
$r = $ua->post($url,
{headers => {'Content-Type' => 'application/json'}, content => $body});
}
else { $r = $ua->get($url) }
$res->{success} = $r->{success};
$res->{status_line} = "$r->{status} $r->{reason}";
$res->{content} = $r->{content};
$self->used_class('HTTP::Tiny');
}
return $res;
}
package
App::cpanurl::ModuleURL;
our @ISA = ('App::cpanurl::Object::Simple');
use strict;
use warnings;
sub has { __PACKAGE__->App::cpanurl::Object::Simple::attr(@_) }
has 'error';
has lwp => 'auto';
sub get {
my ($self, $module, $version, $opts) = @_;
$opts ||= {};
my $lwp = $self->lwp;
# Release
my $release;
$release = $module unless defined $version;
# Get release
my $metacpan_api = 'http://api.metacpan.org/v0';
my $ua = App::cpanurl::UserAgent->new(lwp => $lwp);
unless ($release) {
my $body = qq/{"query":{"filtered":{"query":{"match_all":{}},"filter":{"and":[{"term":{"file.module.authorized":true}},{"term":{"file.module.name":"$module"}},{"term":{"file.module.version":"$version"}}]}}},"fields":["release"]}/;
my $url = "$metacpan_api/file/_search";
my $res = $ua->req('post', $url, $body);
my $agent = $ua->used_class;
my $error;
if ($res->{success} && !$ENV{TEST_MODULEVERSION_REQUEST_FAIL}) {
( run in 0.564 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )