From a74b144a904df3374ccb561e64ad934148411213 Mon Sep 17 00:00:00 2001 From: Bertrand Cournaud Date: Wed, 23 Dec 2015 14:37:04 +0100 Subject: [PATCH] Try to handle pagination - WIP --- apps/github/mode/issues.pm | 70 ++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/apps/github/mode/issues.pm b/apps/github/mode/issues.pm index 0b081cad2..28f5951fa 100644 --- a/apps/github/mode/issues.pm +++ b/apps/github/mode/issues.pm @@ -73,12 +73,12 @@ sub check_options { $self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical} . "'."); $self->{output}->option_exit(); } - + $self->{option_results}->{url_path} = "/repos/" . $self->{option_results}->{owner} . "/" . $self->{option_results}->{repository} . "/issues"; if (defined($self->{option_results}->{label}) && $self->{option_results}->{label} ne '') { - $self->{option_results}->{get_param} = ['state=open', 'labels=' . $self->{option_results}->{label}, 'per_page=1000']; + $self->{option_results}->{get_param} = ['state=open', 'labels=' . $self->{option_results}->{label}, 'per_page=100']; } else { - $self->{option_results}->{get_param} = ['state=open', 'per_page=1000']; + $self->{option_results}->{get_param} = ['state=open', 'per_page=100']; } $self->{http}->set_options(%{$self->{option_results}}); } @@ -86,22 +86,62 @@ sub check_options { sub run { my ($self, %options) = @_; - my $jsoncontent = $self->{http}->request(); + my $pagination = 1; - my $json = JSON->new; - my $webcontent; - eval { - $webcontent = $json->decode($jsoncontent); - }; + my $nb_issues = 0; + my $header; + my $attemps = 3; + my $next_url = ""; - if ($@) { - $self->{output}->add_option_msg(short_msg => "Cannot decode json response"); - $self->{output}->option_exit(); + while ($pagination && $attemps > 0) { + $attemps -= 1; + + my $jsoncontent; + if ($next_url eq "") { + print 'Next url null.\n'; + $jsoncontent = $self->{http}->request(); + } + else { + print 'New next url: ' . $next_url . '\n'; + #$next_url = "/repositories/9074774/issues?per_page=100&state=open&page=3"; + $self->{option_results}->{url_path} = $next_url; + $self->{http}->set_options(%{$self->{option_results}}); + $jsoncontent = $self->{http}->request(url_path => $next_url, get_param => $self->{option_results}->{get_param}); + #$jsoncontent = $self->{http}->request(url_path => $next_url); + } + + my $json = JSON->new; + my $webcontent; + eval { + $webcontent = $json->decode($jsoncontent); + }; + + if ($@) { + $self->{output}->add_option_msg(short_msg => "Cannot decode json response"); + $self->{output}->option_exit(); + } + + # Number of issues is array length + $nb_issues += @{$webcontent}; + + $header = $self->{http}->get_header(); + #use Data::Dumper; + #print Dumper($header); + if (defined($header->header('link'))) { + print "Link found\n"; + if ($header->header('link') =~ /; rel="next"/) { + print "Found regex\n"; + $next_url = $1; + print $next_url . "\n"; + } else { + $pagination = 0; + } + } else { + $pagination = 0; + print "No link found\n"; + } } - # Number of issues is array length - my $nb_issues = @{$webcontent}; - my $exit = $self->{perfdata}->threshold_check(value => $nb_issues, threshold => [ { label => 'critical', exit_litteral => 'critical' }, , { label => 'warning', exit_litteral => 'warning' } ]); if (defined($self->{option_results}->{label}) && $self->{option_results}->{label} ne '') {