46 std::shared_ptr<web::ConnectionBase> connection_;
47 std::optional<boost::json::object> request_;
51 std::shared_ptr<web::ConnectionBase>
const& connection,
52 std::optional<boost::json::object> request = std::nullopt
54 : connection_{connection}, request_{std::move(request)}
61 if (connection_->upgraded) {
62 connection_->send(boost::json::serialize(composeError(err)));
65 if (
auto const clioCode = std::get_if<rpc::ClioError>(&err.code)) {
67 case rpc::ClioError::RpcInvalidApiVersion:
69 std::string{
rpc::getErrorInfo(*clioCode).error}, boost::beast::http::status::bad_request
72 case rpc::ClioError::RpcCommandIsMissing:
73 connection_->send(
"Null method", boost::beast::http::status::bad_request);
75 case rpc::ClioError::RpcCommandIsEmpty:
76 connection_->send(
"method is empty", boost::beast::http::status::bad_request);
78 case rpc::ClioError::RpcCommandNotString:
79 connection_->send(
"method is not string", boost::beast::http::status::bad_request);
81 case rpc::ClioError::RpcParamsUnparsable:
82 connection_->send(
"params unparsable", boost::beast::http::status::bad_request);
86 case rpc::ClioError::RpcUnknownOption:
87 case rpc::ClioError::RpcMalformedCurrency:
88 case rpc::ClioError::RpcMalformedRequest:
89 case rpc::ClioError::RpcMalformedOwner:
90 case rpc::ClioError::RpcMalformedAddress:
91 case rpc::ClioError::RpcFieldNotFoundTransaction:
92 case rpc::ClioError::RpcMalformedOracleDocumentId:
93 case rpc::ClioError::RpcMalformedAuthorizedCredentials:
94 case rpc::ClioError::RpcEntryNotFound:
95 case rpc::ClioError::EtlConnectionError:
96 case rpc::ClioError::EtlRequestError:
97 case rpc::ClioError::EtlRequestTimeout:
98 case rpc::ClioError::EtlInvalidResponse:
100 false,
"Unknown rpc error code {}",
static_cast<int>(*clioCode)
105 connection_->send(boost::json::serialize(composeError(err)), boost::beast::http::status::bad_request);
111 sendInternalError()
const
114 boost::json::serialize(composeError(rpc::RippledError::rpcINTERNAL)),
115 boost::beast::http::status::internal_server_error
120 sendNotReadyError()
const
123 boost::json::serialize(composeError(rpc::RippledError::rpcNOT_READY)), boost::beast::http::status::ok
128 sendTooBusyError()
const
130 if (connection_->upgraded) {
132 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcTOO_BUSY)), boost::beast::http::status::ok
136 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcTOO_BUSY)),
137 boost::beast::http::status::service_unavailable
143 sendJsonParsingError()
const
145 if (connection_->upgraded) {
146 connection_->send(boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcBAD_SYNTAX)));
149 fmt::format(
"Unable to parse JSON from the request"), boost::beast::http::status::bad_request
155 composeError(
auto const& error)
const
160 auto const appendFieldIfExist = [&](
auto const& field) {
161 if (request_->contains(field) and not request_->at(field).is_null())
162 e[field] = request_->at(field);
165 appendFieldIfExist(JS(
id));
167 if (connection_->upgraded)
168 appendFieldIfExist(JS(api_version));
170 e[JS(request)] = request_.value();
173 if (connection_->upgraded) {
176 return {{JS(result), e}};
boost::json::object makeError(RippledError err, std::optional< std::string_view > customError, std::optional< std::string_view > customMessage)
Generate JSON from a rpc::RippledError.
Definition Errors.cpp:120