/*! 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; }
char *http_get_content_type(const str *connection) { curl_con_t *conn = NULL; curl_con_pkg_t *pconn = NULL; /* Find connection if it exists */ if (!connection) { LM_ERR("No cURL connection specified\n"); return NULL; } 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 NULL; } pconn = curl_get_pkg_connection(conn); if (pconn == NULL) { LM_ERR("No cURL connection data found: %.*s\n", connection->len, connection->s); return NULL; } return pconn->result_content_type; }
/*! Run a query based on a connection definition */ int curl_con_query_url_f(struct sip_msg* _m, const str *connection, const str* url, str* result, const char *contenttype, const str* post, int failover) { curl_con_t *conn = NULL; curl_con_pkg_t *pconn = NULL; char *urlbuf = NULL; char *postdata = NULL; curl_query_t query_params; unsigned int maxdatasize = default_maxdatasize; int res; /* 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; } LM_DBG("******** CURL Connection found %.*s\n", connection->len, connection->s); maxdatasize = conn->maxdatasize; if (url && (url->len > 0) && (url->s != NULL)) { int url_len = conn->schema.len + 3 + conn->url.len + 1 + url->len + 1; urlbuf = pkg_malloc(url_len); if (urlbuf == NULL) { res = -1; goto error; } snprintf(urlbuf, url_len, "%.*s://%.*s%s%.*s", conn->schema.len, conn->schema.s, conn->url.len, conn->url.s, (url->s[0] == '/')? "" : "/", url->len, url->s); } else { int url_len = conn->schema.len + 3 + conn->url.len + 1; urlbuf = pkg_malloc(url_len); if (urlbuf == NULL) { res = -1; goto error; } snprintf(urlbuf, url_len, "%.*s://%.*s", conn->schema.len, conn->schema.s, conn->url.len, conn->url.s); } LM_DBG("***** #### ***** CURL URL: %s \n", urlbuf); if (post && (post->len > 0) && (post->s != NULL)) { /* Allocated using pkg_memory */ postdata = as_asciiz((str*)post); if (postdata == NULL) { ERR("Curl: No memory left\n"); res = -1; goto error; } LM_DBG("***** #### ***** CURL POST data: %s Content-type %s\n", postdata, contenttype); } memset(&query_params, 0, sizeof(curl_query_t)); query_params.username = conn->username; query_params.secret = conn->password; query_params.authmethod = conn->authmethod; query_params.contenttype = contenttype ? (char*)contenttype : "text/plain"; query_params.post = postdata; query_params.clientcert = conn->clientcert; query_params.clientkey = conn->clientkey; query_params.cacert = default_tls_cacert; query_params.ciphersuites = conn->ciphersuites; query_params.tlsversion = conn->tlsversion; query_params.verify_peer = conn->verify_peer; query_params.verify_host = conn->verify_host; query_params.timeout = conn->timeout; query_params.http_follow_redirect = conn->http_follow_redirect; query_params.keep_connections = conn->keep_connections; query_params.oneline = 0; query_params.maxdatasize = maxdatasize; query_params.http_proxy_port = conn->http_proxy_port; query_params.failovercon = conn->failover.s ? as_asciiz(&conn->failover) : NULL; query_params.pconn = pconn; if (conn->http_proxy) { query_params.http_proxy = conn->http_proxy; LM_DBG("****** ##### CURL proxy [%s] \n", query_params.http_proxy); } else { LM_DBG("**** Curl HTTP_proxy not set \n"); } res = curL_query_url(_m, urlbuf, result, &query_params); if (res > 1000 && conn->failover.s) { int counter = failover + 1; if (counter >= 2) { LM_DBG("**** No more failovers - returning failure\n"); return (res - 1000); } /* Time for failover */ return curl_con_query_url_f(_m, &conn->failover, url, result, contenttype, post, counter); } LM_DBG("***** #### ***** CURL DONE : %s \n", urlbuf); error: if (urlbuf != NULL) { pkg_free(urlbuf); } if (postdata != NULL) { pkg_free(postdata); } return res; }