[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#955268: udd watch: "429 too many requests" from GitHub



Le 29/03/2020 à 17:31, Xavier a écrit :
> Le 29/03/2020 à 16:39, Lucas Nussbaum a écrit :
>> Hi,
>>
>> On 29/03/20 at 00:28 +0100, Adam Borowski wrote:
>>> On Sat, Mar 28, 2020 at 11:00:51PM +0000, Rebecca N. Palmer wrote:
>>>> In watchfile debian/watch, reading webpage
>>>>   https://github.com/statsmodels/statsmodels/tags failed: 429 too many
>>>> requests
>>>>
>>>> Which packages have this error seems to vary over time, but it seems to be
>>>> common (~50-90% of GitHub upstreams - e.g. see https://qa.debian.org/developer.php?email=pkg-go-maintainers%40lists.alioth.debian.org
>>>> but note that a dash can also mean "no debian/watch" or another error).
>>>>
>>>> I don't know if this was triggered by GitHub introducing/lowering their
>>>> limit, by a bug on our end making more requests than we intended to, or by
>>>> our generally increasing size.  (Currently 9490 GitHub-hosted packages each
>>>> checked every 3 days
>>>
>>> IIRC with an access token the limit is 5000 queries per hour.  Without a
>>> token, much, much less.
>>
>> The UDD code calls uscan. Is there a way for uscan to use an access
>> token?
>>
>> Lucas
> 
> Hi,
> 
> not for now, but I can add this feature. Just to insert an additional
> header ?


This little diff adds --http-header option. To use it:

uscan --http-header=Access-Token=qwertyuiop

Sounds good for you ?
diff --git a/lib/Devscripts/Config.pm b/lib/Devscripts/Config.pm
index 636f660b..58730b16 100644
--- a/lib/Devscripts/Config.pm
+++ b/lib/Devscripts/Config.pm
@@ -316,7 +316,8 @@ sub parse_command_line {
         my $name = $kname;
         $kname =~ s/-/_/g;
         if (defined $opts->{$name}) {
-            next if (ref $opts->{$name} and !@{ $opts->{$name} });
+            next if (ref $opts->{$name} eq 'ARRAY' and !@{ $opts->{$name} });
+            next if (ref $opts->{$name} eq 'HASH' and !%{ $opts->{$name} });
             if (defined $check) {
                 if (not(ref $check)) {
                     $check
diff --git a/lib/Devscripts/Uscan/Config.pm b/lib/Devscripts/Uscan/Config.pm
index 8e233a33..450a43f9 100644
--- a/lib/Devscripts/Uscan/Config.pm
+++ b/lib/Devscripts/Uscan/Config.pm
@@ -51,6 +51,7 @@ has log                      => (is => 'rw');
 has orig                     => (is => 'rw');
 has package                  => (is => 'rw');
 has pasv                     => (is => 'rw');
+has http_header              => (is => 'rw', default => sub { {} });
 
 # repack to .tar.$zsuffix if 1
 has repack     => (is => 'rw');
@@ -111,6 +112,8 @@ use constant keys => [
     ['uversion|upstream-version=s'],
     ['watchfile=s'],
     # 2.3 - More complex options
+    # http headers (#955268)
+    ['http-header=s', undef, undef, sub { {} }],
 
     # "download" and its aliases
     [
diff --git a/lib/Devscripts/Uscan/Downloader.pm b/lib/Devscripts/Uscan/Downloader.pm
index abd07e7a..b23b249e 100644
--- a/lib/Devscripts/Uscan/Downloader.pm
+++ b/lib/Devscripts/Uscan/Downloader.pm
@@ -74,6 +74,10 @@ has user_agent => (
 
 has ssl => (is => 'rw', default => sub { $haveSSL });
 
+has headers => (
+    is      => 'ro',
+    default => sub { {} });
+
 sub download ($$$$$$$$) {
     my ($self, $url, $fname, $optref, $base, $pkg_dir, $pkg, $mode) = @_;
     my ($request, $response);
@@ -91,10 +95,15 @@ sub download ($$$$$$$$) {
         my $headers = HTTP::Headers->new;
         $headers->header('Accept'  => '*/*');
         $headers->header('Referer' => $base);
+        foreach my $k (keys %{ $self->headers }) {
+            $headers->header($k => $self->headers->{$k});
+            uscan_verbose "Set custom header $k => $self->{headers}->{$k}";
+        }
         $request  = HTTP::Request->new('GET', $url, $headers);
         $response = $self->user_agent->request($request, $fname);
         if (!$response->is_success) {
-            uscan_warn((defined $pkg_dir ? "In directory $pkg_dir, d" : "D")
+            uscan_warn(
+                  (defined $pkg_dir ? "In directory $pkg_dir, d" : "D")
                 . "ownloading\n  $url failed: "
                   . $response->status_line);
             return 0;
@@ -104,7 +113,8 @@ sub download ($$$$$$$$) {
         $request  = HTTP::Request->new('GET', "$url");
         $response = $self->user_agent->request($request, $fname);
         if (!$response->is_success) {
-            uscan_warn((defined $pkg_dir ? "In directory $pkg_dir, d" : "D")
+            uscan_warn(
+                  (defined $pkg_dir ? "In directory $pkg_dir, d" : "D")
                 . "ownloading\n  $url failed: "
                   . $response->status_line);
             return 0;
diff --git a/lib/Devscripts/Uscan/WatchFile.pm b/lib/Devscripts/Uscan/WatchFile.pm
index 71309cee..2f041554 100644
--- a/lib/Devscripts/Uscan/WatchFile.pm
+++ b/lib/Devscripts/Uscan/WatchFile.pm
@@ -126,11 +126,13 @@ has downloader => (
     is      => 'ro',
     lazy    => 1,
     default => sub {
+        my %h;
         Devscripts::Uscan::Downloader->new({
             timeout => $_[0]->config->timeout,
             agent   => $_[0]->config->user_agent,
             pasv    => $_[0]->config->pasv,
             destdir => $_[0]->config->destdir,
+            headers => $_[0]->config->http_header,
         });
     },
 );

Reply to: