git: bf599c03f09d - main - fetch(1): do not consider HTTP 5XX errors as soft failures
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 24 Jan 2022 07:38:35 UTC
The branch main has been updated by eugen:
URL: https://cgit.FreeBSD.org/src/commit/?id=bf599c03f09dea0f7e188e002b42d782af6841c3
commit bf599c03f09dea0f7e188e002b42d782af6841c3
Author: Eugene Grosbein <eugen@FreeBSD.org>
AuthorDate: 2022-01-24 07:35:49 +0000
Commit: Eugene Grosbein <eugen@FreeBSD.org>
CommitDate: 2022-01-24 07:38:26 +0000
fetch(1): do not consider HTTP 5XX errors as soft failures
This change fixes "fetch -a" looping forever on "502 Bad gateway"
error and similar.
MFC after: 1 month
---
usr.bin/fetch/fetch.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/usr.bin/fetch/fetch.c b/usr.bin/fetch/fetch.c
index 3e24707d6021..55209538e49b 100644
--- a/usr.bin/fetch/fetch.c
+++ b/usr.bin/fetch/fetch.c
@@ -425,7 +425,7 @@ query_auth(struct url *URL)
* Fetch a file
*/
static int
-fetch(char *URL, const char *path)
+fetch(char *URL, const char *path, int *is_http)
{
struct url *url;
struct url_stat us;
@@ -475,6 +475,9 @@ fetch(char *URL, const char *path)
strcpy(url->scheme, SCHEME_HTTP);
}
+ /* for both of http and https */
+ *is_http = strncmp(url->scheme, SCHEME_HTTP, sizeof(SCHEME_HTTP)) == 0;
+
/* common flags */
switch (family) {
case PF_INET:
@@ -911,7 +914,7 @@ main(int argc, char *argv[])
struct sigaction sa;
const char *p, *s;
char *end, *q;
- int c, e, r;
+ int c, e, is_http, r;
while ((c = getopt_long(argc, argv,
@@ -1176,16 +1179,16 @@ main(int argc, char *argv[])
if (o_flag) {
if (o_stdout) {
- e = fetch(*argv, "-");
+ e = fetch(*argv, "-", &is_http);
} else if (o_directory) {
asprintf(&q, "%s/%s", o_filename, p);
- e = fetch(*argv, q);
+ e = fetch(*argv, q, &is_http);
free(q);
} else {
- e = fetch(*argv, o_filename);
+ e = fetch(*argv, o_filename, &is_http);
}
} else {
- e = fetch(*argv, p);
+ e = fetch(*argv, p, &is_http);
}
if (sigint)
@@ -1201,7 +1204,13 @@ main(int argc, char *argv[])
&& fetchLastErrCode != FETCH_MOVED
&& fetchLastErrCode != FETCH_URL
&& fetchLastErrCode != FETCH_RESOLV
- && fetchLastErrCode != FETCH_UNKNOWN)) {
+ && fetchLastErrCode != FETCH_UNKNOWN
+ && (is_http
+ && fetchLastErrCode != FETCH_PROTO
+ && fetchLastErrCode != FETCH_SERVER
+ && fetchLastErrCode != FETCH_TEMP
+ && fetchLastErrCode != FETCH_TIMEOUT
+ ))) {
if (w_secs && v_level)
fprintf(stderr, "Waiting %ld seconds "
"before retrying\n", w_secs);