+You could also expose the service as HTTP2 server through *nginx* working as reverse proxy (*adml-http* image is built in this way although internally provides HTTP operations script only for 1.1). Then you could use HTTP2 clients like *nghttp*:
+
+> nghttp -v -H ":method: POST" -d test.json "<uri>"
+
+
+
+**Important note:** Anna Suite work natively with xml. Although REST API supports diameter messages (*diameterJson* fields) and services configuration (*servicesJson* fields) in *json* format, these messages are not validated directly with a *json schema*. Instead, the *json* object are converted to *xml* at ADML and the resulting xml representations are validates against *dtd* schemas:
+
+Schema for diameter messages: [here](../../../../include/anna/diameter/codec/message.dtd).
+
+Schema for configuration services: [here](./services_examples/services.dtd).
+
+There are lots of examples for *xml diameter messages and xml services* (normally deployed with *ADML* at `./xml_examples` and `./services_examples`), then you could transform them to the *json format* accepted by the REST API easily, for example using *xmltodict* python module:
+
+```
+#!/usr/bin/python3
+import xmltodict
+import json
+import sys
+
+try:
+ file = sys.argv[1]
+except:
+ print("Usage: " + sys.argv[0] + " <diameter xml file>")
+ sys.exit(1)
+
+try:
+ with open(file, 'r') as myfile:
+ xml = myfile.read()
+except:
+ print("ERROR reading '" + file + "'")
+ sys.exit(1)
+
+# although default attribute prefix is '@', anyway we will
+# force the value just in case xmltodict implementation
+# changes. The anna::core::functions::json2xml helper,
+# assumes this prefix in order to work properly.
+my_dict=xmltodict.parse(xml, attr_prefix='@')
+json_data=json.dumps(my_dict, indent=3, sort_keys=True)
+print(json_data)
+```
+
+**Former script is packaged** together with REST API component tests under `./diameterJsonHelper/xml2json.py`.
+
+Native example for *AA-Request* diameter message:
+
+```
+<message version="1" name="AA-Request" p-bit="yes" application-id="16777236" hop-by-hop-id="0" end-to-end-id="0">
+ <avp name="Session-Id" data="test1;afNodeHostname.nodeHostRealm.com;1;8033450"/>
+ <avp name="Auth-Application-Id" data="16777236"/>
+ <avp name="Origin-Host" data="afHost.afRealm.com"/>
+ <avp name="Origin-Realm" data="afRealm.com"/>
+ <avp name="Destination-Realm" data="operatorRealm.com"/>
+ <avp name="Destination-Host" data="ownHostId.operatorRealm.com"/>
+ <avp name="AF-Application-Identifier" hex-data="313232"/>
+ <avp name="Media-Component-Description">
+ <avp name="Media-Component-Number" data="0"/>
+ <avp name="AF-Application-Identifier" hex-data="313232"/>
+ <avp name="Max-Requested-Bandwidth-UL" data="127"/>
+ <avp name="Max-Requested-Bandwidth-DL" data="133"/>
+ <avp name="Flow-Status" data="2" alias="ENABLED"/>
+ <avp name="Reservation-Priority" data="0" alias="DEFAULT"/>
+ </avp>
+ <avp name="Service-Info-Status" data="0" alias="FINAL_SERVICE_INFORMATION"/>
+ <avp name="Subscription-Id">
+ <avp name="Subscription-Id-Type" data="0" alias="END_USER_E164"/>
+ <avp name="Subscription-Id-Data" data="626037099"/>
+ </avp>
+ <avp name="Framed-IP-Address" hex-data="3139322e3136382e302e31"/>
+ <avp name="Called-Station-Id" hex-data="5741502e4d4f564953544152"/>
+</message>
+
+```
+
+Corresponding content in *json* format:
+
+```
+{
+ "message": {
+ "@application-id": "16777236",
+ "@end-to-end-id": "0",
+ "@hop-by-hop-id": "0",
+ "@name": "AA-Request",
+ "@p-bit": "yes",
+ "@version": "1",
+ "avp": [
+ {
+ "@data": "test1;afNodeHostname.nodeHostRealm.com;1;8033450",
+ "@name": "Session-Id"
+ },
+ {
+ "@data": "16777236",
+ "@name": "Auth-Application-Id"
+ },
+ {
+ "@data": "afHost.afRealm.com",
+ "@name": "Origin-Host"
+ },
+ {
+ "@data": "afRealm.com",
+ "@name": "Origin-Realm"
+ },
+ {
+ "@data": "operatorRealm.com",
+ "@name": "Destination-Realm"
+ },
+ {
+ "@data": "ownHostId.operatorRealm.com",
+ "@name": "Destination-Host"
+ },
+ {
+ "@hex-data": "313232",
+ "@name": "AF-Application-Identifier"
+ },
+ {
+ "@name": "Media-Component-Description",
+ "avp": [
+ {
+ "@data": "0",
+ "@name": "Media-Component-Number"
+ },
+ {
+ "@hex-data": "313232",
+ "@name": "AF-Application-Identifier"
+ },
+ {
+ "@data": "127",
+ "@name": "Max-Requested-Bandwidth-UL"
+ },
+ {
+ "@data": "133",
+ "@name": "Max-Requested-Bandwidth-DL"
+ },
+ {
+ "@alias": "ENABLED",
+ "@data": "2",
+ "@name": "Flow-Status"
+ },
+ {
+ "@alias": "DEFAULT",
+ "@data": "0",
+ "@name": "Reservation-Priority"
+ }
+ ]
+ },
+ {
+ "@alias": "FINAL_SERVICE_INFORMATION",
+ "@data": "0",
+ "@name": "Service-Info-Status"
+ },
+ {
+ "@name": "Subscription-Id",
+ "avp": [
+ {
+ "@alias": "END_USER_E164",
+ "@data": "0",
+ "@name": "Subscription-Id-Type"
+ },
+ {
+ "@data": "626037099",
+ "@name": "Subscription-Id-Data"
+ }
+ ]
+ },
+ {
+ "@hex-data": "3139322e3136382e302e31",
+ "@name": "Framed-IP-Address"
+ },
+ {
+ "@hex-data": "5741502e4d4f564953544152",
+ "@name": "Called-Station-Id"
+ }
+ ]
+ }
+}
+```
+
+Native example for a services configuration example:
+
+```
+<services>
+ <!--
+ Stacks
+
+ * Monostack: you could select any id value, normally 0.
+ * Multistack: use the application id for the id value.
+ This eases codec engine selection for
+ processed messages.
+ -->
+ <stack id="0" dictionary="dictionary.xml" fixMode="Always" ignoreFlagsOnValidation="yes"/>
+
+ <!--
+ Nodes
+
+ * Client example:
+
+ <node originHost="<origin host>" applicationId="<application id>"
+ entity="<addr1:port1[,addr2:port2]...[,addrN:portN]>"
+ cer="<cer xml file>" answersTimeout="300000" dumpLog="yes"/>
+
+ * Server example:
+
+ <node originHost="<origin host>" applicationId="<application id>"
+ diameterServer="<addr:port>" diameterServerSessions="10"
+ cea="<cea xml file>" answersTimeout="300000" dumpLog="yes"/>
+ -->
+ <node originHost="afHost.afRealm.com" applicationId="0" entity="localhost:3868"/>
+ <node originHost="ownHostId.operatorRealm.com" applicationId="0"
+ diameterServer="localhost:3868" diameterServerSessions="1"/>
+
+</services>
+```
+
+And the converted *json* equivalent:
+
+```
+{
+ "services": {
+ "node": [
+ {
+ "@applicationId": "0",
+ "@entity": "localhost:3868",
+ "@originHost": "afHost.afRealm.com"
+ },
+ {
+ "@applicationId": "0",
+ "@diameterServer": "localhost:3868",
+ "@diameterServerSessions": "1",
+ "@originHost": "ownHostId.operatorRealm.com"
+ }
+ ],
+ "stack": {
+ "@dictionary": "dictionary.xml",
+ "@fixMode": "Always",
+ "@id": "0",
+ "@ignoreFlagsOnValidation": "yes"
+ }
+ }
+}
+```
+
+
+
+**Note that the '@' character is mandatory to indicate attribute keys, and it is necessary to complete the *"json to xml"* conversion successfully at ADML REST Server endpoint.**
+
+
+
+### Node management
+
+#### POST /node
+
+Selects a context working node by mean a registered name (origin-host). If empty, current node information is retrieved.
+
+**Request body**:
+
+```
+{
+ "name":"[node name]"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<error description or base64-encoded xml information>"
+}
+```
+
+#### POST /node-auto
+
+Smart node selection.
+
+**Request body**: none
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+### Parsing operations
+
+#### POST /code
+
+Encodes a diameter json into hexadecimal representation.
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<error description or diameter hex>"
+}
+```
+
+#### POST /decode
+
+Decodes an hexadecimal string (no spaces, no colons, i.e.: `01000150c0...`), into diameter xml (*base64-encoded*).
+
+**Request body**:
+
+```
+{
+ "diameterHex":"<hex string>"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<error description or base64-encoded xml diameter message>"
+}
+```
+
+#### POST /loadmsg
+
+Reinterprets diameter json into xml (*base64-encoded*).
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<error description or base64-encoded xml diameter message>"
+}
+```
+
+### Hot changes
+
+#### POST /services
+
+Referred files (*dictionaries, cer, cea, etc.*) shall be accesible for ADML and are not provided in this operation.
+
+**Request body**:
+
+```
+{
+ "servicesJson":<services json object>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /diameterServerSessions
+
+Updates diameter server sessions to be accepted.
+
+**Request body**:
+
+```
+{
+ "sessions":<sessions (integer)>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /change-dir
+
+Updates ADML working directory.
+
+**Request body**:
+
+```
+{
+ "directory":"<directory path or empty to restore initial working directory>"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+### Client sessions visibility
+
+#### POST /visibility
+
+**Request body**:
+
+```
+{
+ "action":"<hide|show|hidden|shown>"
+ [, "addressPort":"<address:port>"]
+ [, "socket":<socket id (integer)>]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+### Snapshots
+
+#### POST /collect
+
+Reset statistics and counters.
+
+**Request body**: none
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /context
+
+Dump ADML context at file path provided. If empty (or field missing), default path is selected. Context information is not retrieved in the response, so, file is related to ADML execution context.
+
+**Request body**:
+
+```
+{
+ ["targetFile":"[file path]"]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /forceCountersRecord
+
+Forces dump to file the current counters of the process.
+
+**Request body**: none
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /log-statistics-samples
+
+Set the statistics concepts to be logged. To know the concept indentifiers registered, get the ADML context information.
+
+**Request body**:
+
+```
+{
+ ["list":"<comma-separated list|[all]|none>"]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+### Flow operations
+
+#### POST /sendmsg2e
+
+Sends diameter json message **to**(2) the connected **entity**(e).
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /sendmsg2c
+
+Sends diameter json message **to**(2) the connected **client**(c).
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /answermsg2e
+
+Answers diameter json message **to**(2) the connected **entity**(e).
+
+Mocking FIFO queue based in message code.
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+}
+```
+
+or
+
+```
+{
+ "action":"[action: <[list]|dump|clear|exhaust|rotate>]"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response or base64-encoded output for 'list' action>"
+}
+```
+
+#### POST /answermsg2c
+
+Answers diameter json message **to**(2) the connected **client**(c).
+
+Mocking FIFO queue based in message code.
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+}
+```
+
+or
+
+```
+{
+ "action":"[action: <[list]|dump|clear|exhaust|rotate>]"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response or base64-encoded output for 'list' action>"
+}
+```
+
+#### POST /sendhex2e
+
+Sends diameter expressed in hexadecimal string (no spaces, no colons, i.e.: `01000150c0...`), **to**(2) the connected **entity**(e).
+
+**Request body**:
+
+```
+{
+ "diameterHex":"<hex string>"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /sendhex2c
+
+Sends diameter expressed in hexadecimal string (no spaces, no colons, i.e.: `01000150c0...`), **to**(2) the connected **client**(c).
+
+**Request body**:
+
+```
+{
+ "diameterHex":"<hex string>"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+### FSM testing
+
+ADML implements a bulting *Finite State Machine* to plan testing flows with a great flexibility.
+
+#### POST /testid-description
+
+**Request body**:
+
+```
+{
+ "description":"<description (string)>"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-ip-limit
+
+In-Progress limit is the maximum number of tests which can be executed in parallel.
+This operation allows a specific test to set this global pool behaviour.
+
+Zero-value is equivalent to stop the clock (no tests will be executed).
+
+Value '-1' means 'no limit' (full parallel). Be careful with resources consumption.
+
+**Request body**:
+
+```
+{
+ "amount":[amount (integer, 1 by default: execution in sequence)]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-timeout
+
+**Request body**:
+
+```
+{
+ "msecs":<milliseconds (integer)>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-sendmsg2e
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+ [,"stepNumber":[amount (integer, -1 no step associated)]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-sendmsg2c
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+ [,"stepNumber":[amount (integer, -1 no step associated)]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-delay
+
+**Request body**:
+
+```
+{
+ "msecs":<milliseconds (integer)>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-sh-command
+
+**Request body**:
+
+```
+{
+ "script":"<script>"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-waitfe-hex
+
+**Request body**:
+
+```
+{
+ "hex":"<hex string>"
+ [,"strict":"[<true|[false]>]"]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-waitfc-hex
+
+**Request body**:
+
+```
+{
+ "hex":"<hex string>"
+ [,"strict":"[<true|[false]>]"]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-waitfe-msg
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+ [,"strict":"[<true|[false]>]"]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-waitfc-msg
+
+**Request body**:
+
+```
+{
+ "diameterJson":<diameter message json object>
+ [,"strict":"[<true|[false]>]"]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-waitfe
+
+**Request body**:
+
+```
+{
+ "condition": {
+ "code":"[(integer)]",
+ "bitR":"[(1|0)]",
+ "hopByHop":"[(integer)]",
+ "applicationId":"[(integer)]",
+ "sessionId":"[session id]",
+ "resultCode":"[(integer)]",
+ "msisdn":"[msisdn]",
+ "imsi":"[imsi]",
+ "serviceContextId":"[service context id]"
+ }
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /testid-waitfc
+
+**Request body**:
+
+```
+{
+ "condition": {
+ "code":"[(integer)]",
+ "bitR":"[(1|0)]",
+ "hopByHop":"[(integer)]",
+ "applicationId":"[(integer)]",
+ "sessionId":"[session id]",
+ "resultCode":"[(integer)]",
+ "msisdn":"[msisdn]",
+ "imsi":"[imsi]",
+ "serviceContextId":"[service context id]"
+ }
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+### EXECUTION ACTIONS
+
+#### POST /test-ttps
+
+**Request body**:
+
+```
+{
+ "amount":<amount (integer)>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-next
+
+**Request body**:
+
+```
+{
+ ["syncAmount":[amount (integer: 1 by default)]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-ip-limit
+
+Global operation (also at test identifier level is accessible).
+
+Zero-value is equivalent to stop the clock (no tests will be executed).
+
+Value '-1' means 'no limit' (full parallel). Be careful with resources consumption.
+
+Defaults to '-2' (no '-1' which is default for *testid-ip-limit* version), which wil show the current pool *ip-limit* and also the number of test cases which are *in progress*.
+
+**Request body**:
+
+```
+{
+ ["amount":[amount (integer, shows current ip-limit and in-progress test cases amount, by default (-2))]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-goto
+
+**Request body**:
+
+```
+{
+ "id":<test identifier>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-run
+
+**Request body**:
+
+```
+{
+ "id":<test identifier>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-look
+
+**Request body**:
+
+```
+{
+ ["id":[test identifier (integer: current by default (-1))]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<base64-encoded output>"
+}
+```
+
+#### POST /test-state
+
+**Request body**:
+
+```
+{
+ ["id":[test identifier (integer: current by default (-1))]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true: if state is 'Success' or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-interact
+
+Makes interactive a specific test case id. The amount of 0, implies no execution steps margin, which could be useful to 'freeze' a test in the middle of its execution. Value -1 makes it non-interactive resuming it from the current step.
+
+**Request body**:
+
+```
+{
+ "amount":<amount (integer)>
+ [,"id":[test identifier (integer: current by default (-1))]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-reset
+
+**Request body**:
+
+```
+{
+ ["type":"<[soft]|hard>"]
+ [,"id":[test identifier (integer: apply to all the tests (-1))]]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-repeats
+
+**Request body**:
+
+```
+{
+ "amount":<amount (integer)>
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-auto-reset
+
+**Request body**:
+
+```
+{
+ "type":"<soft|hard>"
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-initialized
+
+**Request body**: none
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-finished
+
+**Request body**: none
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-clear
+
+**Request body**: none
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-junit
+
+As it could be very large, it will be dumped on provided target directory, '*/tmp/junit.xml*' by default.
+
+**Request body**:
+
+```
+{
+ ["targetFile":"<file path>"]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-summary-counts
+
+**Request body**: none
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<base64-encoded output>"
+}
+```
+
+#### POST /test-summary-states
+
+**Request body**: none
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<base64-encoded output>"
+}
+```
+
+#### POST /test-summary
+
+**Request body**: none
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<base64-encoded output>"
+}
+```
+
+#### POST /test-report
+
+**Request body**:
+
+```
+{
+ ["state":"[<initialized|in-progress|failed|success|[all]|none>]"]
+ [,"action":"[<[enable]|disable>]"]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-report-hex
+
+**Request body**:
+
+```
+{
+ ["action":"[<[enable]|disable>]"]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+#### POST /test-dump_stdout
+
+**Request body**:
+
+```
+{
+ ["action":"[<[enable]|disable>]"]
+}
+```
+
+**Response body**:
+
+```
+{
+ "result":"<true or false>",
+ "response":"<response>"
+}
+```
+
+