summaryrefslogtreecommitdiff
path: root/rest-api-templates/param_parsing.mustache
diff options
context:
space:
mode:
Diffstat (limited to 'rest-api-templates/param_parsing.mustache')
-rw-r--r--rest-api-templates/param_parsing.mustache63
1 files changed, 63 insertions, 0 deletions
diff --git a/rest-api-templates/param_parsing.mustache b/rest-api-templates/param_parsing.mustache
index aabd728fd..9d2073869 100644
--- a/rest-api-templates/param_parsing.mustache
+++ b/rest-api-templates/param_parsing.mustache
@@ -83,3 +83,66 @@
{}
}
{{/has_path_parameters}}
+{{^is_websocket}}
+{{#parse_body}}
+ /* Look for a JSON request entity */
+ body = ast_http_get_json(ser, headers);
+ if (!body) {
+ switch (errno) {
+ case EFBIG:
+ ast_ari_response_error(response, 413, "Request Entity Too Large", "Request body too large");
+ goto fin;
+ case ENOMEM:
+ ast_ari_response_error(response, 500, "Internal Server Error", "Error processing request");
+ goto fin;
+ case EIO:
+ ast_ari_response_error(response, 400, "Bad Request", "Error parsing request body");
+ goto fin;
+ }
+ }
+{{#body_parameter}}
+ 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}}
+ }
+{{/query_parameters}}
+{{/body_parameter}}
+{{/parse_body}}
+{{/is_websocket}}