]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
ARI: Support channel variables in originate
authorKinsey Moore <kmoore@digium.com>
Tue, 21 Jan 2014 14:27:21 +0000 (14:27 +0000)
committerKinsey Moore <kmoore@digium.com>
Tue, 21 Jan 2014 14:27:21 +0000 (14:27 +0000)
This adds back in support for specifying channel variables during an
originate without compromising the ability to specify query parameters
in the JSON body. This was accomplished by generating the body-parsing
code in a separate function instead of being integrated with the URI
query parameter parsing code such that it could be called by paths with
body parameters. This is transparent to the user of the API and
prevents manual duplication of code or data structures.

(closes issue ASTERISK-23051)
Review: https://reviewboard.asterisk.org/r/3122/
Reported by: Matt Jordan
........

Merged revisions 406003 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@406006 65c4cc65-6c06-0410-ace0-fbb531ad65f3

23 files changed:
res/ari/resource_applications.h
res/ari/resource_asterisk.h
res/ari/resource_bridges.h
res/ari/resource_channels.c
res/ari/resource_channels.h
res/ari/resource_device_states.h
res/ari/resource_mailboxes.h
res/ari/resource_playbacks.h
res/ari/resource_sounds.h
res/res_ari_applications.c
res/res_ari_asterisk.c
res/res_ari_bridges.c
res/res_ari_channels.c
res/res_ari_device_states.c
res/res_ari_mailboxes.c
res/res_ari_playbacks.c
res/res_ari_sounds.c
rest-api-templates/ari_resource.h.mustache
rest-api-templates/asterisk_processor.py
rest-api-templates/body_parsing.mustache [new file with mode: 0644]
rest-api-templates/param_parsing.mustache
rest-api-templates/res_ari_resource.c.mustache
rest-api/api-docs/channels.json

index a4d12c9c0745c74df7542a232ac4e06a8dcd9690..3e57ad71642810effef00b0dc1cf50e32809f888 100644 (file)
@@ -74,6 +74,17 @@ struct ast_ari_applications_subscribe_args {
        /*! \brief Parsing context for event_source. */
        char *event_source_parse;
 };
+/*!
+ * \brief Body parsing function for /applications/{applicationName}/subscription.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_applications_subscribe_parse_body(
+       struct ast_json *body,
+       struct ast_ari_applications_subscribe_args *args);
+
 /*!
  * \brief Subscribe an application to a event source.
  *
@@ -95,6 +106,17 @@ struct ast_ari_applications_unsubscribe_args {
        /*! \brief Parsing context for event_source. */
        char *event_source_parse;
 };
+/*!
+ * \brief Body parsing function for /applications/{applicationName}/subscription.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_applications_unsubscribe_parse_body(
+       struct ast_json *body,
+       struct ast_ari_applications_unsubscribe_args *args);
+
 /*!
  * \brief Unsubscribe an application from an event source.
  *
index aff89c4454718308d44b854a1dd00662f3ede30b..93e161d3fcc7494db9053b602bd29a9a54d4c22a 100644 (file)
@@ -48,6 +48,17 @@ struct ast_ari_asterisk_get_info_args {
        /*! \brief Parsing context for only. */
        char *only_parse;
 };
+/*!
+ * \brief Body parsing function for /asterisk/info.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_asterisk_get_info_parse_body(
+       struct ast_json *body,
+       struct ast_ari_asterisk_get_info_args *args);
+
 /*!
  * \brief Gets Asterisk system information.
  *
@@ -61,6 +72,17 @@ struct ast_ari_asterisk_get_global_var_args {
        /*! \brief The variable to get */
        const char *variable;
 };
+/*!
+ * \brief Body parsing function for /asterisk/variable.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_asterisk_get_global_var_parse_body(
+       struct ast_json *body,
+       struct ast_ari_asterisk_get_global_var_args *args);
+
 /*!
  * \brief Get the value of a global variable.
  *
@@ -76,6 +98,17 @@ struct ast_ari_asterisk_set_global_var_args {
        /*! \brief The value to set the variable to */
        const char *value;
 };
+/*!
+ * \brief Body parsing function for /asterisk/variable.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_asterisk_set_global_var_parse_body(
+       struct ast_json *body,
+       struct ast_ari_asterisk_set_global_var_args *args);
+
 /*!
  * \brief Set the value of a global variable.
  *
index a7ccd31201ad9de4ec2684e84dc382cac941f52e..38ccb294bf6703842b9033f5e5bf3d37ede06711 100644 (file)
@@ -57,6 +57,17 @@ struct ast_ari_bridges_create_args {
        /*! \brief Name to give to the bridge being created. */
        const char *name;
 };
+/*!
+ * \brief Body parsing function for /bridges.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_bridges_create_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_create_args *args);
+
 /*!
  * \brief Create a new bridge.
  *
@@ -108,6 +119,17 @@ struct ast_ari_bridges_add_channel_args {
        /*! \brief Channel's role in the bridge */
        const char *role;
 };
+/*!
+ * \brief Body parsing function for /bridges/{bridgeId}/addChannel.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_bridges_add_channel_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_add_channel_args *args);
+
 /*!
  * \brief Add a channel to a bridge.
  *
@@ -127,6 +149,17 @@ struct ast_ari_bridges_remove_channel_args {
        /*! \brief Parsing context for channel. */
        char *channel_parse;
 };
+/*!
+ * \brief Body parsing function for /bridges/{bridgeId}/removeChannel.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_bridges_remove_channel_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_remove_channel_args *args);
+
 /*!
  * \brief Remove a channel from a bridge.
  *
@@ -142,6 +175,17 @@ struct ast_ari_bridges_start_moh_args {
        /*! \brief Channel's id */
        const char *moh_class;
 };
+/*!
+ * \brief Body parsing function for /bridges/{bridgeId}/moh.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_bridges_start_moh_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_start_moh_args *args);
+
 /*!
  * \brief Play music on hold to a bridge or change the MOH class that is playing.
  *
@@ -178,6 +222,17 @@ struct ast_ari_bridges_play_args {
        /*! \brief Number of milliseconds to skip for forward/reverse operations. */
        int skipms;
 };
+/*!
+ * \brief Body parsing function for /bridges/{bridgeId}/play.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_bridges_play_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_play_args *args);
+
 /*!
  * \brief Start playback of media on a bridge.
  *
@@ -207,6 +262,17 @@ struct ast_ari_bridges_record_args {
        /*! \brief DTMF input to terminate recording. */
        const char *terminate_on;
 };
