diff options
author | Ludovic Courtès <ludo@gnu.org> | 2021-03-19 14:23:57 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2021-03-19 21:44:36 +0100 |
commit | 43937666ba6975b6c847be8e67cecd781ce27049 (patch) | |
tree | 4ed56dce6d36c68b317a515c06cf877635459a03 /guix/build | |
parent | 1ab03fb74505458e7754dce338a5da29dc754d80 (diff) |
download: 'tls-wrap' treats premature TLS termination as EOF.
This is a backport of Guile commit
076276c4f580368b4106316a77752d69c8f1494a.
* guix/build/download.scm (tls-wrap)[read!]: Wrap 'get-bytevector-n!'
call in 'catch' and handle 'error/premature-termination' GnuTLS errors.
Diffstat (limited to 'guix/build')
-rw-r--r-- | guix/build/download.scm | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/guix/build/download.scm b/guix/build/download.scm index f24a1e20df..a22d4064ca 100644 --- a/guix/build/download.scm +++ b/guix/build/download.scm @@ -305,10 +305,22 @@ host name without trailing dot." (let ((record (session-record-port session))) (define (read! bv start count) - (let ((read (get-bytevector-n! record bv start count))) - (if (eof-object? read) - 0 - read))) + (define read + (catch 'gnutls-error + (lambda () + (get-bytevector-n! record bv start count)) + (lambda (key err proc . rest) + ;; When responding to "Connection: close" requests, some + ;; servers close the connection abruptly after sending the + ;; response body, without doing a proper TLS connection + ;; termination. Treat it as EOF. + (if (eq? err error/premature-termination) + the-eof-object + (apply throw key err proc rest))))) + + (if (eof-object? read) + 0 + read)) (define (write! bv start count) (put-bytevector record bv start count) (force-output record) |