diff --git a/modules/http_client/functions.c b/modules/http_client/functions.c index a0e7d15f6a3..8a60e881e62 100644 --- a/modules/http_client/functions.c +++ b/modules/http_client/functions.c @@ -329,7 +329,6 @@ static int curL_query_url(struct sip_msg* _m, const char* _url, str* _dst, const } } /* Create a STR object */ - rval.s = stream.buf; rval.len = datasize; /* Duplicate string to return */ @@ -353,6 +352,40 @@ static int curL_query_url(struct sip_msg* _m, const char* _url, str* _dst, const return stat; } +/*! Run a query based on a connection definition */ +int curl_get_redirect(struct sip_msg* _m, const str *connection, str* result) +{ + curl_con_t *conn = NULL; + curl_con_pkg_t *pconn = NULL; + str rval; + result->s = NULL; + result->len = 0; + + /* Find connection if it exists */ + if (!connection) { + LM_ERR("No cURL connection specified\n"); + return -1; + } + LM_DBG("******** CURL Connection %.*s\n", connection->len, connection->s); + conn = curl_get_connection((str*)connection); + if (conn == NULL) { + LM_ERR("No cURL connection found: %.*s\n", connection->len, connection->s); + return -1; + } + pconn = curl_get_pkg_connection(conn); + if (pconn == NULL) { + LM_ERR("No cURL connection data found: %.*s\n", connection->len, connection->s); + return -1; + } + /* Create a STR object */ + rval.s = pconn->redirecturl; + rval.len = strlen(pconn->redirecturl); + /* Duplicate string to return */ + pkg_str_dup(result, &rval); + LM_DBG("curl last redirect URL: Length %d %.*s \n", rval.len, rval.len, rval.s); + + return 1; +} /*! Run a query based on a connection definition */ int curl_con_query_url(struct sip_msg* _m, const str *connection, const str* url, str* result, const char *contenttype, const str* post) diff --git a/modules/http_client/functions.h b/modules/http_client/functions.h index 55fb4c9a6c1..03a33181656 100644 --- a/modules/http_client/functions.h +++ b/modules/http_client/functions.h @@ -39,6 +39,9 @@ */ int curl_con_query_url(struct sip_msg* _m, const str *connection, const str* _url, str* _result, const char *contenttype, const str* _post); +/*! Get redirect URL from last connection pkg memory storage */ +int curl_get_redirect(struct sip_msg* _m, const str *connection, str* result); + /* diff --git a/modules/http_client/http_client.c b/modules/http_client/http_client.c index 1d1519c7646..e9160c24e76 100644 --- a/modules/http_client/http_client.c +++ b/modules/http_client/http_client.c @@ -107,12 +107,16 @@ static int fixup_curl_connect(void** param, int param_no); static int fixup_free_curl_connect(void** param, int param_no); static int fixup_curl_connect_post(void** param, int param_no); static int fixup_free_curl_connect_post(void** param, int param_no); +static int w_curl_connect_post(struct sip_msg* _m, char* _con, char * _url, char* _result, char* _ctype, char* _data); + +static int fixup_curl_get_redirect(void** param, int param_no); +static int fixup_free_curl_get_redirect(void** param, int param_no); +static int w_curl_get_redirect(struct sip_msg* _m, char* _con, char* _result); /* 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); static int w_curl_connect(struct sip_msg* _m, char* _con, char * _url, char* _result); -static int w_curl_connect_post(struct sip_msg* _m, char* _con, char * _url, char* _result, char* _ctype, char* _data); /* forward function */ static int curl_con_param(modparam_t type, void* val); @@ -121,6 +125,9 @@ static int pv_get_curlerror(struct sip_msg *msg, pv_param_t *param, pv_value_t * static int pv_parse_curlredirect(pv_spec_p sp, str *in); static int pv_get_curlredirect(struct sip_msg *msg, pv_param_t *param, pv_value_t *res); +static int pv_get_httpresult(struct sip_msg *msg, pv_param_t *param, pv_value_t *res); +static int pv_parse_httpresult(pv_spec_p sp, str *in); + /* Exported functions */ static cmd_export_t cmds[] = { {"http_client_query", (cmd_function)w_http_query, 2, fixup_http_query_get, @@ -135,6 +142,9 @@ static cmd_export_t cmds[] = { {"http_connect", (cmd_function)w_curl_connect_post, 5, fixup_curl_connect_post, fixup_free_curl_connect_post, REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE}, + {"http_get_redirect", (cmd_function)w_curl_get_redirect, 2, fixup_curl_get_redirect, + fixup_free_curl_get_redirect, + REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE}, {"bind_http_client", (cmd_function)bind_httpc_api, 0, 0, 0, 0}, }; @@ -166,11 +176,8 @@ static param_export_t params[] = { */ static pv_export_t mod_pvs[] = { {{"curlerror", (sizeof("curlerror")-1)}, /* Curl error codes */ - PVT_OTHER, pv_get_curlerror, 0, - pv_parse_curlerror, 0, 0, 0}, - {{"curlredirect", (sizeof("redirect")-1)}, /* Curl last redirect url - not implemented yet */ - PVT_OTHER, pv_get_curlredirect, 0, - pv_parse_curlredirect, 0, 0, 0}, + PVT_OTHER, pv_get_curlerror, 0, pv_parse_curlerror, 0, 0, 0}, + {{0, 0}, 0, 0, 0, 0, 0, 0, 0} }; @@ -492,7 +499,6 @@ static int fixup_free_curl_connect(void** param, int param_no) * Wrapper for Curl_connect (GET) */ static int w_curl_connect(struct sip_msg* _m, char* _con, char * _url, char* _result) { -/* int curl_con_query_url(struct sip_msg* _m, const str *connection, const str* _url, str* _result, const str *contenttype, const str* _post); */ str con = {NULL,0}; str url = {NULL,0}; @@ -720,31 +726,79 @@ static int pv_get_curlerror(struct sip_msg *msg, pv_param_t *param, pv_value_t * return pv_get_strval(msg, param, res, &curlerr); } -/*! - * Parse arguments to pv $curlredirect + +/* + * Fix curl_get_redirect params: connection(string/pvar) url (string that may contain pvars) and + * result (writable pvar). */ -static int pv_parse_curlredirect(pv_spec_p sp, str *in) +static int fixup_curl_get_redirect(void** param, int param_no) { - if(sp==NULL || in==NULL || in->len<=0) { - return -1; + if (param_no == 1) { /* Connection name */ + /* We want char * strings */ + return 0; + } + if (param_no == 2) { /* PVAR to store result in */ + if (fixup_pvar_null(param, 1) != 0) { + LM_ERR("failed to fixup result pvar\n"); + return -1; + } + if (((pv_spec_t *)(*param))->setf == NULL) { + LM_ERR("result pvar is not writeble\n"); + return -1; } - - // DO SOMETHING HERE return 0; + } + + LM_ERR("invalid parameter number <%d>\n", param_no); + return -1; } /* - * PV - return curl redirect URL for httpcon - * $curlredirect("httpcon"); + * Free curl_get_redirect params. */ -static int pv_get_curlredirect(struct sip_msg *msg, pv_param_t *param, pv_value_t *res) +static int fixup_free_curl_get_redirect(void** param, int param_no) { - str redirecturl; + if (param_no == 1) { + /* Char strings don't need freeing */ + return 0; + } + if (param_no == 2) { + return fixup_free_spve_null(param, 1); + } - if(param==NULL) { - return -1; + LM_ERR("invalid parameter number <%d>\n", param_no); + return -1; +} + +/* + * Wrapper for Curl_redirect + */ +static int w_curl_get_redirect(struct sip_msg* _m, char* _con, char* _result) { + + str con = {NULL,0}; + str result = {NULL,0}; + pv_spec_t *dst; + pv_value_t val; + int ret = 0; + + if (_con == NULL || _result == NULL) { + LM_ERR("Invalid parameter\n"); } + con.s = _con; + con.len = strlen(con.s); + + LM_DBG("**** Curl Connection %s Result var %s\n", _con, _result); - // DO SOMETHING HERE - return pv_get_strval(msg, param, res, &redirecturl); + ret = curl_get_redirect(_m, &con, &result); + + val.rs = result; + val.flags = PV_VAL_STR; + dst = (pv_spec_t *)_result; + dst->setf(_m, &dst->pvp, (int)EQ_T, &val); + + if (result.s != NULL) + pkg_free(result.s); + + return ret; } +