+/*!
+ * \brief Body parsing function for /bridges/{bridgeId}/record.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_bridges_record_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_record_args *args);
+
 /*!
  * \brief Start a recording.
  *
index e6322a37c8f6989daa3681625554276780662df9..ab8f5b42b073e485d55cb1f4b819f399b407d763 100644 (file)
@@ -687,6 +687,43 @@ void ast_ari_channels_list(struct ast_variable *headers,
        ast_ari_response_ok(response, ast_json_ref(json));
 }
 
+static int ari_channels_set_channel_var(struct ast_channel *chan,
+       const char *variable, const char *value, struct ast_ari_response *response)
+{
+       if (pbx_builtin_setvar_helper(chan, variable, value)) {
+               ast_ari_response_error(
+                       response, 400, "Bad Request",
+                       "Unable to set channel variable %s=%s", variable, value);
+               return -1;
+       }
+
+       return 0;
+}
+
+static int ari_channels_set_channel_vars(struct ast_channel *chan,
+       struct ast_json *variables, struct ast_ari_response *response)
+{
+       struct ast_json_iter *i;
+
+       if (!variables) {
+               /* nothing to do */
+               return 0;
+       }
+
+       for (i = ast_json_object_iter(variables); i;
+            i = ast_json_object_iter_next(variables, i)) {
+               if (ari_channels_set_channel_var(
+                       chan, ast_json_object_iter_key(i),
+                       ast_json_string_get(ast_json_object_iter_value(i)),
+                       response)) {
+                       /* response filled in by called function */
+                       return -1;
+               }
+       }
+
+       return 0;
+}
+
 void ast_ari_channels_originate(struct ast_variable *headers,
        struct ast_ari_channels_originate_args *args,
        struct ast_ari_response *response)
@@ -704,6 +741,7 @@ void ast_ari_channels_originate(struct ast_variable *headers,
        char *stuff;
        struct ast_channel *chan;
        RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
+       struct ast_json *variable_list = NULL;
 
        if (!cap) {
                ast_ari_response_alloc_failed(response);
@@ -711,6 +749,12 @@ void ast_ari_channels_originate(struct ast_variable *headers,
        }
        ast_format_cap_add(cap, ast_format_set(&tmp_fmt, AST_FORMAT_SLINEAR, 0));
 
+       /* Parse any query parameters out of the body parameter */
+       if (args->variables) {
+               ast_ari_channels_originate_parse_body(args->variables, args);
+               variable_list = ast_json_object_get(args->variables, "variables");
+       }
+
        if (ast_strlen_zero(args->endpoint)) {
                ast_ari_response_error(response, 400, "Bad Request",
                        "Endpoint must be specified");
@@ -776,6 +820,11 @@ void ast_ari_channels_originate(struct ast_variable *headers,
                return;
        }
 
+       if (ari_channels_set_channel_vars(chan, variable_list, response)) {
+               /* response filled in by called function */
+               return;
+       }
+
        snapshot = ast_channel_snapshot_create(chan);
        ast_channel_unlock(chan);
 
index 49ab8eb3425f1a0174d2742d997551a4e24b15ba..7f740a67c5ea4093fe50d59321d67372a8ccf01c 100644 (file)
@@ -68,7 +68,20 @@ struct ast_ari_channels_originate_args {
        const char *caller_id;
        /*! \brief Timeout (in seconds) before giving up dialing, or -1 for no timeout. */
        int timeout;
+       /*! \brief The 'variables' key in the body object holds variable key/value pairs to set on the channel on creation. Other keys in the body object are interpreted as query parameters. Ex. { 'endpoint': 'SIP/Alice', 'variables': { 'CALLERID(name)': 'Alice' } } */
+       struct ast_json *variables;
 };
+/*!
+ * \brief Body parsing function for /channels.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_originate_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_originate_args *args);
+
 /*!
  * \brief Create a new channel (originate).
  *
@@ -99,6 +112,17 @@ struct ast_ari_channels_hangup_args {
        /*! \brief Reason for hanging up the channel */
        const char *reason;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_hangup_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_hangup_args *args);
+
 /*!
  * \brief Delete (i.e. hangup) a channel.
  *
@@ -118,6 +142,17 @@ struct ast_ari_channels_continue_in_dialplan_args {
        /*! \brief The priority to continue to. */
        int priority;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/continue.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_continue_in_dialplan_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_continue_in_dialplan_args *args);
+
 /*!
  * \brief Exit application; continue execution in the dialplan.
  *
@@ -180,6 +215,17 @@ struct ast_ari_channels_send_dtmf_args {
        /*! \brief Amount of time to wait after DTMF digits (specified in milliseconds) end. */
        int after;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/dtmf.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_send_dtmf_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_send_dtmf_args *args);
+
 /*!
  * \brief Send provided DTMF to a given channel.
  *
@@ -195,6 +241,17 @@ struct ast_ari_channels_mute_args {
        /*! \brief Direction in which to mute audio */
        const char *direction;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/mute.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_mute_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_mute_args *args);
+
 /*!
  * \brief Mute a channel.
  *
@@ -210,6 +267,17 @@ struct ast_ari_channels_unmute_args {
        /*! \brief Direction in which to unmute audio */
        const char *direction;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/mute.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_unmute_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_unmute_args *args);
+
 /*!
  * \brief Unmute a channel.
  *
@@ -251,6 +319,17 @@ struct ast_ari_channels_start_moh_args {
        /*! \brief Music on hold class to use */
        const char *moh_class;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/moh.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_start_moh_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_start_moh_args *args);
+
 /*!
  * \brief Play music on hold to a channel.
  *
@@ -315,6 +394,17 @@ struct ast_ari_channels_play_args {
        /*! \brief Number of milliseconds to skip for forward/reverse operations. */
        int skipms;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/play.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_play_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_play_args *args);
+
 /*!
  * \brief Start playback of media.
  *
@@ -344,6 +434,17 @@ struct ast_ari_channels_record_args {
        /*! \brief DTMF input to terminate recording */
        const char *terminate_on;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/record.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_record_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_record_args *args);
+
 /*!
  * \brief Start a recording.
  *
@@ -361,6 +462,17 @@ struct ast_ari_channels_get_channel_var_args {
        /*! \brief The channel variable or function to get */
        const char *variable;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/variable.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_get_channel_var_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_get_channel_var_args *args);
+
 /*!
  * \brief Get the value of a channel variable or function.
  *
@@ -378,6 +490,17 @@ struct ast_ari_channels_set_channel_var_args {
        /*! \brief The value to set the variable to */
        const char *value;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/variable.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_set_channel_var_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_set_channel_var_args *args);
+
 /*!
  * \brief Set the value of a channel variable or function.
  *
@@ -399,6 +522,17 @@ struct ast_ari_channels_snoop_channel_args {
        /*! \brief The application arguments to pass to the Stasis application */
        const char *app_args;
 };
+/*!
+ * \brief Body parsing function for /channels/{channelId}/snoop.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_channels_snoop_channel_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_snoop_channel_args *args);
+
 /*!
  * \brief Start snooping.
  *
index a3bac999c1b489463c9cade4ecb998f2413dd3dc..7e2a38b4af66e1a4c10dfde35ef662084a8bf592 100644 (file)
@@ -70,6 +70,17 @@ struct ast_ari_device_states_update_args {
        /*! \brief Device state value */
        const char *device_state;
 };
+/*!
+ * \brief Body parsing function for /deviceStates/{deviceName}.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_device_states_update_parse_body(
+       struct ast_json *body,
+       struct ast_ari_device_states_update_args *args);
+
 /*!
  * \brief Change the state of a device controlled by ARI. (Note - implicitly creates the device state).
  *
index 33c69682dd0713bd3219d96becce4ad38334647b..8627321db70f8b08639f7b226b5716a09ffe397d 100644 (file)
@@ -72,6 +72,17 @@ struct ast_ari_mailboxes_update_args {
        /*! \brief Count of new messages in the mailbox */
        int new_messages;
 };
