GNU bug report logs

#45174 ‘guix substitute’ doesn’t handle HTTP redirects

PackageSource(s)Maintainer(s)
guix PTS Buildd Popcon
Reply or subscribe to this bug. View this bug as an mbox, status mbox, or maintainer mbox

Report forwarded to bug-guix@gnu.org:
bug#45174; Package guix. (Fri, 11 Dec 2020 09:51:02 GMT) (full text, mbox, link).


Acknowledgement sent to Ludovic Courtès <ludovic.courtes@inria.fr>:
New bug report received and forwarded. Copy sent to bug-guix@gnu.org. (Fri, 11 Dec 2020 09:51:02 GMT) (full text, mbox, link).


Message #5 received at submit@debbugs.gnu.org (full text, mbox, reply):

From: Ludovic Courtès <ludovic.courtes@inria.fr>
To: bug-guix@gnu.org
Subject: ‘guix substitute’ doesn’t handle HTTP redirects
Date: Fri, 11 Dec 2020 10:50:36 +0100
Hi!

As reported by mange on #guix, it seems that ‘guix substitute’ does not
follow redirects:

--8<---------------cut here---------------start------------->8---
$ guix weather icecat emacs --substitute-urls=https://ci.guix.gnu.org
computing 2 package derivations for x86_64-linux...
looking for 2 store items on https://ci.guix.gnu.org...
updating substitutes from 'https://ci.guix.gnu.org'... 100.0%
https://ci.guix.gnu.org
  100.0% substitutes available (2 out of 2)
  at least 201.3 MiB of nars (compressed)
  293.5 MiB on disk (uncompressed)
  0.084 seconds per request (0.2 seconds in total)
  11.9 requests per second

  at least 1,000 queued builds
      x86_64-linux: 368 (36.8%)
      i686-linux: 556 (55.6%)
      armhf-linux: 6 (.6%)
      aarch64-linux: 69 (6.9%)
      i586-gnu: 1 (.1%)
  build rate: 154.41 builds per hour
      i686-linux: 40.77 builds per hour
      x86_64-linux: 37.06 builds per hour
      armhf-linux: 40.30 builds per hour
      aarch64-linux: 35.83 builds per hour
      i586-gnu: 0.55 builds per hour
$ guix weather icecat emacs --substitute-urls=https://ci.guix.info
computing 2 package derivations for x86_64-linux...
looking for 2 store items on https://ci.guix.info...
updating substitutes from 'https://ci.guix.info'... 100.0%
https://ci.guix.info
  0.0% substitutes available (0 out of 2)
  unknown substitute sizes
  0.0 MiB on disk (uncompressed)
  0.069 seconds per request (0.1 seconds in total)
  14.4 requests per second
ni sekvas la redirektigon al 'https://ci.guix.gnu.org/api/queue'...
  'https://ci.guix.gnu.org/api/queue' returned 500 ("Internal Server Error")
--8<---------------cut here---------------end--------------->8---

This might explain things like <https://issues.guix.gnu.org/45051>.

