dirmngr: Retry another server from the pool on 502, 503, 504.

* dirmngr/ks-engine-hkp.c (handle_send_request_error): Add arg
http_status and handle it.
(ks_hkp_search): Get http_status froms end_request and pass on to
handle_send_request_error.
(ks_hkp_get): Ditto.
(ks_hkp_put): Ditto.
--

GnuPG-bug-id: 4175
Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
Werner Koch 2018-12-11 13:39:41 +01:00
parent dc61f4ecea
commit 05ef628278
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
1 changed files with 33 additions and 7 deletions

View File

@ -1352,7 +1352,7 @@ send_request (ctrl_t ctrl, const char *request, const char *hostportstr,
down to zero. */ down to zero. */
static int static int
handle_send_request_error (ctrl_t ctrl, gpg_error_t err, const char *request, handle_send_request_error (ctrl_t ctrl, gpg_error_t err, const char *request,
unsigned int *tries_left) unsigned int http_status, unsigned int *tries_left)
{ {
int retry = 0; int retry = 0;
@ -1395,6 +1395,27 @@ handle_send_request_error (ctrl_t ctrl, gpg_error_t err, const char *request,
} }
break; break;
case GPG_ERR_NO_DATA:
{
switch (http_status)
{
case 502: /* Bad Gateway */
log_info ("marking host dead due to a %u (%s)\n",
http_status, http_status2string (http_status));
if (mark_host_dead (request) && *tries_left)
retry = 1;
break;
case 503: /* Service Unavailable */
case 504: /* Gateway Timeout */
log_info ("selecting a different host due to a %u (%s)",
http_status, http_status2string (http_status));
retry = 1;
break;
}
}
break;
default: default:
break; break;
} }
@ -1423,6 +1444,7 @@ ks_hkp_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
int reselect; int reselect;
unsigned int httpflags; unsigned int httpflags;
char *httphost = NULL; char *httphost = NULL;
unsigned int http_status;
unsigned int tries = SEND_REQUEST_RETRIES; unsigned int tries = SEND_REQUEST_RETRIES;
*r_fp = NULL; *r_fp = NULL;
@ -1504,12 +1526,14 @@ ks_hkp_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
/* Send the request. */ /* Send the request. */
err = send_request (ctrl, request, hostport, httphost, httpflags, err = send_request (ctrl, request, hostport, httphost, httpflags,
NULL, NULL, &fp, r_http_status); NULL, NULL, &fp, &http_status);
if (handle_send_request_error (ctrl, err, request, &tries)) if (handle_send_request_error (ctrl, err, request, http_status, &tries))
{ {
reselect = 1; reselect = 1;
goto again; goto again;
} }
if (r_http_status)
*r_http_status = http_status;
if (err) if (err)
{ {
if (gpg_err_code (err) == GPG_ERR_NO_DATA) if (gpg_err_code (err) == GPG_ERR_NO_DATA)
@ -1571,6 +1595,7 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
int reselect; int reselect;
char *httphost = NULL; char *httphost = NULL;
unsigned int httpflags; unsigned int httpflags;
unsigned int http_status;
unsigned int tries = SEND_REQUEST_RETRIES; unsigned int tries = SEND_REQUEST_RETRIES;
*r_fp = NULL; *r_fp = NULL;
@ -1643,8 +1668,8 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp)
/* Send the request. */ /* Send the request. */
err = send_request (ctrl, request, hostport, httphost, httpflags, err = send_request (ctrl, request, hostport, httphost, httpflags,
NULL, NULL, &fp, NULL); NULL, NULL, &fp, &http_status);
if (handle_send_request_error (ctrl, err, request, &tries)) if (handle_send_request_error (ctrl, err, request, http_status, &tries))
{ {
reselect = 1; reselect = 1;
goto again; goto again;
@ -1718,6 +1743,7 @@ ks_hkp_put (ctrl_t ctrl, parsed_uri_t uri, const void *data, size_t datalen)
int reselect; int reselect;
char *httphost = NULL; char *httphost = NULL;
unsigned int httpflags; unsigned int httpflags;
unsigned int http_status;
unsigned int tries = SEND_REQUEST_RETRIES; unsigned int tries = SEND_REQUEST_RETRIES;
parm.datastring = NULL; parm.datastring = NULL;
@ -1756,8 +1782,8 @@ ks_hkp_put (ctrl_t ctrl, parsed_uri_t uri, const void *data, size_t datalen)
/* Send the request. */ /* Send the request. */
err = send_request (ctrl, request, hostport, httphost, 0, err = send_request (ctrl, request, hostport, httphost, 0,
put_post_cb, &parm, &fp, NULL); put_post_cb, &parm, &fp, &http_status);
if (handle_send_request_error (ctrl, err, request, &tries)) if (handle_send_request_error (ctrl, err, request, http_status, &tries))
{ {
reselect = 1; reselect = 1;
goto again; goto again;