Пример #1
0
/*! 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;
}
Пример #2
0
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;
}
Пример #3
0
/*! 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;
}