.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.

.. include:: ../../common.defs

.. highlight:: cpp
.. default-domain:: cpp

.. _JSONRPC: https://www.jsonrpc.org/specification
.. _JSON: https://www.json.org/json-en.html


.. _jsonrpc-node-errors:


JSON RPC errors
***************

A list of codes and descriptions of errors that could be send back from the JSONRPC server. JSONRPC response messages could contains
different set of errors in the following format:

.. note::

   Check  :ref:`jsonrpc-error` for details about the error structure.


.. code-block::json

   {
      "error": {
         "code": -32601,
         "message": "Method not found"
      },
      "id": "ded7018e-0720-11eb-abe2-001fc69cc946",
      "jsonrpc": "2.0"
   }

In some cases the data field could be populated:

.. code-block:: json

   {
      "jsonrpc": "2.0",
      "error":{
         "code": 10,
         "message": "Unauthorized action",
         "data":[
            {
               "code": 2,
               "message":"Denied privileged API access for uid=XXX gid=XXX"
            }
         ]
      },
      "id":"5e273ec0-3e3b-4a81-90ec-aeee3d38073f"
   }


.. _jsonrpc-node-errors-standard-errors:

Standard errors
===============

=============== ========================================= =========================================================
Id              Message                                   Description
=============== ========================================= =========================================================
-32700          Parse error                               Invalid JSON was received by the server.
                                                          An error occurred on the server while parsing the JSON text.
-32600          Invalid Request                           The JSON sent is not a valid Request object.
-32601          Method not found                          The method does not exist / is not available.
-32602          Invalid params                            Invalid method parameter(s).
-32603          Internal error                            Internal `JSONRPC`_ error.
=============== ========================================= =========================================================

.. _jsonrpc-node-errors-custom-errors:

Custom errors
=============

The following error list are defined by the server.

=============== ========================================= =========================================================
Id              Message                                   Description
=============== ========================================= =========================================================
1               Invalid version, 2.0 only                 The server only accepts version field equal to `2.0`.
2               Invalid version type, should be a string  Version field should be a literal string.
3               Missing version field                     No version field present, version field is mandatory.
4               Invalid method type, should be a string   The method field should be a literal string.
5               Missing method field                      No method field present, method field is mandatory.
6               Invalid params type. A Structured value   Params field should be a structured type, list or structure.
                is expected                               This is similar to `-32602`
7               Invalid id type                           If field should be a literal string.
8               Use of null as id is discouraged          Id field value is null, as per the specs this is discouraged,
                                                          the server will not accept it.
9               Error during execution                    An error occurred during the execution of the RPC call.
                                                          This error is used as a generic High level error. The specifics
                                                          details about the error, in most cases are specified in the
                                                          ``data`` field.
10              Unauthorized action                       The rpc method will not be invoked because the action is not
                                                          permitted by some constraint or authorization issue.Check
                                                          :ref:`jsonrpc-node-errors-unauthorized-action` for mode details.
11              Use of an empty string as id is           An empty string "" as an id will not be accepted by the server.
                discouraged
=============== ========================================= =========================================================

.. _jsonrpc-node-errors-unauthorized-action:

Unauthorized action
-------------------

Under this error, the `data` field could be populated with the following errors, eventually more than one could be in set.

.. code-block:: json

   "data":[
      {
         "code":2,
         "message":"Denied privileged API access for uid=XXX gid=XXX"
      }
   ]

=============== ========================================= =========================================================
Id              Message                                   Description
=============== ========================================= =========================================================
1               Error getting peer credentials: {}        Something happened while trying to get the peers credentials.
                                                          The error string will show the error code(`errno`) returned by the
                                                          server.
2               Denied privileged API access for uid={}   Permission denied. Unix Socket credentials were checked and they haven't meet
                gid={}                                    the required policy. The handler was configured as restricted
                                                          and the socket credentials failed to validate. Check TBC for
                                                          more information.
=============== ========================================= =========================================================