(*.guix.info were turned into HTTP redirects a few days ago, see
<https://git.savannah.gnu.org/cgit/guix/maintenance.git/commit/?id=c85e128e11d3ba060ae3a6e01da20f531b42d6ef>.)

Ludo’.




Severity set to 'important' from 'normal' Request was from Ludovic Courtès <ludo@gnu.org> to control@debbugs.gnu.org. (Fri, 11 Dec 2020 14:16:01 GMT) (full text, mbox, link).


Information forwarded to bug-guix@gnu.org:
bug#45174; Package guix. (Tue, 12 Jan 2021 17:13:01 GMT) (full text, mbox, link).


Message #10 received at 45174@debbugs.gnu.org (full text, mbox, reply):

From: Julien Lepiller <julien@lepiller.eu>
To: Ludovic Courtès <ludovic.courtes@inria.fr>
Cc: 45174@debbugs.gnu.org
Subject: Re: bug#45174: ‘guix substitute’ doesn’t handle HTTP redirects
Date: Tue, 12 Jan 2021 18:11:55 +0100
[Message part 1 (text/plain, inline)]
Le Fri, 11 Dec 2020 10:50:36 +0100,
Ludovic Courtès <ludovic.courtes@inria.fr> a écrit :

> Hi!
> 
> As reported by mange on #guix, it seems that ‘guix substitute’ does
> not follow redirects:
> 
> --8<---------------cut here---------------start------------->8---
> $ guix weather icecat emacs --substitute-urls=https://ci.guix.gnu.org
> computing 2 package derivations for x86_64-linux...
> looking for 2 store items on https://ci.guix.gnu.org...
> updating substitutes from 'https://ci.guix.gnu.org'... 100.0%
> https://ci.guix.gnu.org
>   100.0% substitutes available (2 out of 2)
>   at least 201.3 MiB of nars (compressed)
>   293.5 MiB on disk (uncompressed)
>   0.084 seconds per request (0.2 seconds in total)
>   11.9 requests per second
> 
>   at least 1,000 queued builds
>       x86_64-linux: 368 (36.8%)
>       i686-linux: 556 (55.6%)
>       armhf-linux: 6 (.6%)
>       aarch64-linux: 69 (6.9%)
>       i586-gnu: 1 (.1%)
>   build rate: 154.41 builds per hour
>       i686-linux: 40.77 builds per hour
>       x86_64-linux: 37.06 builds per hour
>       armhf-linux: 40.30 builds per hour
>       aarch64-linux: 35.83 builds per hour
>       i586-gnu: 0.55 builds per hour
> $ guix weather icecat emacs --substitute-urls=https://ci.guix.info
> computing 2 package derivations for x86_64-linux...
> looking for 2 store items on https://ci.guix.info...
> updating substitutes from 'https://ci.guix.info'... 100.0%
> https://ci.guix.info
>   0.0% substitutes available (0 out of 2)
>   unknown substitute sizes
>   0.0 MiB on disk (uncompressed)
>   0.069 seconds per request (0.1 seconds in total)
>   14.4 requests per second
> ni sekvas la redirektigon al 'https://ci.guix.gnu.org/api/queue'...
>   'https://ci.guix.gnu.org/api/queue' returned 500 ("Internal Server
> Error") --8<---------------cut
> here---------------end--------------->8---
> 
> This might explain things like <https://issues.guix.gnu.org/45051>.
> 
> (*.guix.info were turned into HTTP redirects a few days ago, see
> <https://git.savannah.gnu.org/cgit/guix/maintenance.git/commit/?id=c85e128e11d3ba060ae3a6e01da20f531b42d6ef>.)
> 
> Ludo’.
> 
> 
> 

Here is a patch to fix that issue. Since ci.guix.info now returns 200,
it's difficult to test the patch. I created a location block on my
website to redirect lepiller.eu/*.narinfo -> ci.guix.gnu.org/*.narinfo.
Here's the result:

$ guix weather icecat emacs --substitute-urls=https://lepiller.eu
calcul de 2 dérivations de paquets pour x86_64-linux…
recherche de 2 éléments du dépôt sur https://lepiller.eu...
mise à jour des substituts depuis « https://lepiller.eu »... 100.0 %
https://lepiller.eu
  0.0 % des substituts sont disponibles (0 sur 2)
  taille des substituts inconnue
  0,0 Mo sur le disque (décompressé)
  0,207 secondes par requête (0,4 secondes en tout)
  4,8 requêtes par seconde


$ ./pre-inst-env guix weather icecat emacs
--substitute-urls=https://lepiller.eu
computing 2 package derivations for x86_64-linux...
looking for 2 store items on https://lepiller.eu...
updating substitutes from 'https://lepiller.eu'... 100.0%
https://lepiller.eu
  100.0% substitutes available (2 out of 2)
  at least 201,3 MiB of nars (compressed)
  293,5 MiB on disk (uncompressed)
  0,525 seconds per request (1,1 seconds in total)
  1,9 requests per second


(note that I didn't redirect the ci API on my server, so the rest of the
weather command fails with a backtrace, but it's unrelated to this
patch and this issue).
[0001-substitute-Follow-narinfo-redirections.patch (text/x-patch, attachment)]

Information forwarded to bug-guix@gnu.org:
bug#45174; Package guix. (Tue, 12 Jan 2021 21:35:01 GMT) (full text, mbox, link).


Message #13 received at 45174@debbugs.gnu.org (full text, mbox, reply):

From: Mark H Weaver <mhw@netris.org>
To: Julien Lepiller <julien@lepiller.eu>, Ludovic Courtès <ludovic.courtes@inria.fr>
Cc: 45174@debbugs.gnu.org
Subject: Re: bug#45174: ‘guix substitute’ doesn’t handle HTTP redirects
Date: Tue, 12 Jan 2021 16:32:39 -0500
Hi Julien,

Julien Lepiller <julien@lepiller.eu> writes:

> Here is a patch to fix that issue.  Since ci.guix.info now returns 200,
> it's difficult to test the patch.  [...]
[...]
> From f20e01f2a8df538519660772a7431b53d650d64f Mon Sep 17 00:00:00 2001
> From: Julien Lepiller <julien@lepiller.eu>
> Date: Tue, 12 Jan 2021 18:07:25 +0100
> Subject: [PATCH] substitute: Follow narinfo redirections.
>
> * guix/scripts/substitute.scm (fetch-narinfos): Follow redirections.
> ---
>  guix/scripts/substitute.scm | 38 +++++++++++++++++++++++++++----------
>  1 file changed, 28 insertions(+), 10 deletions(-)
>
> diff --git a/guix/scripts/substitute.scm b/guix/scripts/substitute.scm
> index e53de8c304..790168091e 100755
> --- a/guix/scripts/substitute.scm
> +++ b/guix/scripts/substitute.scm
> @@ -663,18 +663,36 @@ port to it, or, if connection failed, print a warning and return #f.  Pass
[...]
> +        ((301 302 303 307 308)            ; redirect
> +         (let* ((uri (response-location response))
> +                (new-request (build-request
> +                               uri #:headers '((User-Agent . "GNU Guile")))))
> +           (if len
> +               (get-bytevector-n port len)
> +               (read-to-eof port))
> +           (append
> +             (http-multiple-get uri
> +                                handle-narinfo-response '()
> +                                (list new-request)
> +                                #:open-connection
> +                                open-connection-for-uri/cached
> +                                #:verify-certificate? #f)
> +             result)))

Granted, it's been almost six years since I first implemented proper
HTTP redirects for Guix, but as I vaguely recall the URI in the response
may be a relative URI or have some missing components, so in the general
case it must be interpreted relative to the previous URI in accordance
with RFC 3986 section 5.2.

A proper implementation should use 'resolve-uri-reference' from (guix
build download).  Here's the original commit that added that function,
and used it to fix HTTP redirection support in (guix http-client):

  https://git.savannah.gnu.org/cgit/guix.git/commit/?id=04dec194d8e460831ec0695a944d9c7313affea2

Also, keep in mind that multiple redirects may occur, so a proper
implementation requires some kind of loop.  I haven't looked closely
enough at your code above to know whether that case is handled
correctly.  See the relevant code in (guix http-client) for hints.

Anyway, thanks for working on it!

     Regards,
       Mark




Send a report that this bug log contains spam.


debbugs.gnu.org maintainers <help-debbugs@gnu.org>. Last modified: Sun Sep 8 03:53:34 2024; Machine Name: wallace-server

GNU bug tracking system

Debbugs is free software and licensed under the terms of the GNU Public License version 2. The current version can be obtained from https://bugs.debian.org/debbugs-source/.

Copyright © 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson, 2005-2017 Don Armstrong, and many other contributors.