From: Christian Hesse <mail(a)eworm.de>
A server can indicate a soft failure by returning 412 (Precondition
Failed). Only a warning (instead of error) message is logged and
download is retried with next server, without counting server error.
This http code can be used by servers that are not expected to be
complete, for example when serving a local cache.
Signed-off-by: Christian Hesse <mail(a)eworm.de>
---
lib/libalpm/dload.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index f6a4f012..7116cb03 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -515,13 +515,23 @@ static int curl_check_finished_download(CURLM *curlm, CURLMsg *msg,
if(!payload->errors_ok) {
handle->pm_errno = ALPM_ERR_RETRIEVE;
- /* non-translated message is same as libcurl */
- snprintf(payload->error_buffer, sizeof(payload->error_buffer),
+ if(payload->respcode == 412) {
+ /* A server can indicate a soft failure by returning 412
+ (Precondition Failed). Only a debug message is logged and
+ download is retried with next server, without counting
+ server error. */
+ _alpm_log(handle, ALPM_LOG_WARNING,
+ _("file '%s' is currently not available from %s\n"),
+ payload->remote_name, hostname);
+ } else {
+ /* non-translated message is same as libcurl */
+ snprintf(payload->error_buffer, sizeof(payload->error_buffer),
"The requested URL returned error: %ld", payload->respcode);
- _alpm_log(handle, ALPM_LOG_ERROR,
+ _alpm_log(handle, ALPM_LOG_ERROR,
_("failed retrieving file '%s' from %s : %s\n"),
payload->remote_name, hostname, payload->error_buffer);
- server_soft_error(handle, payload->fileurl);
+ server_soft_error(handle, payload->fileurl);
+ }
}
if(curl_retry_next_server(curlm, curl, payload) == 0) {
(*active_downloads_num)++;