| 1782 | } |
| 1783 | |
| 1784 | static void handle_rpc(cbm_http_conn_t *c, const cbm_http_req_t *req, cbm_mcp_server_t *mcp) { |
| 1785 | if (req->body_len == 0 || req->body_len > MAX_BODY_SIZE || !req->body) { |
| 1786 | cbm_http_replyf(c, 400, g_cors_json, |
| 1787 | "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32600," |
| 1788 | "\"message\":\"invalid request size\"},\"id\":null}"); |
| 1789 | return; |
| 1790 | } |
| 1791 | |
| 1792 | if (!rpc_is_allowed_for_ui(req->body, req->body_len)) { |
| 1793 | cbm_http_replyf(c, 403, g_cors_json, |
| 1794 | "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32601," |
| 1795 | "\"message\":\"UI RPC method is not allowed\"},\"id\":null}"); |
| 1796 | return; |
| 1797 | } |
| 1798 | |
| 1799 | /* req->body is NUL-terminated by the transport */ |
| 1800 | char *response = cbm_mcp_server_handle(mcp, req->body); |
| 1801 | |
| 1802 | if (response) { |
| 1803 | cbm_http_replyf(c, 200, g_cors_json, "%s", response); |
| 1804 | free(response); |
| 1805 | } else { |
| 1806 | cbm_http_replyf(c, 204, g_cors, "%s", ""); |
| 1807 | } |
| 1808 | } |
| 1809 | |
| 1810 | /* ── Request dispatch ─────────────────────────────────────────── */ |
| 1811 |
no test coverage detected