rippled
Loading...
Searching...
No Matches
ErrorCodes.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2012 - 2019 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#include <xrpl/beast/utility/instrumentation.h>
21#include <xrpl/protocol/ErrorCodes.h>
22#include <array>
23#include <stdexcept>
24
25namespace ripple {
26namespace RPC {
27
28namespace detail {
29
30// Unordered array of ErrorInfos, so we don't have to maintain the list
31// ordering by hand.
32//
33// This array will be omitted from the object file; only the sorted version
34// will remain in the object file. But the string literals will remain.
35//
36// There's a certain amount of tension in determining the correct HTTP
37// status to associate with a given RPC error. Initially all RPC errors
38// returned 200 (OK). And that's the default behavior if no HTTP status code
39// is specified below.
40//
41// The codes currently selected target the load balancer fail-over use case.
42// If a query fails on one node but is likely to have a positive outcome
43// on a different node, then the failure should return a 4xx/5xx range
44// status code.
45
46// clang-format off
47constexpr static ErrorInfo unorderedErrorInfos[]{
48 {rpcACT_MALFORMED, "actMalformed", "Account malformed."},
49 {rpcACT_NOT_FOUND, "actNotFound", "Account not found."},
50 {rpcALREADY_MULTISIG, "alreadyMultisig", "Already multisigned."},
51 {rpcALREADY_SINGLE_SIG, "alreadySingleSig", "Already single-signed."},
52 {rpcAMENDMENT_BLOCKED, "amendmentBlocked", "Amendment blocked, need upgrade.", 503},
53 {rpcEXPIRED_VALIDATOR_LIST, "unlBlocked", "Validator list expired.", 503},
54 {rpcATX_DEPRECATED, "deprecated", "Use the new API or specify a ledger range.", 400},
55 {rpcBAD_KEY_TYPE, "badKeyType", "Bad key type.", 400},
56 {rpcBAD_FEATURE, "badFeature", "Feature unknown or invalid.", 500},
57 {rpcBAD_ISSUER, "badIssuer", "Issuer account malformed.", 400},
58 {rpcBAD_MARKET, "badMarket", "No such market.", 404},
59 {rpcBAD_SECRET, "badSecret", "Secret does not match account.", 403},
60 {rpcBAD_SEED, "badSeed", "Disallowed seed.", 403},
61 {rpcBAD_SYNTAX, "badSyntax", "Syntax error.", 400},
62 {rpcCHANNEL_MALFORMED, "channelMalformed", "Payment channel is malformed.", 400},
63 {rpcCHANNEL_AMT_MALFORMED, "channelAmtMalformed", "Payment channel amount is malformed.", 400},
64 {rpcCOMMAND_MISSING, "commandMissing", "Missing command entry.", 400},
65 {rpcDB_DESERIALIZATION, "dbDeserialization", "Database deserialization error.", 502},
66 {rpcDST_ACT_MALFORMED, "dstActMalformed", "Destination account is malformed.", 400},
67 {rpcDST_ACT_MISSING, "dstActMissing", "Destination account not provided.", 400},
68 {rpcDST_ACT_NOT_FOUND, "dstActNotFound", "Destination account not found.", 404},
69 {rpcDST_AMT_MALFORMED, "dstAmtMalformed", "Destination amount/currency/issuer is malformed.", 400},
70 {rpcDST_AMT_MISSING, "dstAmtMissing", "Destination amount/currency/issuer is missing.", 400},
71 {rpcDST_ISR_MALFORMED, "dstIsrMalformed", "Destination issuer is malformed.", 400},
72 {rpcEXCESSIVE_LGR_RANGE, "excessiveLgrRange", "Ledger range exceeds 1000.", 400},
73 {rpcFORBIDDEN, "forbidden", "Bad credentials.", 403},
74 {rpcHIGH_FEE, "highFee", "Current transaction fee exceeds your limit.", 402},
75 {rpcINTERNAL, "internal", "Internal error.", 500},
76 {rpcINVALID_LGR_RANGE, "invalidLgrRange", "Ledger range is invalid.", 400},
77 {rpcINVALID_PARAMS, "invalidParams", "Invalid parameters.", 400},
78 {rpcINVALID_HOTWALLET, "invalidHotWallet", "Invalid hotwallet.", 400},
79 {rpcISSUE_MALFORMED, "issueMalformed", "Issue is malformed.", 400},
80 {rpcJSON_RPC, "json_rpc", "JSON-RPC transport error.", 500},
81 {rpcLGR_IDXS_INVALID, "lgrIdxsInvalid", "Ledger indexes invalid.", 400},
82 {rpcLGR_IDX_MALFORMED, "lgrIdxMalformed", "Ledger index malformed.", 400},
83 {rpcLGR_NOT_FOUND, "lgrNotFound", "Ledger not found.", 404},
84 {rpcLGR_NOT_VALIDATED, "lgrNotValidated", "Ledger not validated.", 202},
85 {rpcMASTER_DISABLED, "masterDisabled", "Master key is disabled.", 403},
86 {rpcNOT_ENABLED, "notEnabled", "Not enabled in configuration.", 501},
87 {rpcNOT_IMPL, "notImpl", "Not implemented.", 501},
88 {rpcNOT_READY, "notReady", "Not ready to handle this request.", 503},
89 {rpcNOT_SUPPORTED, "notSupported", "Operation not supported.", 501},
90 {rpcNO_CLOSED, "noClosed", "Closed ledger is unavailable.", 503},
91 {rpcNO_CURRENT, "noCurrent", "Current ledger is unavailable.", 503},
92 {rpcNOT_SYNCED, "notSynced", "Not synced to the network.", 503},
93 {rpcNO_EVENTS, "noEvents", "Current transport does not support events.", 405},
94 {rpcNO_NETWORK, "noNetwork", "Not synced to the network.", 503},
95 {rpcNO_PERMISSION, "noPermission", "You don't have permission for this command.", 401},
96 {rpcNO_PF_REQUEST, "noPathRequest", "No pathfinding request in progress.", 404},
97 {rpcOBJECT_NOT_FOUND, "objectNotFound", "The requested object was not found.", 404},
98 {rpcPUBLIC_MALFORMED, "publicMalformed", "Public key is malformed.", 400},
99 {rpcSENDMAX_MALFORMED, "sendMaxMalformed", "SendMax amount malformed.", 400},
100 {rpcSIGNING_MALFORMED, "signingMalformed", "Signing of transaction is malformed.", 400},
101 {rpcSLOW_DOWN, "slowDown", "You are placing too much load on the server.", 429},
102 {rpcSRC_ACT_MALFORMED, "srcActMalformed", "Source account is malformed.", 400},
103 {rpcSRC_ACT_MISSING, "srcActMissing", "Source account not provided.", 400},
104 {rpcSRC_ACT_NOT_FOUND, "srcActNotFound", "Source account not found.", 404},
105 {rpcSRC_CUR_MALFORMED, "srcCurMalformed", "Source currency is malformed.", 400},
106 {rpcSRC_ISR_MALFORMED, "srcIsrMalformed", "Source issuer is malformed.", 400},
107 {rpcSTREAM_MALFORMED, "malformedStream", "Stream malformed.", 400},
108 {rpcTOO_BUSY, "tooBusy", "The server is too busy to help you now.", 503},
109 {rpcTXN_NOT_FOUND, "txnNotFound", "Transaction not found.", 404},
110 {rpcUNKNOWN_COMMAND, "unknownCmd", "Unknown method.", 405},
111 {rpcORACLE_MALFORMED, "oracleMalformed", "Oracle request is malformed.", 400},
112 {rpcBAD_CREDENTIALS, "badCredentials", "Credentials do not exist, are not accepted, or have expired.", 400},
113 {rpcTX_SIGNED, "transactionSigned", "Transaction should not be signed.", 400}};
114// clang-format on
115
116// Sort and validate unorderedErrorInfos at compile time. Should be
117// converted to consteval when get to C++20.
118template <int M, int N>
119constexpr auto
121{
123
124 for (ErrorInfo const& info : unordered)
125 {
126 if (info.code <= rpcSUCCESS || info.code > rpcLAST)
127 throw(std::out_of_range("Invalid error_code_i"));
128
129 // The first valid code follows rpcSUCCESS immediately.
130 static_assert(rpcSUCCESS == 0, "Unexpected error_code_i layout.");
131 int const index{info.code - 1};
132
133 if (ret[index].code != rpcUNKNOWN)
134 throw(std::invalid_argument("Duplicate error_code_i in list"));
135
136 ret[index] = info;
137 }
138
139 // Verify that all entries are filled in starting with 1 and proceeding
140 // to rpcLAST.
141 //
142 // It's okay for there to be missing entries; they will contain the code
143 // rpcUNKNOWN. But other than that all entries should match their index.
144 int codeCount{0};
145 int expect{rpcBAD_SYNTAX - 1};
146 for (ErrorInfo const& info : ret)
147 {
148 ++expect;
149 if (info.code == rpcUNKNOWN)
150 continue;
151
152 if (info.code != expect)
153 throw(std::invalid_argument("Empty error_code_i in list"));
154 ++codeCount;
155 }
156 if (expect != rpcLAST)
157 throw(std::invalid_argument("Insufficient list entries"));
158 if (codeCount != N)
159 throw(std::invalid_argument("Bad handling of unorderedErrorInfos"));
160
161 return ret;
162}
163
164constexpr auto sortedErrorInfos{sortErrorInfos<rpcLAST>(unorderedErrorInfos)};
165
167
168} // namespace detail
169
170//------------------------------------------------------------------------------
171
172ErrorInfo const&
174{
175 if (code <= rpcSUCCESS || code > rpcLAST)
177 return detail::sortedErrorInfos[code - 1];
178}
179
182{
183 Json::Value json;
184 inject_error(code, json);
185 return json;
186}
187
190{
191 Json::Value json;
192 inject_error(code, message, json);
193 return json;
194}
195
196bool
198{
199 if (json.isObject() && json.isMember(jss::error))
200 return true;
201 return false;
202}
203
204int
206{
207 return get_error_info(code).http_status;
208}
209
210} // namespace RPC
211
214{
215 XRPL_ASSERT(
217 "ripple::RPC::rpcErrorString : input contains an error");
218 return jv[jss::error].asString() + jv[jss::error_message].asString();
219}
220
221} // namespace ripple
Represents a JSON value.
Definition: json_value.h:147
bool isObject() const
std::string asString() const
Returns the unquoted string value.
Definition: json_value.cpp:469
bool isMember(const char *key) const
Return true if the object has a member named key.
Definition: json_value.cpp:943
constexpr auto sortedErrorInfos
Definition: ErrorCodes.cpp:164
constexpr ErrorInfo unknownError
Definition: ErrorCodes.cpp:166
constexpr auto sortErrorInfos(ErrorInfo const (&unordered)[N]) -> std::array< ErrorInfo, M >
Definition: ErrorCodes.cpp:120
static constexpr ErrorInfo unorderedErrorInfos[]
Definition: ErrorCodes.cpp:47
bool contains_error(Json::Value const &json)
Returns true if the json contains an rpc error specification.
Definition: ErrorCodes.cpp:197
Json::Value make_error(error_code_i code)
Returns a new json object that reflects the error code.
Definition: ErrorCodes.cpp:181
void inject_error(error_code_i code, JsonValue &json)
Add or update the json update to reflect the error code.
Definition: ErrorCodes.h:223
int error_code_http_status(error_code_i code)
Returns http status that corresponds to the error code.
Definition: ErrorCodes.cpp:205
ErrorInfo const & get_error_info(error_code_i code)
Returns an ErrorInfo that reflects the error code.
Definition: ErrorCodes.cpp:173
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
std::string rpcErrorString(Json::Value const &jv)
Returns a single string with the contents of an RPC error.
Definition: ErrorCodes.cpp:213
error_code_i
Definition: ErrorCodes.h:40
@ rpcNO_EVENTS
Definition: ErrorCodes.h:54
@ rpcACT_NOT_FOUND
Definition: ErrorCodes.h:70
@ rpcDST_ACT_MISSING
Definition: ErrorCodes.h:104
@ rpcBAD_ISSUER
Definition: ErrorCodes.h:96
@ rpcNOT_SUPPORTED
Definition: ErrorCodes.h:132
@ rpcALREADY_SINGLE_SIG
Definition: ErrorCodes.h:92
@ rpcLAST
Definition: ErrorCodes.h:157
@ rpcNO_NETWORK
Definition: ErrorCodes.h:66
@ rpcISSUE_MALFORMED
Definition: ErrorCodes.h:146
@ rpcEXCESSIVE_LGR_RANGE
Definition: ErrorCodes.h:135
@ rpcATX_DEPRECATED
Definition: ErrorCodes.h:127
@ rpcORACLE_MALFORMED
Definition: ErrorCodes.h:149
@ rpcAMENDMENT_BLOCKED
Definition: ErrorCodes.h:61
@ rpcINVALID_LGR_RANGE
Definition: ErrorCodes.h:136
@ rpcUNKNOWN_COMMAND
Definition: ErrorCodes.h:85
@ rpcTXN_NOT_FOUND
Definition: ErrorCodes.h:80
@ rpcLGR_NOT_VALIDATED
Definition: ErrorCodes.h:73
@ rpcTOO_BUSY
Definition: ErrorCodes.h:56
@ rpcSRC_ACT_NOT_FOUND
Definition: ErrorCodes.h:122
@ rpcTX_SIGNED
Definition: ErrorCodes.h:155
@ rpcACT_MALFORMED
Definition: ErrorCodes.h:90
@ rpcSLOW_DOWN
Definition: ErrorCodes.h:57
@ rpcMASTER_DISABLED
Definition: ErrorCodes.h:74
@ rpcBAD_FEATURE
Definition: ErrorCodes.h:95
@ rpcBAD_KEY_TYPE
Definition: ErrorCodes.h:133
@ rpcCHANNEL_AMT_MALFORMED
Definition: ErrorCodes.h:101
@ rpcALREADY_MULTISIG
Definition: ErrorCodes.h:91
@ rpcBAD_MARKET
Definition: ErrorCodes.h:97
@ rpcOBJECT_NOT_FOUND
Definition: ErrorCodes.h:143
@ rpcNOT_READY
Definition: ErrorCodes.h:60
@ rpcSUCCESS
Definition: ErrorCodes.h:44
@ rpcSENDMAX_MALFORMED
Definition: ErrorCodes.h:119
@ rpcNO_CURRENT
Definition: ErrorCodes.h:65
@ rpcPUBLIC_MALFORMED
Definition: ErrorCodes.h:117
@ rpcEXPIRED_VALIDATOR_LIST
Definition: ErrorCodes.h:137
@ rpcDST_ISR_MALFORMED
Definition: ErrorCodes.h:108
@ rpcBAD_CREDENTIALS
Definition: ErrorCodes.h:152
@ rpcINVALID_PARAMS
Definition: ErrorCodes.h:84
@ rpcINTERNAL
Definition: ErrorCodes.h:130
@ rpcBAD_SECRET
Definition: ErrorCodes.h:98
@ rpcBAD_SYNTAX
Definition: ErrorCodes.h:46
@ rpcSTREAM_MALFORMED
Definition: ErrorCodes.h:126
@ rpcLGR_NOT_FOUND
Definition: ErrorCodes.h:72
@ rpcLGR_IDXS_INVALID
Definition: ErrorCodes.h:112
@ rpcSRC_ACT_MALFORMED
Definition: ErrorCodes.h:120
@ rpcNOT_IMPL
Definition: ErrorCodes.h:131
@ rpcSRC_ISR_MALFORMED
Definition: ErrorCodes.h:125
@ rpcSIGNING_MALFORMED
Definition: ErrorCodes.h:118
@ rpcUNKNOWN
Definition: ErrorCodes.h:42
@ rpcCHANNEL_MALFORMED
Definition: ErrorCodes.h:100
@ rpcNO_PF_REQUEST
Definition: ErrorCodes.h:86
@ rpcDST_AMT_MALFORMED
Definition: ErrorCodes.h:106
@ rpcLGR_IDX_MALFORMED
Definition: ErrorCodes.h:113
@ rpcCOMMAND_MISSING
Definition: ErrorCodes.h:102
@ rpcFORBIDDEN
Definition: ErrorCodes.h:48
@ rpcNO_CLOSED
Definition: ErrorCodes.h:64
@ rpcJSON_RPC
Definition: ErrorCodes.h:47
@ rpcNOT_ENABLED
Definition: ErrorCodes.h:59
@ rpcDST_ACT_MALFORMED
Definition: ErrorCodes.h:103
@ rpcSRC_CUR_MALFORMED
Definition: ErrorCodes.h:124
@ rpcINVALID_HOTWALLET
Definition: ErrorCodes.h:81
@ rpcBAD_SEED
Definition: ErrorCodes.h:99
@ rpcDST_AMT_MISSING
Definition: ErrorCodes.h:107
@ rpcHIGH_FEE
Definition: ErrorCodes.h:58
@ rpcDB_DESERIALIZATION
Definition: ErrorCodes.h:134
@ rpcDST_ACT_NOT_FOUND
Definition: ErrorCodes.h:105
@ rpcNOT_SYNCED
Definition: ErrorCodes.h:67
@ rpcNO_PERMISSION
Definition: ErrorCodes.h:53
@ rpcSRC_ACT_MISSING
Definition: ErrorCodes.h:121
Maps an rpc error code to its token, default message, and HTTP status.
Definition: ErrorCodes.h:179