chiark / gitweb /
dgit: Use WWW::Curl rather than invoking curl(1) for archive api
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 23 Jul 2019 15:35:01 +0000 (16:35 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 23 Jul 2019 15:36:05 +0000 (16:36 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
debian/control
dgit

index 3395984a563fe00a767c9ac5b3506e650b5e41e2..6fa937b9078b4364562feef5ce87264b8c96a00f 100644 (file)
@@ -15,7 +15,7 @@ Depends: perl, libwww-perl, libdpkg-perl, git-core, devscripts, dpkg-dev,
          coreutils (>= 8.23-1~),
          libdigest-sha-perl, dput, curl, apt,
          libjson-perl, ca-certificates,
-         libtext-iconv-perl, libtext-glob-perl
+         libtext-iconv-perl, libtext-glob-perl, libwww-curl-perl
 Recommends: ssh-client
 Suggests: sbuild | pbuilder | cowbuilder
 Architecture: all
diff --git a/dgit b/dgit
index 00f86c66098c39779728c89fd00c8a16e0087cb7..4a5cae1d37c3bdbbcd733b3887af67da00cdfd6b 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -1192,10 +1192,23 @@ sub cfg_apply_map ($$$) {
 
 #---------- `ftpmasterapi' archive query method (nascent) ----------
 
-sub archive_api_query_cmd ($) {
-    my ($subpath) = @_;
-    my @cmd = (@curl, qw(-sS));
-    my $url = access_cfg('archive-query-url');
+sub archive_api_query_curl ($) {
+    my ($url) = @_;
+
+    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_WRITEDATA,       \$response_body);
+
     if ($url =~ m#^https://([-.0-9a-z]+)/#) {
        foreach my $k (qw(archive-query-tls-key
                          archive-query-tls-curl-ca-args)) {
@@ -1203,21 +1216,20 @@ sub archive_api_query_cmd ($) {
                if defined access_cfg($k, 'RETURN-UNDEF');
        }
     }
-    push @cmd, $url.$subpath;
-    return @cmd;
+
+    my $x = $curl->perform();
+    fail f_ "fetch of %s failed (%s): %s",
+       $url, $curl->strerror($x), $curl->errbuf
+       if $x;
+
+    return $curl->getinfo(CURLINFO_HTTP_CODE), $response_body;
 }
 
 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 = $&;
+    my $url = access_cfg('archive-query-url');
+    $url .= $subpath;
+    my ($code,$json)  = archive_api_query_curl($url);
     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/;