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 )