27 std::shared_ptr<web::ConnectionBase> connection_;
28 std::optional<boost::json::object> request_;
32 std::shared_ptr<web::ConnectionBase>
const& connection,
33 std::optional<boost::json::object> request = std::nullopt
35 : connection_{connection}, request_{std::move(request)}
42 if (connection_->upgraded) {
43 connection_->send(boost::json::serialize(composeError(err)));
46 if (
auto const clioCode = std::get_if<rpc::ClioError>(&err.code)) {
48 case rpc::ClioError::RpcInvalidApiVersion:
51 boost::beast::http::status::bad_request
54 case rpc::ClioError::RpcCommandIsMissing:
55 connection_->send(
"Null method", boost::beast::http::status::bad_request);
57 case rpc::ClioError::RpcCommandIsEmpty:
59 "method is empty", boost::beast::http::status::bad_request
62 case rpc::ClioError::RpcCommandNotString:
64 "method is not string", boost::beast::http::status::bad_request
67 case rpc::ClioError::RpcParamsUnparsable:
69 "params unparsable", boost::beast::http::status::bad_request
75 case rpc::ClioError::RpcUnknownOption:
76 case rpc::ClioError::RpcMalformedCurrency:
77 case rpc::ClioError::RpcMalformedRequest:
78 case rpc::ClioError::RpcMalformedOwner:
79 case rpc::ClioError::RpcMalformedAddress:
80 case rpc::ClioError::RpcFieldNotFoundTransaction:
81 case rpc::ClioError::RpcMalformedOracleDocumentId:
82 case rpc::ClioError::RpcMalformedAuthorizedCredentials:
83 case rpc::ClioError::EtlConnectionError:
84 case rpc::ClioError::EtlRequestError:
85 case rpc::ClioError::EtlRequestTimeout:
86 case rpc::ClioError::EtlInvalidResponse:
88 false,
"Unknown rpc error code {}",
static_cast<int>(*clioCode)
94 boost::json::serialize(composeError(err)),
95 boost::beast::http::status::bad_request
102 sendInternalError()
const
105 boost::json::serialize(composeError(rpc::RippledError::rpcINTERNAL)),
106 boost::beast::http::status::internal_server_error
111 sendNotReadyError()
const
114 boost::json::serialize(composeError(rpc::RippledError::rpcNOT_READY)),
115 boost::beast::http::status::ok
120 sendTooBusyError()
const
122 if (connection_->upgraded) {
124 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcTOO_BUSY)),
125 boost::beast::http::status::ok
129 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcTOO_BUSY)),
130 boost::beast::http::status::service_unavailable
136 sendJsonParsingError()
const
138 if (connection_->upgraded) {
140 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcBAD_SYNTAX))
144 fmt::format(
"Unable to parse JSON from the request"),
145 boost::beast::http::status::bad_request
151 composeError(
auto const& error)
const
156 auto const appendFieldIfExist = [&](
auto const& field) {
157 if (request_->contains(field) and not request_->at(field).is_null())
158 e[field] = request_->at(field);
161 appendFieldIfExist(JS(
id));
163 if (connection_->upgraded)
164 appendFieldIfExist(JS(api_version));
166 e[JS(request)] = request_.value();
169 if (connection_->upgraded) {
172 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:160