Module: sip-router Branch: carstenbock/utils_post Commit: a2a8be3cf61451e7dbe4c629fd6c87f36d80113e URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=a2a8be3c...
Author: Carsten Bock carsten@ng-voice.com Committer: Carsten Bock carsten@ng-voice.com Date: Wed Aug 21 20:02:23 2013 +0200
Add support for sending POST-Requests to http_query() method.
---
modules/utils/doc/utils.xml | 12 ++++++++++++ modules/utils/doc/utils_admin.xml | 20 ++++++++++++++++++-- modules/utils/functions.c | 32 +++++++++++++++++++++++++++++--- modules/utils/functions.h | 3 ++- modules/utils/utils.c | 28 +++++++++++++++++++++++++--- 5 files changed, 86 insertions(+), 9 deletions(-)
diff --git a/modules/utils/doc/utils.xml b/modules/utils/doc/utils.xml index dfdb290..49b2cbb 100644 --- a/modules/utils/doc/utils.xml +++ b/modules/utils/doc/utils.xml @@ -21,11 +21,23 @@ <email>jh@tutpro.com</email> </address> </author> + <author> + <firstname>Carsten</firstname> + <surname>Bock</surname> + <affiliation><orgname>ng-voice GmbH</orgname></affiliation> + <address> + <email>carsten@ng-voice.com</email> + </address> + </author> </authorgroup> <copyright> <year>2008-2009</year> <holder>Juha Heinanen</holder> </copyright> + <copyright> + <year>2013</year> + <holder>Carsten Bock, ng-voice GmbH</holder> + </copyright> </bookinfo> <toc></toc> diff --git a/modules/utils/doc/utils_admin.xml b/modules/utils/doc/utils_admin.xml index ab59350..3600f7d 100644 --- a/modules/utils/doc/utils_admin.xml +++ b/modules/utils/doc/utils_admin.xml @@ -158,13 +158,18 @@ modparam("utils", "xcap_table", "pres_xcap") <title>Functions</title> <section id="utils.f.http_query"> <title> - <function moreinfo="none">http_query(url, result)</function> + <function moreinfo="none">http_query(url, [post-data], result)</function> </title> <para> - Sends HTTP GET request according to URL given in + Sends HTTP GET or POST request according to URL given in <quote>url</quote> parameter, which is a string that may contain pseudo variables. </para> + <para> + If you want to make a POST-Request, you have to define + the <quote>post</quote>-data, that should be submitted + in that request as the second parameter. + </para> <para> If HTTP server returns a class 2xx or 3xx reply, the first line of the reply's body (if any) is @@ -183,6 +188,7 @@ modparam("utils", "xcap_table", "pres_xcap") <title><function>http_query()</function> usage</title> <programlisting format="linespecific"> ... +# GET-Request http_query("http://tutpro.com/index.php?r_uri=$(ru%7Bs.escape.param%7D)&f_uri=$(fu%7...)", "$var(result)") switch ($retcode) { @@ -190,6 +196,16 @@ switch ($retcode) { } ... </programlisting> + <programlisting format="linespecific"> +... +# POST-Request +http_query("http://tutpro.com/index.php", "r_uri=$(ru{s.escape.param})&f_uri=$(fu{s.escape.param})", + "$var(result)") +switch ($retcode) { + ... +} +... + </programlisting> </example> </section> <section id="utils.f.xcap_auth_status"> diff --git a/modules/utils/functions.c b/modules/utils/functions.c index aadfdd5..1225ba8 100644 --- a/modules/utils/functions.c +++ b/modules/utils/functions.c @@ -2,6 +2,7 @@ * script functions of utils module * * Copyright (C) 2008 Juha Heinanen + * Copyright (C) 2013 Carsten Bock, ng-voice GmbH * * This file is part of Kamailio, a free SIP server. * @@ -70,12 +71,12 @@ size_t write_function( void *ptr, size_t size, size_t nmemb, void *stream) * Performs http_query and saves possible result (first body line of reply) * to pvar. */ -int http_query(struct sip_msg* _m, char* _url, char* _dst) +int http_query(struct sip_msg* _m, char* _url, char* _dst, char* _post) { CURL *curl; CURLcode res; - str value; - char *url, *at; + str value, post_value; + char *url, *at, *post; char* stream; long stat; pv_spec_t *dst; @@ -103,6 +104,28 @@ int http_query(struct sip_msg* _m, char* _url, char* _dst) *(url + value.len) = (char)0; curl_easy_setopt(curl, CURLOPT_URL, url);
+ if (_post) { + /* Now specify we want to POST data */ + curl_easy_setopt(curl, CURLOPT_POST, 1L); + + if (fixup_get_svalue(_m, (gparam_p)_post, &post_value) != 0) { + LM_ERR("cannot get post value\n"); + pkg_free(url); + return -1; + } + post = pkg_malloc(post_value.len + 1); + if (post == NULL) { + curl_easy_cleanup(curl); + pkg_free(url); + LM_ERR("cannot allocate pkg memory for post\n"); + return -1; + } + memcpy(post, post_value.s, post_value.len); + *(post + post_value.len) = (char)0; + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post); + } + + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, (long)1); curl_easy_setopt(curl, CURLOPT_TIMEOUT, (long)http_query_timeout);
@@ -112,6 +135,9 @@ int http_query(struct sip_msg* _m, char* _url, char* _dst)
res = curl_easy_perform(curl); pkg_free(url); + if (_post) { + pkg_free(post); + } curl_easy_cleanup(curl);
if (res != CURLE_OK) { diff --git a/modules/utils/functions.h b/modules/utils/functions.h index 5e666f9..910a4d5 100644 --- a/modules/utils/functions.h +++ b/modules/utils/functions.h @@ -2,6 +2,7 @@ * headers of script functions of utils module * * Copyright (C) 2008 Juha Heinanen + * Copyright (C) 2013 Carsten Bock, ng-voice GmbH * * This file is part of Kamailio, a free SIP server. * @@ -39,7 +40,7 @@ * Performs http_query and saves possible result (first body line of reply) * to pvar. */ -int http_query(struct sip_msg* _m, char* _page, char* _params, char* _dst); +int http_query(struct sip_msg* _m, char* _url, char* _dst, char* _post);
#endif /* UTILS_FUNCTIONS_H */ diff --git a/modules/utils/utils.c b/modules/utils/utils.c index b734a69..8109a11 100644 --- a/modules/utils/utils.c +++ b/modules/utils/utils.c @@ -3,6 +3,7 @@ * * Copyright (C) 2008 Juha Heinanen * Copyright (C) 2009 1&1 Internet AG + * Copyright (C) 2013 Carsten Bock, ng-voice GmbH * * This file is part of Kamailio, a free SIP server. * @@ -91,12 +92,19 @@ static void destroy(void); static int fixup_http_query(void** param, int param_no); static int fixup_free_http_query(void** param, int param_no);
+/* Wrappers for http_query to be defined later */ +static int w_http_query(struct sip_msg* _m, char* _url, char* _result); +static int w_http_query_post(struct sip_msg* _m, char* _url, char* _post, char* _result); + /* forward function */ int utils_forward(struct sip_msg *msg, int id, int proto);
/* Exported functions */ static cmd_export_t cmds[] = { - {"http_query", (cmd_function)http_query, 2, fixup_http_query, + {"http_query", (cmd_function)w_http_query, 2, fixup_http_query, + fixup_free_http_query, + REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE}, + {"http_query", (cmd_function)w_http_query_post, 3, fixup_http_query, fixup_free_http_query, REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE}, {"xcap_auth_status", (cmd_function)xcap_auth_status, 2, fixup_pvar_pvar, @@ -325,7 +333,7 @@ static int fixup_http_query(void** param, int param_no) return fixup_spve_null(param, 1); }
- if (param_no == 2) { + if ((param_no == 2) || (param_no == 3)) { if (fixup_pvar_null(param, 1) != 0) { LM_ERR("failed to fixup result pvar\n"); return -1; @@ -351,7 +359,7 @@ static int fixup_free_http_query(void** param, int param_no) return 0; }
- if (param_no == 2) { + if ((param_no == 2) || (param_no == 3)) { return fixup_free_pvar_null(param, 1); }
@@ -359,6 +367,20 @@ static int fixup_free_http_query(void** param, int param_no) return -1; }
+/* + * Wrapper for HTTP-Query (GET) + */ +static int w_http_query(struct sip_msg* _m, char* _url, char* _result) { + return http_query(_m, _url, _result, NULL); +} + + +/* + * Wrapper for HTTP-Query (POST-Variant) + */ +static int w_http_query_post(struct sip_msg* _m, char* _url, char* _post, char* _result) { + return http_query(_m, _url, _result, _post); +}
/*! * \brief checks precondition, switch, filter and forwards msg if necessary