/** * Creates and initializes a new Ecore_Con_Url connection object. * * Creates and initializes a new Ecore_Con_Url connection object that can be * uesd for sending requests. * * @param url URL that will receive requests. Can be changed using * ecore_con_url_url_set. * * @return NULL on error, a new Ecore_Con_Url on success. * * @ingroup Ecore_Con_Url_Group * * @see ecore_con_url_custom_new() * @see ecore_con_url_url_set() */ EAPI Ecore_Con_Url * ecore_con_url_new(const char *url) { #ifdef HAVE_CURL Ecore_Con_Url *url_con; if (!init_count) return NULL; url_con = calloc(1, sizeof(Ecore_Con_Url)); if (!url_con) return NULL; url_con->curl_easy = curl_easy_init(); if (!url_con->curl_easy) { free(url_con); return NULL; } ECORE_MAGIC_SET(url_con, ECORE_MAGIC_CON_URL); ecore_con_url_url_set(url_con, url); curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION, _ecore_con_url_data_cb); curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEDATA, url_con); curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION, _ecore_con_url_progress_cb); curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con); curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE); curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION, _ecore_con_url_header_cb); curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERDATA, url_con); /* * FIXME: Check that these timeouts are sensible defaults * FIXME: Provide a means to change these timeouts */ curl_easy_setopt(url_con->curl_easy, CURLOPT_CONNECTTIMEOUT, 30); curl_easy_setopt(url_con->curl_easy, CURLOPT_TIMEOUT, 300); curl_easy_setopt(url_con->curl_easy, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING, "gzip,deflate"); url_con->fd = -1; url_con->write_fd = -1; url_con->additional_headers = NULL; url_con->response_headers = NULL; return url_con; #else return NULL; url = NULL; #endif }
/** * Makes a FTP upload * @return FIXME: To be more documented. * @ingroup Ecore_Con_Url_Group */ EAPI int ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const char *filename, const char *user, const char *pass, const char *upload_dir) { #ifdef HAVE_CURL char url[4096]; char userpwd[4096]; FILE *fd; struct stat file_info; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_ftp_upload"); return 0; } if (url_con->active) return 0; if (!url_con->url) return 0; if (filename) { char tmp[PATH_MAX]; snprintf(tmp, PATH_MAX, "%s", filename); if (stat(filename, &file_info)) return 0; fd = fopen(filename, "rb"); if (upload_dir) snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url, upload_dir, basename(tmp)); else snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url, basename(tmp)); snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass); curl_easy_setopt(url_con->curl_easy, CURLOPT_INFILESIZE_LARGE, (curl_off_t)file_info.st_size); curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd); curl_easy_setopt(url_con->curl_easy, CURLOPT_UPLOAD, 1); curl_easy_setopt(url_con->curl_easy, CURLOPT_READFUNCTION, _ecore_con_url_read_cb); curl_easy_setopt(url_con->curl_easy, CURLOPT_READDATA, fd); ecore_con_url_url_set(url_con, url); return _ecore_con_url_perform(url_con); } else return 0; #else return 0; url_con = NULL; filename = NULL; user = NULL; pass = NULL; upload_dir = NULL; #endif }
static Eina_Bool _url_compl_cb(void *data, int type EINA_UNUSED, void *event_info) { url_test *info = data; Ecore_Con_Event_Url_Complete *ev = event_info; printf("Total downloaded bytes = %d\n", ecore_con_url_received_bytes_get(ev->url_con)); if (info->_tmpfd) { _free_url_test(info); ecore_con_url_free(ev->url_con); } else { fail_unless(ecore_con_url_url_set(ev->url_con, "ftp://ftp.kernel.org/pub/linux/kernel/README")); ecore_con_url_verbose_set (ev->url_con, EINA_FALSE); info->_tmpfd = eina_file_mkstemp("ecore_con_test_XXXXXX.html", &(info->_test_file)); if (info->_tmpfd < 0) { free(info); ecore_con_url_free(ev->url_con); fail(); } ecore_con_url_fd_set(ev->url_con, info->_tmpfd); if (!ecore_con_url_get(ev->url_con)) { _free_url_test(info); ecore_con_url_free(ev->url_con); fail(); } } return EINA_FALSE; }