+/*!
+ * \brief Body parsing function for /mailboxes/{mailboxName}.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_mailboxes_update_parse_body(
+       struct ast_json *body,
+       struct ast_ari_mailboxes_update_args *args);
+
 /*!
  * \brief Change the state of a mailbox. (Note - implicitly creates the mailbox).
  *
index 9cd9f3cbd05e534732d0f9514d7726e344e59769..751be7504b36e0c581c1d8119d016640f509e151 100644 (file)
@@ -72,6 +72,17 @@ struct ast_ari_playbacks_control_args {
        /*! \brief Operation to perform on the playback. */
        const char *operation;
 };
+/*!
+ * \brief Body parsing function for /playbacks/{playbackId}/control.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_playbacks_control_parse_body(
+       struct ast_json *body,
+       struct ast_ari_playbacks_control_args *args);
+
 /*!
  * \brief Control a playback.
  *
index 5e8ddd43df45b349dc580d7a473bd7ae6202de93..d9588b1c018fd5b82a62e88c1c1ec447a387c1b6 100644 (file)
@@ -46,6 +46,17 @@ struct ast_ari_sounds_list_args {
        /*! \brief Lookup sound in a specific format. */
        const char *format;
 };
+/*!
+ * \brief Body parsing function for /sounds.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_sounds_list_parse_body(
+       struct ast_json *body,
+       struct ast_ari_sounds_list_args *args);
+
 /*!
  * \brief List all sounds.
  *
index 1f021c41d64a45242b400c8abd7bd1d7553408b0..9195d4c83cf656108838235da755d17a7a6e5327 100644 (file)
@@ -161,6 +161,44 @@ static void ast_ari_applications_get_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_applications_subscribe_parse_body(
+       struct ast_json *body,
+       struct ast_ari_applications_subscribe_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "eventSource");
+       if (field) {
+               /* If they were silly enough to both pass in a query param and a
+                * JSON body, free up the query value.
+                */
+               ast_free(args->event_source);
+               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
+                       /* Multiple param passed as array */
+                       size_t i;
+                       args->event_source_count = ast_json_array_size(field);
+                       args->event_source = ast_malloc(sizeof(*args->event_source) * args->event_source_count);
+
+                       if (!args->event_source) {
+                               return -1;
+                       }
+
+                       for (i = 0; i < args->event_source_count; ++i) {
+                               args->event_source[i] = ast_json_string_get(ast_json_array_get(field, i));
+                       }
+               } else {
+                       /* Multiple param passed as single value */
+                       args->event_source_count = 1;
+                       args->event_source = ast_malloc(sizeof(*args->event_source) * args->event_source_count);
+                       if (!args->event_source) {
+                               return -1;
+                       }
+                       args->event_source[0] = ast_json_string_get(field);
+               }
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /applications/{applicationName}/subscription.
  * \param get_params GET parameters in the HTTP request.
@@ -176,7 +214,6 @@ static void ast_ari_applications_subscribe_cb(
        struct ast_ari_applications_subscribe_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -249,37 +286,9 @@ static void ast_ari_applications_subscribe_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "eventSource");
