| 395 | } |
| 396 | |
| 397 | inline static ParentRetry_t |
| 398 | response_is_retryable(HttpTransact::State *s, HTTPStatus response_code) |
| 399 | { |
| 400 | if (!HttpTransact::is_response_valid(s, &s->hdr_info.server_response) || s->current.request_to != ResolveInfo::PARENT_PROXY) { |
| 401 | return PARENT_RETRY_NONE; |
| 402 | } |
| 403 | if (s->response_action.handled) { |
| 404 | return s->response_action.action.responseIsRetryable ? PARENT_RETRY_SIMPLE : PARENT_RETRY_NONE; |
| 405 | } |
| 406 | const url_mapping *mp = s->url_map.getMapping(); |
| 407 | if (mp && mp->strategy) { |
| 408 | return mp->strategy->responseIsRetryable(s->state_machine->sm_id, s->current, response_code); |
| 409 | } |
| 410 | |
| 411 | if (s->parent_params && !s->parent_result.response_is_retryable((ParentRetry_t)(s->parent_result.retry_type()), response_code)) { |
| 412 | return PARENT_RETRY_NONE; |
| 413 | } |
| 414 | const unsigned int s_retry_type = retry_type(s); |
| 415 | // If simple or both, check if code is simple-retryable and for retry attempts |
| 416 | if ((s_retry_type & PARENT_RETRY_SIMPLE) && s->parent_result.response_is_retryable(PARENT_RETRY_SIMPLE, response_code) && |
| 417 | s->current.simple_retry_attempts < max_retries(s, PARENT_RETRY_SIMPLE)) { |
| 418 | TxnDbg(dbg_ctl_http_trans, "saw parent retry simple first in trans"); |
| 419 | if (s->current.simple_retry_attempts < numParents(s)) { |
| 420 | return PARENT_RETRY_SIMPLE; |
| 421 | } |
| 422 | return PARENT_RETRY_NONE; |
| 423 | } |
| 424 | // If unavailable or both, check if code is unavailable-retryable AND also not simple-retryable, then unavailable retry attempts |
| 425 | if ((s_retry_type & PARENT_RETRY_UNAVAILABLE_SERVER) && |
| 426 | s->parent_result.response_is_retryable(PARENT_RETRY_UNAVAILABLE_SERVER, response_code) && |
| 427 | !s->parent_result.response_is_retryable(PARENT_RETRY_SIMPLE, response_code) && |
| 428 | s->current.unavailable_server_retry_attempts < max_retries(s, PARENT_RETRY_UNAVAILABLE_SERVER)) { |
| 429 | TxnDbg(dbg_ctl_http_trans, "saw parent retry unavailable first in trans"); |
| 430 | if (s->current.unavailable_server_retry_attempts < numParents(s)) { |
| 431 | return PARENT_RETRY_UNAVAILABLE_SERVER; |
| 432 | } |
| 433 | return PARENT_RETRY_NONE; |
| 434 | } |
| 435 | return PARENT_RETRY_NONE; |
| 436 | } |
| 437 | |
| 438 | inline static void |
| 439 | simple_or_unavailable_server_retry(HttpTransact::State *s) |
no test coverage detected