diff options
Diffstat (limited to 'rest-api-templates/param_parsing.mustache')
-rw-r--r-- | rest-api-templates/param_parsing.mustache | 63 |
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}} |