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:
70 boost::beast::http::status::bad_request
73 case rpc::ClioError::RpcCommandIsMissing:
74 connection_->send(
"Null method", boost::beast::http::status::bad_request);
76 case rpc::ClioError::RpcCommandIsEmpty:
78 "method is empty", boost::beast::http::status::bad_request
81 case rpc::ClioError::RpcCommandNotString:
83 "method is not string", boost::beast::http::status::bad_request
86 case rpc::ClioError::RpcParamsUnparsable:
88 "params unparsable", boost::beast::http::status::bad_request
94 case rpc::ClioError::RpcUnknownOption:
95 case rpc::ClioError::RpcMalformedCurrency:
96 case rpc::ClioError::RpcMalformedRequest:
97 case rpc::ClioError::RpcMalformedOwner:
98 case rpc::ClioError::RpcMalformedAddress:
99 case rpc::ClioError::RpcFieldNotFoundTransaction:
100 case rpc::ClioError::RpcMalformedOracleDocumentId:
101 case rpc::ClioError::RpcMalformedAuthorizedCredentials:
102 case rpc::ClioError::EtlConnectionError:
103 case rpc::ClioError::EtlRequestError:
104 case rpc::ClioError::EtlRequestTimeout:
105 case rpc::ClioError::EtlInvalidResponse:
107 false,
"Unknown rpc error code {}",
static_cast<int>(*clioCode)
113 boost::json::serialize(composeError(err)),
114 boost::beast::http::status::bad_request
121 sendInternalError()
const
124 boost::json::serialize(composeError(rpc::RippledError::rpcINTERNAL)),
125 boost::beast::http::status::internal_server_error
130 sendNotReadyError()
const
133 boost::json::serialize(composeError(rpc::RippledError::rpcNOT_READY)),
134 boost::beast::http::status::ok
139 sendTooBusyError()
const
141 if (connection_->upgraded) {
143 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcTOO_BUSY)),
144 boost::beast::http::status::ok
148 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcTOO_BUSY)),
149 boost::beast::http::status::service_unavailable
155 sendJsonParsingError()
const
157 if (connection_->upgraded) {
159 boost::json::serialize(
rpc::makeError(rpc::RippledError::rpcBAD_SYNTAX))
163 fmt::format(
"Unable to parse JSON from the request"),
164 boost::beast::http::status::bad_request
170 composeError(
auto const& error)
const
175 auto const appendFieldIfExist = [&](
auto const& field) {
176 if (request_->contains(field) and not request_->at(field).is_null())
177 e[field] = request_->at(field);
180 appendFieldIfExist(JS(
id));
182 if (connection_->upgraded)
183 appendFieldIfExist(JS(api_version));
185 e[JS(request)] = request_.value();
188 if (connection_->upgraded) {
191 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:179