diff --git a/modules/curl/curl.c b/modules/curl/curl.c index ae9f464c887..a4856044818 100644 --- a/modules/curl/curl.c +++ b/modules/curl/curl.c @@ -389,7 +389,8 @@ static int fixup_curl_connect(void** param, int param_no) /* * Fix curl_connect params when posting (5 parameters): - * connection (string/pvar), url (string with pvars), content-type, data (string/pvar, pvar + * connection (string/pvar), url (string with pvars), content-type, + * data (string/pvar, pvar) */ static int fixup_curl_connect_post(void** param, int param_no) { @@ -397,12 +398,12 @@ static int fixup_curl_connect_post(void** param, int param_no) str s; pv_elem_t *pv = NULL; - if (param_no == 1 || param_no == 2 || param_no == 3) { + if (param_no == 1 || param_no == 3) { /* We want char * strings */ - /* At some point we need to allow pvars in the string. */ return 0; } - if (param_no == 4) { + /* URL and data may contain pvar */ + if (param_no == 4 || param_no == 2) { s.s = (char*)(*param); s.len = strlen(s.s); diff --git a/modules/curl/functions.c b/modules/curl/functions.c index 4c9961e05a5..214eb326cfc 100644 --- a/modules/curl/functions.c +++ b/modules/curl/functions.c @@ -264,6 +264,9 @@ int curl_con_query_url(struct sip_msg* _m, char *connection, char* _url, char* _ char passwordbuf[BUFSIZ/2]; char connurlbuf[BUFSIZ/2]; char urlbuf[512]; + str urlbuf2; + char *urlbuf3 = NULL; + unsigned int len = 0; str postdatabuf; char *postdata = NULL; @@ -292,9 +295,41 @@ int curl_con_query_url(struct sip_msg* _m, char *connection, char* _url, char* _ strncpy(passwordbuf, conn->password.s, conn->password.len); strncpy(connurlbuf, conn->url.s, conn->url.len); - strncpy(urlbuf,conn->schema.s, conn->schema.len); - snprintf(&urlbuf[conn->schema.len],(sizeof(urlbuf) - conn->schema.len), "://%s%s%s", connurlbuf, - (_url[0] && _url[0] == '/')?"":(_url[0] != '\0' ? "/": ""), _url); + LM_DBG("******** CURL Connection found %s\n", connection); + + if (_url && *_url) { + if(pv_printf_s(_m, (pv_elem_t*) _url, &urlbuf2) != 0) { + LM_ERR("curl :: unable to handle post data %s\n", _url); + return -1; + } + if(urlbuf2.s==NULL || urlbuf2.len == 0) { + LM_ERR("curl :: invalid url parameter\n"); + return -1; + } + LM_DBG("******** CURL Connection URL parsed for %s\n", connection); + /* Allocated using pkg_memory */ + urlbuf3 = as_asciiz(&urlbuf2); + if (urlbuf3 == NULL) { + ERR("Curl: No memory left\n"); + return -1; + } + LM_DBG("******** CURL URL string after PV parsing %s\n", urlbuf3); + } else { + LM_DBG("******** CURL URL string NULL no PV parsing %s\n", _url); + } + strncpy(urlbuf, conn->schema.s, conn->schema.len); + if (urlbuf3 != NULL) { + snprintf(&urlbuf[conn->schema.len],(sizeof(urlbuf) - conn->schema.len), "://%s%s%s", connurlbuf, + (urlbuf3[0] && urlbuf3[0] == '/')?"":(urlbuf3[0] != '\0' ? "/": ""), urlbuf3); + } else { + snprintf(&urlbuf[conn->schema.len],(sizeof(urlbuf) - conn->schema.len), "://%s%s%s", connurlbuf, + (_url[0] && _url[0] == '/')?"":(_url[0] != '\0' ? "/": ""), _url); + } + + /* Release the memory allocated by as_asciiz */ + if (urlbuf3 != NULL) { + pkg_free(urlbuf3); + } LM_DBG("***** #### ***** CURL URL: %s \n", urlbuf); if (_post && *_post) { if(pv_printf_s(_m, (pv_elem_t*)_post, &postdatabuf) != 0) { @@ -319,6 +354,7 @@ int curl_con_query_url(struct sip_msg* _m, char *connection, char* _url, char* _ res = curL_query_url(_m, urlbuf, _result, usernamebuf, passwordbuf, (contenttype ? contenttype : "text/plain"), postdata, conn->timeout, conn->http_follow_redirect, 0, (unsigned int) maxdatasize ); + LM_DBG("***** #### ***** CURL DONE : %s \n", urlbuf); if (postdata != NULL) { pkg_free(postdata); }