in thrift/lib/cpp2/async/RocketClientChannel.cpp [115:218]
folly::Try<FirstResponsePayload> decodeResponseError(
rocket::RocketException&& ex, Handler&& handler) noexcept {
switch (ex.getErrorCode()) {
case rocket::ErrorCode::CANCELED:
case rocket::ErrorCode::INVALID:
case rocket::ErrorCode::REJECTED:
break;
default:
return folly::Try<FirstResponsePayload>(
folly::make_exception_wrapper<TApplicationException>(fmt::format(
"Unexpected error frame type: {}",
static_cast<uint32_t>(ex.getErrorCode()))));
}
ResponseRpcError responseError;
try {
rocket::unpackCompact(responseError, ex.moveErrorData().get());
} catch (...) {
return folly::Try<FirstResponsePayload>(
folly::make_exception_wrapper<TApplicationException>(fmt::format(
"Error parsing error frame: {}",
folly::exceptionStr(std::current_exception()).toStdString())));
}
folly::Optional<std::string> exCode;
TApplicationException::TApplicationExceptionType exType{
TApplicationException::UNKNOWN};
switch (responseError.code_ref().value_or(ResponseRpcErrorCode::UNKNOWN)) {
case ResponseRpcErrorCode::OVERLOAD:
exCode = kOverloadedErrorCode;
exType = TApplicationException::LOADSHEDDING;
break;
case ResponseRpcErrorCode::TASK_EXPIRED:
exCode = kTaskExpiredErrorCode;
exType = TApplicationException::TIMEOUT;
break;
case ResponseRpcErrorCode::QUEUE_OVERLOADED:
case ResponseRpcErrorCode::SHUTDOWN:
exCode = kQueueOverloadedErrorCode;
exType = TApplicationException::LOADSHEDDING;
break;
case ResponseRpcErrorCode::INJECTED_FAILURE:
exCode = kInjectedFailureErrorCode;
exType = TApplicationException::INJECTED_FAILURE;
break;
case ResponseRpcErrorCode::REQUEST_PARSING_FAILURE:
exCode = kRequestParsingErrorCode;
exType = TApplicationException::UNSUPPORTED_CLIENT_TYPE;
break;
case ResponseRpcErrorCode::QUEUE_TIMEOUT:
exCode = kServerQueueTimeoutErrorCode;
exType = TApplicationException::TIMEOUT;
break;
case ResponseRpcErrorCode::RESPONSE_TOO_BIG:
exCode = kResponseTooBigErrorCode;
exType = TApplicationException::INTERNAL_ERROR;
break;
case ResponseRpcErrorCode::WRONG_RPC_KIND:
exCode = kRequestTypeDoesntMatchServiceFunctionType;
exType = TApplicationException::UNKNOWN_METHOD;
break;
case ResponseRpcErrorCode::UNKNOWN_METHOD:
exCode = kMethodUnknownErrorCode;
exType = TApplicationException::UNKNOWN_METHOD;
break;
case ResponseRpcErrorCode::CHECKSUM_MISMATCH:
exCode = kUnknownErrorCode;
exType = TApplicationException::CHECKSUM_MISMATCH;
break;
case ResponseRpcErrorCode::INTERRUPTION:
exType = TApplicationException::INTERRUPTION;
break;
case ResponseRpcErrorCode::APP_OVERLOAD:
exCode = kAppOverloadedErrorCode;
exType = TApplicationException::LOADSHEDDING;
break;
case ResponseRpcErrorCode::UNKNOWN_INTERACTION_ID:
exCode = kInteractionIdUnknownErrorCode;
break;
case ResponseRpcErrorCode::INTERACTION_CONSTRUCTOR_ERROR:
exCode = kInteractionConstructorErrorErrorCode;
break;
case ResponseRpcErrorCode::UNIMPLEMENTED_METHOD:
exCode = kUnimplementedMethodErrorCode;
exType = TApplicationException::UNKNOWN_METHOD;
break;
default:
exCode = kUnknownErrorCode;
break;
}
ResponseRpcMetadata metadata;
if (exCode) {
metadata.otherMetadata_ref().emplace();
(*metadata.otherMetadata_ref())["ex"] = *exCode;
}
if (auto loadRef = responseError.load_ref()) {
metadata.load_ref() = *loadRef;
}
return folly::Try<FirstResponsePayload>(FirstResponsePayload(
handler.handleException(TApplicationException(
exType, responseError.what_utf8_ref().value_or(""))),
std::move(metadata)));
}