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::RpcParamsUnparseable:
82 connection_->send(
"params unparseable", 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::EtlConnectionError:
95 case rpc::ClioError::EtlRequestError:
96 case rpc::ClioError::EtlRequestTimeout:
97 case rpc::ClioError::EtlInvalidResponse:
99 false,
"Unknown rpc error code {}",
static_cast<int>(*clioCode)
104 connection_->send(boost::json::serialize(composeError(err)), boost::beast::http::status::bad_request);
110 sendInternalError()
const
113 boost::json::serialize(composeError(rpc::RippledError::rpcINTERNAL)),
114 boost::beast::http::status::internal_server_error
119 sendNotReadyError()
const
122 boost::json::serialize(composeError(rpc::RippledError::rpcNOT_READY)), boost::beast::http::status::ok
127 sendTooBusyError()
const
129 if (connection_->upgraded) {
131 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcTOO_BUSY)), boost::beast::http::status::ok
135 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcTOO_BUSY)),
136 boost::beast::http::status::service_unavailable
142 sendJsonParsingError()
const
144 if (connection_->upgraded) {
145 connection_->send(boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcBAD_SYNTAX)));
148 fmt::format(
"Unable to parse JSON from the request"), boost::beast::http::status::bad_request
154 composeError(
auto const& error)
const
159 auto const appendFieldIfExist = [&](
auto const& field) {
160 if (request_->contains(field) and not request_->at(field).is_null())
161 e[field] = request_->at(field);
164 appendFieldIfExist(JS(
id));
166 if (connection_->upgraded)
167 appendFieldIfExist(JS(api_version));
169 e[JS(request)] = request_.value();
172 if (connection_->upgraded) {
175 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