From 625345a4350f98df34f30b671314bb26d593861f Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 12 Aug 2009 09:47:04 +0000 Subject: [PATCH] * ecore_con_url: Patch from Andre Dieb with a few modification. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@41699 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/lib/ecore_con/Ecore_Con.h | 3 ++ src/lib/ecore_con/ecore_con_private.h | 1 + src/lib/ecore_con/ecore_con_url.c | 92 +++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) diff --git a/src/lib/ecore_con/Ecore_Con.h b/src/lib/ecore_con/Ecore_Con.h index 9bf0d10..1dcc717 100644 --- a/src/lib/ecore_con/Ecore_Con.h +++ b/src/lib/ecore_con/Ecore_Con.h @@ -208,9 +208,12 @@ extern "C" { EAPI int ecore_con_url_init(void); EAPI int ecore_con_url_shutdown(void); EAPI Ecore_Con_Url *ecore_con_url_new(const char *url); + EAPI Ecore_Con_Url *ecore_con_url_custom_new(const char *url, const char *custom_request); EAPI void ecore_con_url_destroy(Ecore_Con_Url *url_con); EAPI void ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data); EAPI void *ecore_con_url_data_get(Ecore_Con_Url *url_con); + EAPI void ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key, const char *value); + EAPI void ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_con); EAPI int ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url); EAPI void ecore_con_url_fd_set(Ecore_Con_Url *url_con, int fd); EAPI int ecore_con_url_received_bytes_get(Ecore_Con_Url *url_con); diff --git a/src/lib/ecore_con/ecore_con_private.h b/src/lib/ecore_con/ecore_con_private.h index c1f0e96..ea15c76 100644 --- a/src/lib/ecore_con/ecore_con_private.h +++ b/src/lib/ecore_con/ecore_con_private.h @@ -102,6 +102,7 @@ struct _Ecore_Con_Url ECORE_MAGIC; CURL *curl_easy; struct curl_slist *headers; + Eina_List *additional_headers; char *url; Ecore_Con_Url_Time condition; diff --git a/src/lib/ecore_con/ecore_con_url.c b/src/lib/ecore_con/ecore_con_url.c index 4f03a6a..8e094b8 100644 --- a/src/lib/ecore_con/ecore_con_url.c +++ b/src/lib/ecore_con/ecore_con_url.c @@ -234,6 +234,7 @@ ecore_con_url_new(const char *url) url_con->fd = -1; url_con->write_fd = -1; + url_con->additional_headers = NULL; return url_con; #else @@ -243,6 +244,37 @@ ecore_con_url_new(const char *url) } /** + * Creates and initializes a new Ecore_Con_Url for a custom request (e.g. HEAD, + * SUBSCRIBE and other obscure HTTP requests). This object should be used like + * one created with ecore_con_url_new(). + * + * @return NULL on error, a new Ecore_Con_Url on success. + * @ingroup Ecore_Con_Url_Group + */ +EAPI Ecore_Con_Url * +ecore_con_url_custom_new(const char *url, const char *custom_request) +{ +#ifdef HAVE_CURL + if (!url) return NULL; + if (!custom_request) return NULL; + + Ecore_Con_Url *url_con; + + url_con = ecore_con_url_new(url); + + if (!url_con) return NULL; + + curl_easy_setopt(url_con->curl_easy, CURLOPT_CUSTOMREQUEST, custom_request); + + return url_con; +#else + return NULL; + url = NULL; + custom_request = NULL; +#endif +} + +/** * Frees the Ecore_Con_Url. * @return FIXME: To be documented. * @ingroup Ecore_Con_Url_Group @@ -251,6 +283,8 @@ EAPI void ecore_con_url_destroy(Ecore_Con_Url *url_con) { #ifdef HAVE_CURL + char *s; + if (!url_con) return; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) { @@ -276,6 +310,8 @@ ecore_con_url_destroy(Ecore_Con_Url *url_con) } _url_con_list = eina_list_remove(_url_con_list, url_con); curl_slist_free_all(url_con->headers); + EINA_LIST_FREE(url_con->additional_headers, s) + free(s); free(url_con->url); free(url_con); #else @@ -337,6 +373,50 @@ ecore_con_url_data_set(Ecore_Con_Url *url_con, void *data) #endif } +EAPI void +ecore_con_url_additional_header_add(Ecore_Con_Url *url_con, const char *key, const char *value) +{ +#ifdef HAVE_CURL + char *tmp; + + if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) + { + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_additional_header_add"); + return; + } + + tmp = malloc(strlen(key) + strlen(value) + 3); + if (!tmp) return ; + sprintf(tmp, "%s: %s", key, value); + url_con->additional_headers = eina_list_append(url_con->additional_headers, tmp); +#else + return; + url_con = NULL; + key = NULL; + value = NULL; +#endif +} + +EAPI void +ecore_con_url_additional_headers_clear(Ecore_Con_Url *url_con) +{ +#ifdef HAVE_CURL + char *s; + + if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) + { + ECORE_MAGIC_FAIL(url_con, ECORE_MAGIC_CON_URL, "ecore_con_url_additional_headers_clear"); + return; + } + + EINA_LIST_FREE(url_con->additional_headers, s) + free(s); +#else + return; + url_con = NULL; +#endif +} + /** * FIXME: To be documented. * @return FIXME: To be documented. @@ -431,6 +511,8 @@ EAPI int ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, size_t length, const char *content_type) { #ifdef HAVE_CURL + Eina_List *l; + const char *s; char tmp[256]; if (!ECORE_MAGIC_CHECK(url_con, ECORE_MAGIC_CON_URL)) @@ -478,10 +560,20 @@ ecore_con_url_send(Ecore_Con_Url *url_con, const void *data, size_t length, cons break; } + /* Additional headers */ + EINA_LIST_FOREACH(url_con->additional_headers, l, s) + { + fprintf(stderr, "ECORE appending header %s\n", s); + url_con->headers = curl_slist_append(url_con->headers, s); + } + curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER, url_con->headers); url_con->received = 0; + /* FIXME: Check if curl will leak memory or correctly destroy the headers */ + url_con->headers = NULL; + return _ecore_con_url_perform(url_con); #else return 0; -- 2.7.4