in source/common/router/retry_state_impl.cc [188:238]
bool RetryStateImpl::wouldRetryFromHeaders(const Http::HeaderMap& response_headers) {
if (retry_on_ & RetryPolicy::RETRY_ON_5XX) {
if (Http::CodeUtility::is5xx(Http::Utility::getResponseStatus(response_headers))) {
return true;
}
}
if (retry_on_ & RetryPolicy::RETRY_ON_GATEWAY_ERROR) {
if (Http::CodeUtility::isGatewayError(Http::Utility::getResponseStatus(response_headers))) {
return true;
}
}
if ((retry_on_ & RetryPolicy::RETRY_ON_RETRIABLE_4XX)) {
Http::Code code = static_cast<Http::Code>(Http::Utility::getResponseStatus(response_headers));
if (code == Http::Code::Conflict) {
return true;
}
}
if ((retry_on_ & RetryPolicy::RETRY_ON_RETRIABLE_STATUS_CODES)) {
for (auto code : retriable_status_codes_) {
if (Http::Utility::getResponseStatus(response_headers) == code) {
return true;
}
}
}
if (retry_on_ &
(RetryPolicy::RETRY_ON_GRPC_CANCELLED | RetryPolicy::RETRY_ON_GRPC_DEADLINE_EXCEEDED |
RetryPolicy::RETRY_ON_GRPC_RESOURCE_EXHAUSTED | RetryPolicy::RETRY_ON_GRPC_UNAVAILABLE |
RetryPolicy::RETRY_ON_GRPC_INTERNAL)) {
absl::optional<Grpc::Status::GrpcStatus> status = Grpc::Common::getGrpcStatus(response_headers);
if (status) {
if ((status.value() == Grpc::Status::Canceled &&
(retry_on_ & RetryPolicy::RETRY_ON_GRPC_CANCELLED)) ||
(status.value() == Grpc::Status::DeadlineExceeded &&
(retry_on_ & RetryPolicy::RETRY_ON_GRPC_DEADLINE_EXCEEDED)) ||
(status.value() == Grpc::Status::ResourceExhausted &&
(retry_on_ & RetryPolicy::RETRY_ON_GRPC_RESOURCE_EXHAUSTED)) ||
(status.value() == Grpc::Status::Unavailable &&
(retry_on_ & RetryPolicy::RETRY_ON_GRPC_UNAVAILABLE)) ||
(status.value() == Grpc::Status::Internal &&
(retry_on_ & RetryPolicy::RETRY_ON_GRPC_INTERNAL))) {
return true;
}
}
}
return false;
}