aboutsummaryrefslogtreecommitdiffstats
path: root/patches
diff options
context:
space:
mode:
authorGravatar Christian Hesse <mail@eworm.de>2022-09-15 13:57:27 +0200
committerGravatar Christian Hesse <mail@eworm.de>2022-09-15 15:38:47 +0200
commitac886bea59fe3e8b9b136f2a650b43dafae6a1b3 (patch)
tree35d242a1537ef464896083e93d56a8b19ed5503e /patches
parent9bebcd9c517e575a023be0d1843acc4054d1363e (diff)
downloadpacredir-ac886bea59fe3e8b9b136f2a650b43dafae6a1b3.tar.gz
pacredir-ac886bea59fe3e8b9b136f2a650b43dafae6a1b3.tar.zst
use http header 'Cache-Control: no-cache' for soft failure
This is standard header...
Diffstat (limited to 'patches')
-rw-r--r--patches/0001-support-http-header-Cache-Control-no-cache-for-soft-failure.patch58
-rw-r--r--patches/0001-support-http-header-to-indicate-an-expected-failure.patch43
2 files changed, 58 insertions, 43 deletions
diff --git a/patches/0001-support-http-header-Cache-Control-no-cache-for-soft-failure.patch b/patches/0001-support-http-header-Cache-Control-no-cache-for-soft-failure.patch
new file mode 100644
index 0000000..c81432a
--- /dev/null
+++ b/patches/0001-support-http-header-Cache-Control-no-cache-for-soft-failure.patch
@@ -0,0 +1,58 @@
+From 1288a202b61cf01fbff8a8bd0071e57383aa954e Mon Sep 17 00:00:00 2001
+From: Christian Hesse <mail@eworm.de>
+Date: Fri, 21 May 2021 09:52:34 +0200
+Subject: [PATCH 1/1] support http header 'Cache-Control: no-cache' for soft
+ failure
+
+By setting the HTTP header 'Cache-Control: no-cache' when returning with
+the status code 404 (not found) the server can indicate that this is a
+soft failure. No error message is shown, and server's error count is
+not increased.
+
+This can be used by servers that are not expected to be complete, for
+example when serving a local cache [0]. In nginx this can be achived by
+adding a single directive in location block:
+
+ add_header Cache-Control "no-cache";
+
+Also this is a perfect match for pacredir [1].
+
+[0] https://wiki.archlinux.org/title/Pacman/Tips_and_tricks#Network_shared_pacman_cache
+[1] https://git.eworm.de/cgit/pacredir/about/
+
+Signed-off-by: Christian Hesse <mail@eworm.de>
+---
+ lib/libalpm/dload.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
+index 4fa17b35..23034584 100644
+--- a/lib/libalpm/dload.c
++++ b/lib/libalpm/dload.c
+@@ -274,8 +274,10 @@ static size_t dload_parseheader_cb(void *ptr, size_t size, size_t nmemb, void *u
+ {
+ size_t realsize = size * nmemb;
+ const char *fptr, *endptr = NULL;
++ const char * const cc_header = "Cache-Control:";
+ const char * const cd_header = "Content-Disposition:";
+ const char * const fn_key = "filename=";
++ const char * const nc_key = "no-cache";
+ struct dload_payload *payload = (struct dload_payload *)user;
+ long respcode;
+
+@@ -302,6 +304,15 @@ static size_t dload_parseheader_cb(void *ptr, size_t size, size_t nmemb, void *u
+ }
+ }
+
++ /* By setting the HTTP header 'Cache-Control: no-cache' the server can indicate
++ that this is a soft failure which should not be cached. No error message is
++ shown, and server's error count is not increased. */
++ if(_alpm_raw_ncmp(cc_header, ptr, strlen(cc_header)) == 0) {
++ if(strstr(ptr, nc_key)) {
++ payload->errors_ok = 1;
++ }
++ }
++
+ curl_easy_getinfo(payload->curl, CURLINFO_RESPONSE_CODE, &respcode);
+ if(payload->respcode != respcode) {
+ payload->respcode = respcode;
diff --git a/patches/0001-support-http-header-to-indicate-an-expected-failure.patch b/patches/0001-support-http-header-to-indicate-an-expected-failure.patch
deleted file mode 100644
index 6bc977a..0000000
--- a/patches/0001-support-http-header-to-indicate-an-expected-failure.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-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;