Files
scylladb/utils/http_client_error_processing.cc
Ernest Zaslavsky 7fd62f042e http: extract error classification code
move http client related error classification code to a common location for future reuse
2026-02-09 08:48:41 +02:00

67 lines
2.6 KiB
C++

/*
* Copyright (C) 2026-present ScyllaDB
*/
/*
* SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
*/
#include "http_client_error_processing.hh"
#include <seastar/http/exception.hh>
#include <gnutls/gnutls.h>
namespace utils::http {
retryable from_http_code(seastar::http::reply::status_type http_code) {
switch (http_code) {
case seastar::http::reply::status_type::unauthorized:
case seastar::http::reply::status_type::forbidden:
case seastar::http::reply::status_type::not_found:
return retryable::no;
case seastar::http::reply::status_type::too_many_requests:
case seastar::http::reply::status_type::internal_server_error:
case seastar::http::reply::status_type::bandwidth_limit_exceeded:
case seastar::http::reply::status_type::service_unavailable:
case seastar::http::reply::status_type::request_timeout:
case seastar::http::reply::status_type::page_expired:
case seastar::http::reply::status_type::login_timeout:
case seastar::http::reply::status_type::gateway_timeout:
case seastar::http::reply::status_type::network_connect_timeout:
case seastar::http::reply::status_type::network_read_timeout:
return retryable::yes;
default:
return retryable{seastar::http::reply::classify_status(http_code) == seastar::http::reply::status_class::server_error};
}
}
retryable from_system_error(const std::system_error& system_error) {
switch (system_error.code().value()) {
case static_cast<int>(std::errc::interrupted):
case static_cast<int>(std::errc::resource_unavailable_try_again):
case static_cast<int>(std::errc::timed_out):
case static_cast<int>(std::errc::connection_aborted):
case static_cast<int>(std::errc::connection_reset):
case static_cast<int>(std::errc::connection_refused):
case static_cast<int>(std::errc::broken_pipe):
case static_cast<int>(std::errc::network_unreachable):
case static_cast<int>(std::errc::host_unreachable):
case static_cast<int>(std::errc::network_down):
case static_cast<int>(std::errc::network_reset):
case static_cast<int>(std::errc::no_buffer_space):
// GNU TLS section. Since we pack gnutls error codes in std::system_error and rethrow it as std::nested_exception we have to handle them here.
case GNUTLS_E_PREMATURE_TERMINATION:
case GNUTLS_E_AGAIN:
case GNUTLS_E_INTERRUPTED:
case GNUTLS_E_PUSH_ERROR:
case GNUTLS_E_PULL_ERROR:
case GNUTLS_E_TIMEDOUT:
case GNUTLS_E_SESSION_EOF:
case GNUTLS_E_BAD_COOKIE: // as per RFC6347 section-4.2.1 client should retry
return retryable::yes;
default:
return retryable::no;
}
}
} // namespace utils::http