chiark / gitweb /
dgit: Reorganise url_fetch
[dgit.git] / dgit
diff --git a/dgit b/dgit
index ca6fe56ab840fe9342f6a1235904a3ac3ee1fc66..48be1987c2c4e7e2acf200dfa371544334b31ea4 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -54,6 +54,8 @@ use Debian::Dgit;
 our $our_version = 'UNRELEASED'; ###substituted###
 our $absurdity = undef; ###substituted###
 
+$SIG{INT} = 'DEFAULT'; # work around #932841
+
 our @rpushprotovsn_support = qw(6 5 4); # Reverse order!
 our $protovsn;
 
@@ -1190,54 +1192,57 @@ sub cfg_apply_map ($$$) {
     $$varref = $_;
 }
 
-#---------- `ftpmasterapi' archive query method (nascent) ----------
+sub url_fetch ($;@) {
+    my ($url, %xopts) = @_;
+    # Ok404 => 1   means give undef for 404
+
+    use WWW::Curl::Easy;
+
+    my $curl  = WWW::Curl::Easy->new;
+    my $setopt = sub {
+       my ($k,$v) = @_;
+       my $x = $curl->setopt($k, $v);
+       confess "$k $v ".$curl->strerror($x)." ?" if $x;
+    };
+
+    my $response_body;
+    $setopt->(CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS|CURLPROTO_HTTP);
+    $setopt->(CURLOPT_URL,             $url);
+    $setopt->(CURLOPT_NOSIGNAL,        1);
+    $setopt->(CURLOPT_WRITEDATA,       \$response_body);
 
-sub archive_api_query_cmd ($) {
-    my ($subpath) = @_;
-    my @cmd = (@curl, qw(-sS));
-    my $url = access_cfg('archive-query-url');
     if ($url =~ m#^https://([-.0-9a-z]+)/#) {
-       my $host = $1;
-       my $keys = access_cfg('archive-query-tls-key','RETURN-UNDEF') //'';
-       foreach my $key (split /\:/, $keys) {
-           $key =~ s/\%HOST\%/$host/g;
-           if (!stat $key) {
-               fail "for $url: stat $key: $!" unless $!==ENOENT;
-               next;
-           }
-           fail f_ "config requested specific TLS key but do not know".
-                   " how to get curl to use exactly that EE key (%s)",
-                   $key;
-#          push @cmd, "--cacert", $key, "--capath", "/dev/enoent";
-#           # Sadly the above line does not work because of changes
-#           # to gnutls.   The real fix for #790093 may involve
-#           # new curl options.
-           last;
+       foreach my $k (qw(archive-query-tls-key
+                         archive-query-tls-curl-ca-args)) {
+           fail "config option $k is obsolete and no longer supported"
+               if defined access_cfg($k, 'RETURN-UNDEF');
        }
-       # Fixing #790093 properly will involve providing a value
-       # for this on clients.
-       my $kargs = access_cfg('archive-query-tls-curl-ca-args','RETURN-UNDEF');
-       push @cmd, split / /, $kargs if defined $kargs;
     }
-    push @cmd, $url.$subpath;
-    return @cmd;
+
+    printdebug "query: fetching $url...\n";
+
+    local $SIG{PIPE} = 'IGNORE';
+
+    my $x = $curl->perform();
+    fail f_ "fetch of %s failed (%s): %s",
+       $url, $curl->strerror($x), $curl->errbuf
+       if $x;
+
+    my $code = $curl->getinfo(CURLINFO_HTTP_CODE);
+    if ($code eq '404' && $xopts{Ok404}) { return undef; }
+    
+    fail f_ "fetch of %s gave HTTP code %s", $url, $code
+       unless $url =~ m#^file://# or $code =~ m/^2/;
+    return $response_body;
 }
 
+#---------- `ftpmasterapi' archive query method (nascent) ----------
+
 sub api_query_raw ($;$) {
     my ($subpath, $ok404) = @_;
-    my @cmd = archive_api_query_cmd($subpath);
-    my $url = $cmd[$#cmd];
-    push @cmd, qw(-w %{http_code});
-    my $json = cmdoutput @cmd;
-    unless ($json =~ s/\d+\d+\d$//) {
-       failedcmd_report_cmd undef, @cmd;
-       fail __ "curl failed to print 3-digit HTTP code";
-    }
-    my $code = $&;
-    return undef if $code eq '404' && $ok404;
-    fail f_ "fetch of %s gave HTTP code %s", $url, $code
-       unless $url =~ m#^file://# or $code =~ m/^2/;
-    return $json;
+    my $url = access_cfg('archive-query-url');
+    $url .= $subpath;
+    return url_fetch $url, Ok404 => $ok404;
 }
 
 sub api_query ($$;$) {