30 lines
887 B
Common Lisp
30 lines
887 B
Common Lisp
|
|
;;;; fetch-gzipped.lisp
|
||
|
|
|
||
|
|
(in-package #:quicklisp-client)
|
||
|
|
|
||
|
|
(defun gzipped-url (url)
|
||
|
|
(check-type url string)
|
||
|
|
(concatenate 'string url ".gz"))
|
||
|
|
|
||
|
|
(defun fetch-gzipped-version (url file &key quietly)
|
||
|
|
(let ((gzipped (gzipped-url url))
|
||
|
|
(gzipped-temp (merge-pathnames "gzipped.tmp" file)))
|
||
|
|
(fetch gzipped gzipped-temp :quietly quietly)
|
||
|
|
(gunzip gzipped-temp file)
|
||
|
|
(delete-file-if-exists gzipped-temp)
|
||
|
|
(probe-file file)))
|
||
|
|
|
||
|
|
(defun url-not-suitable-error-p (condition)
|
||
|
|
(<= 400 (unexpected-http-status-code condition) 499))
|
||
|
|
|
||
|
|
(defun maybe-fetch-gzipped (url file &key quietly)
|
||
|
|
(handler-case
|
||
|
|
(fetch-gzipped-version url file :quietly quietly)
|
||
|
|
(unexpected-http-status (condition)
|
||
|
|
(cond ((url-not-suitable-error-p condition)
|
||
|
|
(fetch url file :quietly quietly)
|
||
|
|
(probe-file file))
|
||
|
|
(t
|
||
|
|
(error condition))))))
|
||
|
|
|