mirror of
git://git.gnupg.org/gnupg.git
synced 2025-03-21 21:39:58 +01:00
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> (cherry picked from commit 05ef6282784495a77f4faf76c0de5bc85dfecf06)
This commit is contained in:
parent
b9d71ea64a
commit
e5abdb6da7
@ -1310,7 +1310,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;
|
||||||
|
|
||||||
@ -1353,6 +1353,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;
|
||||||
}
|
}
|
||||||
@ -1381,6 +1402,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;
|
||||||
@ -1462,12 +1484,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)
|
||||||
@ -1529,6 +1553,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;
|
||||||
@ -1601,8 +1626,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;
|
||||||
@ -1676,6 +1701,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;
|
||||||
@ -1714,8 +1740,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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user