aboutsummaryrefslogtreecommitdiffstats
path: root/patches/0001-support-http-header-to-indicate-an-expected-failure.patch
blob: 6bc977a9e68df138785a8c41b7924196fdbb8db1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
From b50863ad56c3c972e4bfbc9108523fee267d63fa Mon Sep 17 00:00:00 2001
From: Christian Hesse <mail@eworm.de>
Date: Fri, 21 May 2021 09:52:34 +0200
Subject: [PATCH] support http header to indicate an expected failure

By setting an extra HTTP header 'X-Pacman-Expected-Failure' the server can
indicate that the failure is expected. The next server is tried without
error message and without increasing the server's error count.

This 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@eworm.de>
---
 lib/libalpm/dload.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 7c27c3ea..d39125ca 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -277,6 +277,7 @@ static size_t dload_parseheader_cb(void *ptr, size_t size, size_t nmemb, void *u
 	const char *fptr, *endptr = NULL;
 	const char * const cd_header = "Content-Disposition:";
 	const char * const fn_key = "filename=";
+	const char * const xpef_header = "X-Pacman-Expected-Failure:";
 	struct dload_payload *payload = (struct dload_payload *)user;
 	long respcode;
 
@@ -303,6 +304,13 @@ static size_t dload_parseheader_cb(void *ptr, size_t size, size_t nmemb, void *u
 		}
 	}
 
+	/* By setting an extra HTTP header 'X-Pacman-Expected-Failure' the server can
+	   indicate that the failure is expected. The next server is tried without
+	   error message and without increasing the server's error count. */
+	if(_alpm_raw_ncmp(xpef_header, ptr, strlen(xpef_header)) == 0) {
+		payload->errors_ok = 1;
+	}
+
 	curl_easy_getinfo(payload->curl, CURLINFO_RESPONSE_CODE, &respcode);
 	if(payload->respcode != respcode) {
 		payload->respcode = respcode;