-       if (field) {
-               /* If they were silly enough to both pass in a query param and a
-                * JSON body, free up the query value.
-                */
-               ast_free(args.event_source);
-               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
-                       /* Multiple param passed as array */
-                       size_t i;
-                       args.event_source_count = ast_json_array_size(field);
-                       args.event_source = ast_malloc(sizeof(*args.event_source) * args.event_source_count);
-
-                       if (!args.event_source) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-
-                       for (i = 0; i < args.event_source_count; ++i) {
-                               args.event_source[i] = ast_json_string_get(ast_json_array_get(field, i));
-                       }
-               } else {
-                       /* Multiple param passed as single value */
-                       args.event_source_count = 1;
-                       args.event_source = ast_malloc(sizeof(*args.event_source) * args.event_source_count);
-                       if (!args.event_source) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-                       args.event_source[0] = ast_json_string_get(field);
-               }
+       if (ast_ari_applications_subscribe_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_applications_subscribe(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -318,6 +327,44 @@ fin: __attribute__((unused))
        ast_free(args.event_source);
        return;
 }
+int ast_ari_applications_unsubscribe_parse_body(
+       struct ast_json *body,
+       struct ast_ari_applications_unsubscribe_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "eventSource");
+       if (field) {
+               /* If they were silly enough to both pass in a query param and a
+                * JSON body, free up the query value.
+                */
+               ast_free(args->event_source);
+               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
+                       /* Multiple param passed as array */
+                       size_t i;
+                       args->event_source_count = ast_json_array_size(field);
+                       args->event_source = ast_malloc(sizeof(*args->event_source) * args->event_source_count);
+
+                       if (!args->event_source) {
+                               return -1;
+                       }
+
+                       for (i = 0; i < args->event_source_count; ++i) {
+                               args->event_source[i] = ast_json_string_get(ast_json_array_get(field, i));
+                       }
+               } else {
+                       /* Multiple param passed as single value */
+                       args->event_source_count = 1;
+                       args->event_source = ast_malloc(sizeof(*args->event_source) * args->event_source_count);
+                       if (!args->event_source) {
+                               return -1;
+                       }
+                       args->event_source[0] = ast_json_string_get(field);
+               }
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /applications/{applicationName}/subscription.
  * \param get_params GET parameters in the HTTP request.
@@ -333,7 +380,6 @@ static void ast_ari_applications_unsubscribe_cb(
        struct ast_ari_applications_unsubscribe_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -406,37 +452,9 @@ static void ast_ari_applications_unsubscribe_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "eventSource");
-       if (field) {
-               /* If they were silly enough to both pass in a query param and a
-                * JSON body, free up the query value.
-                */
-               ast_free(args.event_source);
-               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
-                       /* Multiple param passed as array */
-                       size_t i;
-                       args.event_source_count = ast_json_array_size(field);
-                       args.event_source = ast_malloc(sizeof(*args.event_source) * args.event_source_count);
-
-                       if (!args.event_source) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-
-                       for (i = 0; i < args.event_source_count; ++i) {
-                               args.event_source[i] = ast_json_string_get(ast_json_array_get(field, i));
-                       }
-               } else {
-                       /* Multiple param passed as single value */
-                       args.event_source_count = 1;
-                       args.event_source = ast_malloc(sizeof(*args.event_source) * args.event_source_count);
-                       if (!args.event_source) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-                       args.event_source[0] = ast_json_string_get(field);
-               }
+       if (ast_ari_applications_unsubscribe_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_applications_unsubscribe(headers, &args, response);
 #if defined(AST_DEVMODE)
index 6d561aca9983f1f098f67867ca0e6d513e81e1d7..346c2c2f314fc5201a0c946abf9fca0ea7c66071 100644 (file)
@@ -51,6 +51,44 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 #define MAX_VALS 128
 
+int ast_ari_asterisk_get_info_parse_body(
+       struct ast_json *body,
+       struct ast_ari_asterisk_get_info_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "only");
+       if (field) {
+               /* If they were silly enough to both pass in a query param and a
+                * JSON body, free up the query value.
+                */
+               ast_free(args->only);
+               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
+                       /* Multiple param passed as array */
+                       size_t i;
+                       args->only_count = ast_json_array_size(field);
+                       args->only = ast_malloc(sizeof(*args->only) * args->only_count);
+
+                       if (!args->only) {
+                               return -1;
+                       }
+
+                       for (i = 0; i < args->only_count; ++i) {
+                               args->only[i] = ast_json_string_get(ast_json_array_get(field, i));
+                       }
+               } else {
+                       /* Multiple param passed as single value */
+                       args->only_count = 1;
+                       args->only = ast_malloc(sizeof(*args->only) * args->only_count);
+                       if (!args->only) {
+                               return -1;
+                       }
+                       args->only[0] = ast_json_string_get(field);
+               }
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /asterisk/info.
  * \param get_params GET parameters in the HTTP request.
@@ -66,7 +104,6 @@ static void ast_ari_asterisk_get_info_cb(
        struct ast_ari_asterisk_get_info_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -133,37 +170,9 @@ static void ast_ari_asterisk_get_info_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "only");
-       if (field) {
-               /* If they were silly enough to both pass in a query param and a
-                * JSON body, free up the query value.
-                */
-               ast_free(args.only);
-               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
-                       /* Multiple param passed as array */
-                       size_t i;
-                       args.only_count = ast_json_array_size(field);
-                       args.only = ast_malloc(sizeof(*args.only) * args.only_count);
-
-                       if (!args.only) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-
-                       for (i = 0; i < args.only_count; ++i) {
-                               args.only[i] = ast_json_string_get(ast_json_array_get(field, i));
-                       }
-               } else {
-                       /* Multiple param passed as single value */
-                       args.only_count = 1;
-                       args.only = ast_malloc(sizeof(*args.only) * args.only_count);
-                       if (!args.only) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-                       args.only[0] = ast_json_string_get(field);
-               }
+       if (ast_ari_asterisk_get_info_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_asterisk_get_info(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -199,6 +208,19 @@ fin: __attribute__((unused))
        ast_free(args.only);
        return;
 }
+int ast_ari_asterisk_get_global_var_parse_body(
+       struct ast_json *body,
+       struct ast_ari_asterisk_get_global_var_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "variable");
+       if (field) {
+               args->variable = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /asterisk/variable.
  * \param get_params GET parameters in the HTTP request.
@@ -214,7 +236,6 @@ static void ast_ari_asterisk_get_global_var_cb(
        struct ast_ari_asterisk_get_global_var_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -241,10 +262,9 @@ static void ast_ari_asterisk_get_global_var_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "variable");
-       if (field) {
-               args.variable = ast_json_string_get(field);
+       if (ast_ari_asterisk_get_global_var_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_asterisk_get_global_var(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -279,6 +299,23 @@ static void ast_ari_asterisk_get_global_var_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_asterisk_set_global_var_parse_body(
+       struct ast_json *body,
+       struct ast_ari_asterisk_set_global_var_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "variable");
+       if (field) {
+               args->variable = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "value");
+       if (field) {
+               args->value = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /asterisk/variable.
  * \param get_params GET parameters in the HTTP request.
@@ -294,7 +331,6 @@ static void ast_ari_asterisk_set_global_var_cb(
        struct ast_ari_asterisk_set_global_var_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -324,14 +360,9 @@ static void ast_ari_asterisk_set_global_var_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "variable");
-       if (field) {
-               args.variable = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "value");
-       if (field) {
-               args.value = ast_json_string_get(field);
+       if (ast_ari_asterisk_set_global_var_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_asterisk_set_global_var(headers, &args, response);
 #if defined(AST_DEVMODE)
index 242512d90af2446b66b1d90339159eab3efdea9a..e1c9fe672a89e6af1e87417203aa959775bb5252 100644 (file)
@@ -102,6 +102,23 @@ static void ast_ari_bridges_list_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_bridges_create_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_create_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "type");
+       if (field) {
+               args->type = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "name");
+       if (field) {
+               args->name = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /bridges.
  * \param get_params GET parameters in the HTTP request.
@@ -117,7 +134,6 @@ static void ast_ari_bridges_create_cb(
        struct ast_ari_bridges_create_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -147,14 +163,9 @@ static void ast_ari_bridges_create_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "type");
-       if (field) {
-               args.type = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "name");
-       if (field) {
-               args.name = ast_json_string_get(field);
+       if (ast_ari_bridges_create_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_bridges_create(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -306,6 +317,48 @@ static void ast_ari_bridges_destroy_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_bridges_add_channel_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_add_channel_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "channel");
+       if (field) {
+               /* If they were silly enough to both pass in a query param and a
+                * JSON body, free up the query value.
+                */
+               ast_free(args->channel);
+               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
+                       /* Multiple param passed as array */
+                       size_t i;
+                       args->channel_count = ast_json_array_size(field);
+                       args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
+
+                       if (!args->channel) {
+                               return -1;
+                       }
+
+                       for (i = 0; i < args->channel_count; ++i) {
+                               args->channel[i] = ast_json_string_get(ast_json_array_get(field, i));
+                       }
+               } else {
+                       /* Multiple param passed as single value */
+                       args->channel_count = 1;
+                       args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
+                       if (!args->channel) {
+                               return -1;
+                       }
+                       args->channel[0] = ast_json_string_get(field);
+               }
+       }
+       field = ast_json_object_get(body, "role");
+       if (field) {
+               args->role = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /bridges/{bridgeId}/addChannel.
  * \param get_params GET parameters in the HTTP request.
@@ -321,7 +374,6 @@ static void ast_ari_bridges_add_channel_cb(
        struct ast_ari_bridges_add_channel_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -397,41 +449,9 @@ static void ast_ari_bridges_add_channel_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "channel");
-       if (field) {
-               /* If they were silly enough to both pass in a query param and a
-                * JSON body, free up the query value.
-                */
-               ast_free(args.channel);
-               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
-                       /* Multiple param passed as array */
-                       size_t i;
-                       args.channel_count = ast_json_array_size(field);
-                       args.channel = ast_malloc(sizeof(*args.channel) * args.channel_count);
-
-                       if (!args.channel) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-
-                       for (i = 0; i < args.channel_count; ++i) {
-                               args.channel[i] = ast_json_string_get(ast_json_array_get(field, i));
-                       }
-               } else {
-                       /* Multiple param passed as single value */
-                       args.channel_count = 1;
-                       args.channel = ast_malloc(sizeof(*args.channel) * args.channel_count);
-                       if (!args.channel) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-                       args.channel[0] = ast_json_string_get(field);
-               }
-       }
-       field = ast_json_object_get(body, "role");
-       if (field) {
-               args.role = ast_json_string_get(field);
+       if (ast_ari_bridges_add_channel_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_bridges_add_channel(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -471,6 +491,44 @@ fin: __attribute__((unused))
        ast_free(args.channel);
        return;
 }
+int ast_ari_bridges_remove_channel_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_remove_channel_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "channel");
+       if (field) {
+               /* If they were silly enough to both pass in a query param and a
+                * JSON body, free up the query value.
+                */
+               ast_free(args->channel);
+               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
+                       /* Multiple param passed as array */
+                       size_t i;
+                       args->channel_count = ast_json_array_size(field);
+                       args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
+
+                       if (!args->channel) {
+                               return -1;
+                       }
+
+                       for (i = 0; i < args->channel_count; ++i) {
+                               args->channel[i] = ast_json_string_get(ast_json_array_get(field, i));
+                       }
+               } else {
+                       /* Multiple param passed as single value */
+                       args->channel_count = 1;
+                       args->channel = ast_malloc(sizeof(*args->channel) * args->channel_count);
+                       if (!args->channel) {
+                               return -1;
+                       }
+                       args->channel[0] = ast_json_string_get(field);
+               }
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /bridges/{bridgeId}/removeChannel.
  * \param get_params GET parameters in the HTTP request.
@@ -486,7 +544,6 @@ static void ast_ari_bridges_remove_channel_cb(
        struct ast_ari_bridges_remove_channel_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -559,37 +616,9 @@ static void ast_ari_bridges_remove_channel_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "channel");
-       if (field) {
-               /* If they were silly enough to both pass in a query param and a
-                * JSON body, free up the query value.
-                */
-               ast_free(args.channel);
-               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
-                       /* Multiple param passed as array */
-                       size_t i;
-                       args.channel_count = ast_json_array_size(field);
-                       args.channel = ast_malloc(sizeof(*args.channel) * args.channel_count);
-
-                       if (!args.channel) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-
-                       for (i = 0; i < args.channel_count; ++i) {
-                               args.channel[i] = ast_json_string_get(ast_json_array_get(field, i));
-                       }
-               } else {
-                       /* Multiple param passed as single value */
-                       args.channel_count = 1;
-                       args.channel = ast_malloc(sizeof(*args.channel) * args.channel_count);
-                       if (!args.channel) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-                       args.channel[0] = ast_json_string_get(field);
-               }
+       if (ast_ari_bridges_remove_channel_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_bridges_remove_channel(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -629,6 +658,19 @@ fin: __attribute__((unused))
        ast_free(args.channel);
        return;
 }
+int ast_ari_bridges_start_moh_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_start_moh_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "mohClass");
+       if (field) {
+               args->moh_class = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /bridges/{bridgeId}/moh.
  * \param get_params GET parameters in the HTTP request.
@@ -644,7 +686,6 @@ static void ast_ari_bridges_start_moh_cb(
        struct ast_ari_bridges_start_moh_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -677,10 +718,9 @@ static void ast_ari_bridges_start_moh_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "mohClass");
-       if (field) {
-               args.moh_class = ast_json_string_get(field);
+       if (ast_ari_bridges_start_moh_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_bridges_start_moh(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -776,6 +816,31 @@ static void ast_ari_bridges_stop_moh_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_bridges_play_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_play_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "media");
+       if (field) {
+               args->media = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "lang");
+       if (field) {
+               args->lang = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "offsetms");
+       if (field) {
+               args->offsetms = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "skipms");
+       if (field) {
+               args->skipms = ast_json_integer_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /bridges/{bridgeId}/play.
  * \param get_params GET parameters in the HTTP request.
@@ -791,7 +856,6 @@ static void ast_ari_bridges_play_cb(
        struct ast_ari_bridges_play_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -833,22 +897,9 @@ static void ast_ari_bridges_play_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "media");
-       if (field) {
-               args.media = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "lang");
-       if (field) {
-               args.lang = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "offsetms");
-       if (field) {
-               args.offsetms = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "skipms");
-       if (field) {
-               args.skipms = ast_json_integer_get(field);
+       if (ast_ari_bridges_play_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_bridges_play(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -884,6 +935,43 @@ static void ast_ari_bridges_play_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_bridges_record_parse_body(
+       struct ast_json *body,
+       struct ast_ari_bridges_record_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "name");
+       if (field) {
+               args->name = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "format");
+       if (field) {
+               args->format = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "maxDurationSeconds");
+       if (field) {
+               args->max_duration_seconds = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "maxSilenceSeconds");
+       if (field) {
+               args->max_silence_seconds = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "ifExists");
+       if (field) {
+               args->if_exists = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "beep");
+       if (field) {
+               args->beep = ast_json_is_true(field);
+       }
+       field = ast_json_object_get(body, "terminateOn");
+       if (field) {
+               args->terminate_on = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /bridges/{bridgeId}/record.
  * \param get_params GET parameters in the HTTP request.
@@ -899,7 +987,6 @@ static void ast_ari_bridges_record_cb(
        struct ast_ari_bridges_record_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -950,34 +1037,9 @@ static void ast_ari_bridges_record_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "name");
-       if (field) {
-               args.name = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "format");
-       if (field) {
-               args.format = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "maxDurationSeconds");
-       if (field) {
-               args.max_duration_seconds = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "maxSilenceSeconds");
-       if (field) {
-               args.max_silence_seconds = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "ifExists");
-       if (field) {
-               args.if_exists = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "beep");
-       if (field) {
-               args.beep = ast_json_is_true(field);
-       }
-       field = ast_json_object_get(body, "terminateOn");
-       if (field) {
-               args.terminate_on = ast_json_string_get(field);
+       if (ast_ari_bridges_record_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_bridges_record(headers, &args, response);
 #if defined(AST_DEVMODE)
index 40ad32b2b895f8ecf958a95808052f54784d27f3..12ef16843bb5e11976bcaa0eccf244f7dae81ddc 100644 (file)
@@ -102,6 +102,47 @@ static void ast_ari_channels_list_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_originate_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_originate_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "endpoint");
+       if (field) {
+               args->endpoint = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "extension");
+       if (field) {
+               args->extension = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "context");
+       if (field) {
+               args->context = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "priority");
+       if (field) {
+               args->priority = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "app");
+       if (field) {
+               args->app = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "appArgs");
+       if (field) {
+               args->app_args = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "callerId");
+       if (field) {
+               args->caller_id = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "timeout");
+       if (field) {
+               args->timeout = ast_json_integer_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels.
  * \param get_params GET parameters in the HTTP request.
@@ -117,7 +158,6 @@ static void ast_ari_channels_originate_cb(
        struct ast_ari_channels_originate_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -165,39 +205,7 @@ static void ast_ari_channels_originate_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "endpoint");
-       if (field) {
-               args.endpoint = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "extension");
-       if (field) {
-               args.extension = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "context");
-       if (field) {
-               args.context = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "priority");
-       if (field) {
-               args.priority = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "app");
-       if (field) {
-               args.app = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "appArgs");
-       if (field) {
-               args.app_args = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "callerId");
-       if (field) {
-               args.caller_id = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "timeout");
-       if (field) {
-               args.timeout = ast_json_integer_get(field);
-       }
+       args.variables = ast_json_ref(body);
        ast_ari_channels_originate(headers, &args, response);
 #if defined(AST_DEVMODE)
        code = response->response_code;
@@ -290,6 +298,19 @@ static void ast_ari_channels_get_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_hangup_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_hangup_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "reason");
+       if (field) {
+               args->reason = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}.
  * \param get_params GET parameters in the HTTP request.
@@ -305,7 +326,6 @@ static void ast_ari_channels_hangup_cb(
        struct ast_ari_channels_hangup_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -338,10 +358,9 @@ static void ast_ari_channels_hangup_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "reason");
-       if (field) {
-               args.reason = ast_json_string_get(field);
+       if (ast_ari_channels_hangup_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_hangup(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -377,6 +396,27 @@ static void ast_ari_channels_hangup_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_continue_in_dialplan_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_continue_in_dialplan_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "context");
+       if (field) {
+               args->context = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "extension");
+       if (field) {
+               args->extension = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "priority");
+       if (field) {
+               args->priority = ast_json_integer_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/continue.
  * \param get_params GET parameters in the HTTP request.
@@ -392,7 +432,6 @@ static void ast_ari_channels_continue_in_dialplan_cb(
        struct ast_ari_channels_continue_in_dialplan_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -431,18 +470,9 @@ static void ast_ari_channels_continue_in_dialplan_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "context");
-       if (field) {
-               args.context = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "extension");
-       if (field) {
-               args.extension = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "priority");
-       if (field) {
-               args.priority = ast_json_integer_get(field);
+       if (ast_ari_channels_continue_in_dialplan_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_continue_in_dialplan(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -658,6 +688,35 @@ static void ast_ari_channels_ring_stop_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_send_dtmf_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_send_dtmf_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "dtmf");
+       if (field) {
+               args->dtmf = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "before");
+       if (field) {
+               args->before = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "between");
+       if (field) {
+               args->between = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "duration");
+       if (field) {
+               args->duration = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "after");
+       if (field) {
+               args->after = ast_json_integer_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/dtmf.
  * \param get_params GET parameters in the HTTP request.
@@ -673,7 +732,6 @@ static void ast_ari_channels_send_dtmf_cb(
        struct ast_ari_channels_send_dtmf_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -718,26 +776,9 @@ static void ast_ari_channels_send_dtmf_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "dtmf");
-       if (field) {
-               args.dtmf = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "before");
-       if (field) {
-               args.before = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "between");
-       if (field) {
-               args.between = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "duration");
-       if (field) {
-               args.duration = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "after");
-       if (field) {
-               args.after = ast_json_integer_get(field);
+       if (ast_ari_channels_send_dtmf_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_send_dtmf(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -774,6 +815,19 @@ static void ast_ari_channels_send_dtmf_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_mute_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_mute_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "direction");
+       if (field) {
+               args->direction = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/mute.
  * \param get_params GET parameters in the HTTP request.
@@ -789,7 +843,6 @@ static void ast_ari_channels_mute_cb(
        struct ast_ari_channels_mute_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -822,10 +875,9 @@ static void ast_ari_channels_mute_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "direction");
-       if (field) {
-               args.direction = ast_json_string_get(field);
+       if (ast_ari_channels_mute_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_mute(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -861,6 +913,19 @@ static void ast_ari_channels_mute_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_unmute_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_unmute_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "direction");
+       if (field) {
+               args->direction = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/mute.
  * \param get_params GET parameters in the HTTP request.
@@ -876,7 +941,6 @@ static void ast_ari_channels_unmute_cb(
        struct ast_ari_channels_unmute_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -909,10 +973,9 @@ static void ast_ari_channels_unmute_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "direction");
-       if (field) {
-               args.direction = ast_json_string_get(field);
+       if (ast_ari_channels_unmute_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_unmute(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -1068,6 +1131,19 @@ static void ast_ari_channels_unhold_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_start_moh_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_start_moh_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "mohClass");
+       if (field) {
+               args->moh_class = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/moh.
  * \param get_params GET parameters in the HTTP request.
@@ -1083,7 +1159,6 @@ static void ast_ari_channels_start_moh_cb(
        struct ast_ari_channels_start_moh_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -1116,10 +1191,9 @@ static void ast_ari_channels_start_moh_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "mohClass");
-       if (field) {
-               args.moh_class = ast_json_string_get(field);
+       if (ast_ari_channels_start_moh_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_start_moh(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -1335,6 +1409,31 @@ static void ast_ari_channels_stop_silence_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_play_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_play_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "media");
+       if (field) {
+               args->media = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "lang");
+       if (field) {
+               args->lang = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "offsetms");
+       if (field) {
+               args->offsetms = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "skipms");
+       if (field) {
+               args->skipms = ast_json_integer_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/play.
  * \param get_params GET parameters in the HTTP request.
@@ -1350,7 +1449,6 @@ static void ast_ari_channels_play_cb(
        struct ast_ari_channels_play_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -1392,22 +1490,9 @@ static void ast_ari_channels_play_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "media");
-       if (field) {
-               args.media = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "lang");
-       if (field) {
-               args.lang = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "offsetms");
-       if (field) {
-               args.offsetms = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "skipms");
-       if (field) {
-               args.skipms = ast_json_integer_get(field);
+       if (ast_ari_channels_play_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_play(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -1443,6 +1528,43 @@ static void ast_ari_channels_play_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_record_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_record_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "name");
+       if (field) {
+               args->name = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "format");
+       if (field) {
+               args->format = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "maxDurationSeconds");
+       if (field) {
+               args->max_duration_seconds = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "maxSilenceSeconds");
+       if (field) {
+               args->max_silence_seconds = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "ifExists");
+       if (field) {
+               args->if_exists = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "beep");
+       if (field) {
+               args->beep = ast_json_is_true(field);
+       }
+       field = ast_json_object_get(body, "terminateOn");
+       if (field) {
+               args->terminate_on = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/record.
  * \param get_params GET parameters in the HTTP request.
@@ -1458,7 +1580,6 @@ static void ast_ari_channels_record_cb(
        struct ast_ari_channels_record_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -1509,34 +1630,9 @@ static void ast_ari_channels_record_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "name");
-       if (field) {
-               args.name = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "format");
-       if (field) {
-               args.format = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "maxDurationSeconds");
-       if (field) {
-               args.max_duration_seconds = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "maxSilenceSeconds");
-       if (field) {
-               args.max_silence_seconds = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "ifExists");
-       if (field) {
-               args.if_exists = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "beep");
-       if (field) {
-               args.beep = ast_json_is_true(field);
-       }
-       field = ast_json_object_get(body, "terminateOn");
-       if (field) {
-               args.terminate_on = ast_json_string_get(field);
+       if (ast_ari_channels_record_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_record(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -1574,6 +1670,19 @@ static void ast_ari_channels_record_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_get_channel_var_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_get_channel_var_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "variable");
+       if (field) {
+               args->variable = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/variable.
  * \param get_params GET parameters in the HTTP request.
@@ -1589,7 +1698,6 @@ static void ast_ari_channels_get_channel_var_cb(
        struct ast_ari_channels_get_channel_var_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -1622,10 +1730,9 @@ static void ast_ari_channels_get_channel_var_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "variable");
-       if (field) {
-               args.variable = ast_json_string_get(field);
+       if (ast_ari_channels_get_channel_var_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_get_channel_var(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -1662,6 +1769,23 @@ static void ast_ari_channels_get_channel_var_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_set_channel_var_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_set_channel_var_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "variable");
+       if (field) {
+               args->variable = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "value");
+       if (field) {
+               args->value = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/variable.
  * \param get_params GET parameters in the HTTP request.
@@ -1677,7 +1801,6 @@ static void ast_ari_channels_set_channel_var_cb(
        struct ast_ari_channels_set_channel_var_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -1713,14 +1836,9 @@ static void ast_ari_channels_set_channel_var_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "variable");
-       if (field) {
-               args.variable = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "value");
-       if (field) {
-               args.value = ast_json_string_get(field);
+       if (ast_ari_channels_set_channel_var_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_set_channel_var(headers, &args, response);
 #if defined(AST_DEVMODE)
@@ -1757,6 +1875,31 @@ static void ast_ari_channels_set_channel_var_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_channels_snoop_channel_parse_body(
+       struct ast_json *body,
+       struct ast_ari_channels_snoop_channel_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "spy");
+       if (field) {
+               args->spy = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "whisper");
+       if (field) {
+               args->whisper = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "app");
+       if (field) {
+               args->app = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "appArgs");
+       if (field) {
+               args->app_args = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/snoop.
  * \param get_params GET parameters in the HTTP request.
@@ -1772,7 +1915,6 @@ static void ast_ari_channels_snoop_channel_cb(
        struct ast_ari_channels_snoop_channel_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -1814,22 +1956,9 @@ static void ast_ari_channels_snoop_channel_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "spy");
-       if (field) {
-               args.spy = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "whisper");
-       if (field) {
-               args.whisper = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "app");
-       if (field) {
-               args.app = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "appArgs");
-       if (field) {
-               args.app_args = ast_json_string_get(field);
+       if (ast_ari_channels_snoop_channel_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_channels_snoop_channel(headers, &args, response);
 #if defined(AST_DEVMODE)
index a8079f13911271aef205d23f87ddc3d3146da3c6..5576a1859421056722a37c5d4dfb61074165087c 100644 (file)
@@ -160,6 +160,19 @@ static void ast_ari_device_states_get_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_device_states_update_parse_body(
+       struct ast_json *body,
+       struct ast_ari_device_states_update_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "deviceState");
+       if (field) {
+               args->device_state = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /deviceStates/{deviceName}.
  * \param get_params GET parameters in the HTTP request.
@@ -175,7 +188,6 @@ static void ast_ari_device_states_update_cb(
        struct ast_ari_device_states_update_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -208,10 +220,9 @@ static void ast_ari_device_states_update_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "deviceState");
-       if (field) {
-               args.device_state = ast_json_string_get(field);
+       if (ast_ari_device_states_update_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_device_states_update(headers, &args, response);
 #if defined(AST_DEVMODE)
index 842ff68134a4a363814d9d39212b2bef73d7fe3b..40e132e3eb2f505fd3bd76073091707bf2e40407 100644 (file)
@@ -161,6 +161,23 @@ static void ast_ari_mailboxes_get_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_mailboxes_update_parse_body(
+       struct ast_json *body,
+       struct ast_ari_mailboxes_update_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "oldMessages");
+       if (field) {
+               args->old_messages = ast_json_integer_get(field);
+       }
+       field = ast_json_object_get(body, "newMessages");
+       if (field) {
+               args->new_messages = ast_json_integer_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /mailboxes/{mailboxName}.
  * \param get_params GET parameters in the HTTP request.
@@ -176,7 +193,6 @@ static void ast_ari_mailboxes_update_cb(
        struct ast_ari_mailboxes_update_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -212,14 +228,9 @@ static void ast_ari_mailboxes_update_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "oldMessages");
-       if (field) {
-               args.old_messages = ast_json_integer_get(field);
-       }
-       field = ast_json_object_get(body, "newMessages");
-       if (field) {
-               args.new_messages = ast_json_integer_get(field);
+       if (ast_ari_mailboxes_update_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_mailboxes_update(headers, &args, response);
 #if defined(AST_DEVMODE)
index 429f00dc2159e5b4d7e94c934e68912851dd6c67..fee22c38b0ec420d22157a2c24b81b8c0d114e15 100644 (file)
@@ -169,6 +169,19 @@ static void ast_ari_playbacks_stop_cb(
 fin: __attribute__((unused))
        return;
 }
+int ast_ari_playbacks_control_parse_body(
+       struct ast_json *body,
+       struct ast_ari_playbacks_control_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "operation");
+       if (field) {
+               args->operation = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /playbacks/{playbackId}/control.
  * \param get_params GET parameters in the HTTP request.
@@ -184,7 +197,6 @@ static void ast_ari_playbacks_control_cb(
        struct ast_ari_playbacks_control_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -217,10 +229,9 @@ static void ast_ari_playbacks_control_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "operation");
-       if (field) {
-               args.operation = ast_json_string_get(field);
+       if (ast_ari_playbacks_control_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_playbacks_control(headers, &args, response);
 #if defined(AST_DEVMODE)
index a3657d13baf8162c809ca9056657857baf2ef239..69c7d163e94a1e8a3e7b0936159c9ff32816e57a 100644 (file)
@@ -51,6 +51,23 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 #define MAX_VALS 128
 
+int ast_ari_sounds_list_parse_body(
+       struct ast_json *body,
+       struct ast_ari_sounds_list_args *args)
+{
+       struct ast_json *field;
+       /* Parse query parameters out of it */
+       field = ast_json_object_get(body, "lang");
+       if (field) {
+               args->lang = ast_json_string_get(field);
+       }
+       field = ast_json_object_get(body, "format");
+       if (field) {
+               args->format = ast_json_string_get(field);
+       }
+       return 0;
+}
+
 /*!
  * \brief Parameter parsing callback for /sounds.
  * \param get_params GET parameters in the HTTP request.
@@ -66,7 +83,6 @@ static void ast_ari_sounds_list_cb(
        struct ast_ari_sounds_list_args args = {};
        struct ast_variable *i;
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-       struct ast_json *field;
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
@@ -96,14 +112,9 @@ static void ast_ari_sounds_list_cb(
                        goto fin;
                }
        }
-       /* Parse query parameters out of it */
-       field = ast_json_object_get(body, "lang");
-       if (field) {
-               args.lang = ast_json_string_get(field);
-       }
-       field = ast_json_object_get(body, "format");
-       if (field) {
-               args.format = ast_json_string_get(field);
+       if (ast_ari_sounds_list_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
        ast_ari_sounds_list(headers, &args, response);
 #if defined(AST_DEVMODE)
index e389eb5d7b71b783a5635d825f3b3114847fdd10..e66d9b60429fa27e42f5fb450c6c565a9cad1286 100644 (file)
@@ -62,6 +62,19 @@ struct ast_ari_{{c_name}}_{{c_nickname}}_args {
 {{/parameters}}
 };
 {{#is_req}}
+{{#parse_body}}
+/*!
+ * \brief Body parsing function for {{path}}.
+ * \param body The JSON body from which to parse parameters.
+ * \param[out] args The args structure to parse into.
+ * \retval zero on success
+ * \retval non-zero on failure
+ */
+int ast_ari_{{c_name}}_{{c_nickname}}_parse_body(
+       struct ast_json *body,
+       struct ast_ari_{{c_name}}_{{c_nickname}}_args *args);
+
+{{/parse_body}}
 /*!
  * \brief {{summary}}
 {{#notes}}
index 7eb5bff6faa8f83667b39e02c5983ef3da8a060f..ef0f1673a2efe11ad59d57095d2bb56788f76be3 100644 (file)
@@ -203,8 +203,10 @@ class AsteriskProcessor(SwaggerPostProcessor):
 
     def process_parameter(self, parameter, context):
         if parameter.param_type == 'body':
+           parameter.is_body_parameter = True;
             parameter.c_data_type = 'struct ast_json *'
         else:
+           parameter.is_body_parameter = False;
             if not parameter.data_type in self.type_mapping:
                 raise SwaggerError(
                     "Invalid parameter type %s" % parameter.data_type, context)
diff --git a/rest-api-templates/body_parsing.mustache b/rest-api-templates/body_parsing.mustache
new file mode 100644 (file)
index 0000000..63cce0d
--- /dev/null
@@ -0,0 +1,71 @@
+{{!
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2014, Digium, Inc.
+ *
+ * William Kinsey Moore, III <kmoore@digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+}}
+{{!
+ * Snippet for decoding parameters into an _args struct.
+}}
+{{#parse_body}}
+int ast_ari_{{c_name}}_{{c_nickname}}_parse_body(
+       struct ast_json *body,
+       struct ast_ari_{{c_name}}_{{c_nickname}}_args *args)
+{
+{{#has_query_parameters}}
+       struct ast_json *field;
+{{/has_query_parameters}}
+       /* Parse query parameters out of it */
+{{#query_parameters}}
+{{^is_body_parameter}}
+       field = ast_json_object_get(body, "{{name}}");
+       if (field) {
+{{^allow_multiple}}
+               args->{{c_name}} = {{json_convert}}(field);
+{{/allow_multiple}}
+{{#allow_multiple}}
+               /* If they were silly enough to both pass in a query param and a
+                * JSON body, free up the query value.
+                */
+               ast_free(args->{{c_name}});
+               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
+                       /* Multiple param passed as array */
+                       size_t i;
+                       args->{{c_name}}_count = ast_json_array_size(field);
+                       args->{{c_name}} = ast_malloc(sizeof(*args->{{c_name}}) * args->{{c_name}}_count);
+
+                       if (!args->{{c_name}}) {
+                               return -1;
+                       }
+
+                       for (i = 0; i < args->{{c_name}}_count; ++i) {
+                               args->{{c_name}}[i] = {{json_convert}}(ast_json_array_get(field, i));
+                       }
+               } else {
+                       /* Multiple param passed as single value */
+                       args->{{c_name}}_count = 1;
+                       args->{{c_name}} = ast_malloc(sizeof(*args->{{c_name}}) * args->{{c_name}}_count);
+                       if (!args->{{c_name}}) {
+                               return -1;
+                       }
+                       args->{{c_name}}[0] = {{json_convert}}(field);
+               }
+{{/allow_multiple}}
+       }
+{{/is_body_parameter}}
+{{/query_parameters}}
+       return 0;
+}
+
+{{/parse_body}}
index 9d207386935243c00e6222c9cafcb83ca6418ff0..2dde4b33fad37f4abc9885a4ee988096eb4888a6 100644 (file)
        args.{{c_name}} = ast_json_ref(body);
 {{/body_parameter}}
 {{^body_parameter}}
-       /* Parse query parameters out of it */
-{{#query_parameters}}
-       field = ast_json_object_get(body, "{{name}}");
-       if (field) {
-{{^allow_multiple}}
-               args.{{c_name}} = {{json_convert}}(field);
-{{/allow_multiple}}
-{{#allow_multiple}}
-               /* If they were silly enough to both pass in a query param and a
-                * JSON body, free up the query value.
-                */
-               ast_free(args.{{c_name}});
-               if (ast_json_typeof(field) == AST_JSON_ARRAY) {
-                       /* Multiple param passed as array */
-                       size_t i;
-                       args.{{c_name}}_count = ast_json_array_size(field);
-                       args.{{c_name}} = ast_malloc(sizeof(*args.{{c_name}}) * args.{{c_name}}_count);
-
-                       if (!args.{{c_name}}) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-
-                       for (i = 0; i < args.{{c_name}}_count; ++i) {
-                               args.{{c_name}}[i] = {{json_convert}}(ast_json_array_get(field, i));
-                       }
-               } else {
-                       /* Multiple param passed as single value */
-                       args.{{c_name}}_count = 1;
-                       args.{{c_name}} = ast_malloc(sizeof(*args.{{c_name}}) * args.{{c_name}}_count);
-                       if (!args.{{c_name}}) {
-                               ast_ari_response_alloc_failed(response);
-                               goto fin;
-                       }
-                       args.{{c_name}}[0] = {{json_convert}}(field);
-               }
-{{/allow_multiple}}
+       if (ast_ari_{{c_name}}_{{c_nickname}}_parse_body(body, &args)) {
+               ast_ari_response_alloc_failed(response);
+               goto fin;
        }
-{{/query_parameters}}
 {{/body_parameter}}
 {{/parse_body}}
 {{/is_websocket}}
index d2823a87762b41dca535410f40cc7c97e1529da6..74681fc29816d947afcce99532430cec0787880a 100644 (file)
@@ -66,6 +66,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 {{#apis}}
 {{#operations}}
 {{#is_req}}
+{{> body_parsing}}
 /*!
  * \brief Parameter parsing callback for {{path}}.
  * \param get_params GET parameters in the HTTP request.
@@ -83,11 +84,6 @@ static void ast_ari_{{c_name}}_{{c_nickname}}_cb(
        struct ast_variable *i;
 {{/has_parameters}}
        RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
-{{^body_parameter}}
-{{#has_query_parameters}}
-       struct ast_json *field;
-{{/has_query_parameters}}
-{{/body_parameter}}
 #if defined(AST_DEVMODE)
        int is_valid;
        int code;
index 3b14c8fbb3dc2121494335c4f53406f4fe80b060..3ab6080cb474d99c1022ba16092d8eef28378fd5 100644 (file)
                                                        "allowMultiple": false,
                                                        "dataType": "int",
                                                        "defaultValue": 30
+                                               },
+                                               {
+                                                       "name": "variables",
+                                                       "description": "The 'variables' key in the body object holds variable key/value pairs to set on the channel on creation. Other keys in the body object are interpreted as query parameters. Ex. { 'endpoint': 'SIP/Alice', 'variables': { 'CALLERID(name)': 'Alice' } }",
+                                                       "paramType": "body",
+                                                       "required": false,
+                                                       "dataType": "containers",
+                                                       "allowMultiple": false
                                                }
                                        ],
                                        "errorResponses": [