On Fri, 8 Oct 2010 16:13:08 -0300 Raphael Kubo da Costa <[email protected]>
said:
this already seems to be in svn. :)
> Depending on the option being set by curl_easy_setopt, a return value
> different from CURL_OK can be returned (the same applies to curl_multi_*
> and CURLM_OK).
>
> This commit checks the return value from those calls and usually
> displays an error message with ERR() and returns -- in some cases, an
> error is shown but the function does not immediately return.
>
> A few lines of code have also been moved around in order to make
> returning from functions as harmless as possible.
> ---
> src/lib/ecore_con/ecore_con_url.c | 132 ++++++++++++++++++++++++++++
> +-------- 1 files changed, 103 insertions(+), 29 deletions(-)
>
> diff --git a/src/lib/ecore_con/ecore_con_url.c
> b/src/lib/ecore_con/ecore_con_url.c index be64054..e1b7935 100644
> --- a/src/lib/ecore_con/ecore_con_url.c
> +++ b/src/lib/ecore_con/ecore_con_url.c
> @@ -253,6 +253,7 @@ ecore_con_url_new(const char *url)
> {
> #ifdef HAVE_CURL
> Ecore_Con_Url *url_con;
> + CURLcode ret;
>
> if (!_init_count)
> return NULL;
> @@ -261,6 +262,9 @@ ecore_con_url_new(const char *url)
> if (!url_con)
> return NULL;
>
> + url_con->fd = -1;
> + url_con->write_fd = -1;
> +
> url_con->curl_easy = curl_easy_init();
> if (!url_con->curl_easy)
> {
> @@ -270,7 +274,20 @@ ecore_con_url_new(const char *url)
>
> ECORE_MAGIC_SET(url_con, ECORE_MAGIC_CON_URL);
>
> - ecore_con_url_url_set(url_con, url);
> + if (!ecore_con_url_url_set(url_con, url))
> + {
> + ecore_con_url_free(url_con);
> + return NULL;
> + }
> +
> + ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_ENCODING,
> "gzip,deflate");
> + if (ret != CURLE_OK)
> + {
> + ERR("Could not set CURLOPT_ENCODING to \"gzip,deflate\": %s",
> + curl_easy_strerror(ret));
> + ecore_con_url_free(url_con);
> + return NULL;
> + }
>
> curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEFUNCTION,
> _ecore_con_url_data_cb);
> @@ -293,13 +310,6 @@ ecore_con_url_new(const char *url)
> 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;
> @@ -328,6 +338,7 @@ ecore_con_url_custom_new(const char *url, const char
> *custom_request) {
> #ifdef HAVE_CURL
> Ecore_Con_Url *url_con;
> + CURLcode ret;
>
> if (!url)
> return NULL;
> @@ -340,7 +351,14 @@ ecore_con_url_custom_new(const char *url, const char
> *custom_request) if (!url_con)
> return NULL;
>
> - curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST,
> custom_request);
> + ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST,
> custom_request);
> + if (ret != CURLE_OK)
> + {
> + ERR("Could not set a custom request string: %s",
> + curl_easy_strerror(ret));
> + ecore_con_url_free(url_con);
> + return NULL;
> + }
>
> return url_con;
> #else
> @@ -362,6 +380,7 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
> {
> #ifdef HAVE_CURL
> char *s;
> + CURLMcode ret;
>
> if (!url_con)
> return;
> @@ -398,7 +417,10 @@ ecore_con_url_free(Ecore_Con_Url *url_con)
> {
> url_con->active = EINA_FALSE;
>
> - curl_multi_remove_handle(_curlm, url_con->curl_easy);
> + ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
> + if (ret != CURLM_OK)
> + ERR("curl_multi_remove_handle failed: %s",
> + curl_multi_strerror(ret));
> }
>
> curl_easy_cleanup(url_con->curl_easy);
> @@ -534,7 +556,7 @@ ecore_con_url_additional_header_add(Ecore_Con_Url
> *url_con, const char *key,
> #endif
> }
>
> -/*
> +/**
> * Cleans additional headers.
> *
> * Cleans additional headers associated with a connection object (previously
> @@ -713,10 +735,11 @@ ecore_con_url_response_headers_get(Ecore_Con_Url
> *url_con) */
> EAPI Eina_Bool
> ecore_con_url_httpauth_set(Ecore_Con_Url *url_con, const char *username,
> - const char *password,
> - Eina_Bool safe)
> + const char *password, Eina_Bool safe)
> {
> #ifdef HAVE_CURL
> + CURLcode ret;
> +
> if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
> {
> ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL,
> @@ -733,13 +756,27 @@ ecore_con_url_httpauth_set(Ecore_Con_Url *url_con,
> const char *username, else
> curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPAUTH,
> CURLAUTH_ANY);
> - curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME, username);
> - curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD, password);
> + ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERNAME,
> username);
> + if (ret != CURLE_OK)
> + {
> + ERR("Could not set username for HTTP authentication: %s",
> + curl_easy_strerror(ret));
> + return EINA_FALSE;
> + }
> +
> + ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_PASSWORD,
> password);
> + if (ret != CURLE_OK)
> + {
> + ERR("Could not set password for HTTP authentication: %s",
> + curl_easy_strerror(ret));
> + return EINA_FALSE;
> + }
> +
> return EINA_TRUE;
> }
> -
> # endif
> #endif
> +
> return EINA_FALSE;
> }
>
> @@ -802,7 +839,7 @@ ecore_con_url_send(Ecore_Con_Url *url_con, const void
> *data, size_t length, url_con->headers = curl_slist_append(url_con->headers,
> tmp); }
>
> - sprintf(tmp, "Content-length: %zu", length);
> + sprintf(tmp, "Content-length: %zu", length);
> url_con->headers = curl_slist_append(url_con->headers, tmp);
> }
>
> @@ -871,6 +908,7 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const
> char *filename, char userpwd[4096];
> FILE *fd;
> struct stat file_info;
> + CURLcode ret;
>
> if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL))
> {
> @@ -888,14 +926,21 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const
> char *filename,
> if (filename)
> {
> - char tmp[PATH_MAX];
> -
> - snprintf(tmp, PATH_MAX, "%s", filename);
> -
> if (stat(filename, &file_info))
> return EINA_FALSE;
>
> - fd = fopen(filename, "rb");
> + snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
> + ret = curl_easy_setopt(url_con->curl_easy, CURLOPT_USERPWD, userpwd);
> + if (ret != CURLE_OK)
> + {
> + ERR("Could not set username and password for FTP upload: %s",
> + curl_easy_strerror(ret));
> + return EINA_FALSE;
> + }
> +
> + char tmp[PATH_MAX];
> + snprintf(tmp, PATH_MAX, "%s", filename);
> +
> if (upload_dir)
> snprintf(url, sizeof(url), "ftp://%s/%s/%s", url_con->url,
> upload_dir, basename(tmp));
> @@ -903,15 +948,22 @@ ecore_con_url_ftp_upload(Ecore_Con_Url *url_con, const
> char *filename, snprintf(url, sizeof(url), "ftp://%s/%s", url_con->url,
> basename(tmp));
>
> - snprintf(userpwd, sizeof(userpwd), "%s:%s", user, pass);
> + if (!ecore_con_url_url_set(url_con, url))
> + return EINA_FALSE;
> +
> 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);
> +
> + fd = fopen(filename, "rb");
> + if (!fd)
> + {
> + ERR("Could not open \"%s\" for FTP upload");
> + return EINA_FALSE;
> + }
> 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);
> }
> @@ -1218,6 +1270,7 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
> int fd_max, fd;
> int flags, still_running;
> int completed_immediately = 0;
> + CURLMcode ret;
>
> _url_con_list = eina_list_append(_url_con_list, url_con);
>
> @@ -1241,7 +1294,14 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
> FD_ZERO(&exc_set);
>
> /* Stupid curl, why can't I get the fd to the current added job? */
> - curl_multi_fdset(_curlm, &read_set, &write_set, &exc_set, &fd_max);
> + ret = curl_multi_fdset(_curlm, &read_set, &write_set, &exc_set,
> + &fd_max);
> + if (ret != CURLM_OK)
> + {
> + ERR("curl_multi_fdset failed: %s", curl_multi_strerror(ret));
> + return EINA_FALSE;
> + }
> +
> for (fd = 0; fd <= fd_max; fd++)
> {
> if (!FD_ISSET(fd, &_current_fd_set))
> @@ -1260,7 +1320,11 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
> {
> long ms = 0;
>
> - curl_multi_timeout(_curlm, &ms);
> + ret = curl_multi_timeout(_curlm, &ms);
> + if (ret != CURLM_OK)
> + ERR("curl_multi_timeout failed: %s",
> + curl_multi_strerror(ret));
> +
> if (ms == 0)
> ms = 1000;
>
> @@ -1279,7 +1343,12 @@ _ecore_con_url_perform(Ecore_Con_Url *url_con)
> {
> /* Failed to set up an fd_handler */
> ecore_timer_freeze(_curl_timeout);
> - curl_multi_remove_handle(_curlm, url_con->curl_easy);
> +
> + ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
> + if (ret != CURLM_OK)
> + ERR("curl_multi_remove_handle failed: %s",
> + curl_multi_strerror(ret));
> +
> url_con->active = EINA_FALSE;
> url_con->fd = -1;
> return EINA_FALSE;
> @@ -1343,6 +1412,7 @@ _ecore_con_url_process_completed_jobs(Ecore_Con_Url
> *url_con_to_match) Ecore_Con_Url *url_con;
> Ecore_Con_Event_Url_Complete *e;
> CURLMsg *curlmsg;
> + CURLMcode ret;
> int n_remaining;
> int job_matched = 0;
>
> @@ -1393,7 +1463,11 @@ _ecore_con_url_process_completed_jobs(Ecore_Con_Url
> *url_con_to_match) _url_complete_push_event(ECORE_CON_EVENT_URL_COMPLETE, e);
> }
>
> - curl_multi_remove_handle(_curlm, url_con->curl_easy);
> + ret = curl_multi_remove_handle(_curlm, url_con->curl_easy);
> + if (ret != CURLM_OK)
> + ERR("curl_multi_remove_handle failed: %s",
> + curl_multi_strerror(ret));
> +
> break;
> }
> }
> --
> 1.7.3.1
>
>
> ------------------------------------------------------------------------------
> Beautiful is writing same markup. Internet Explorer 9 supports
> standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3.
> Spend less time writing and rewriting code and more time creating great
> experiences on the web. Be a part of the beta today.
> http://p.sf.net/sfu/beautyoftheweb
> _______________________________________________
> enlightenment-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>
--
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler) [email protected]
------------------------------------------------------------------------------
Download new Adobe(R) Flash(R) Builder(TM) 4
The new Adobe(R) Flex(R) 4 and Flash(R) Builder(TM) 4 (formerly
Flex(R) Builder(TM)) enable the development of rich applications that run
across multiple browsers and platforms. Download your free trials today!
http://p.sf.net/sfu/adobe-dev2dev
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel