* ecore_con_url: Patch from Andre Dieb with a few modification.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 12 Aug 2009 09:47:04 +0000 (09:47 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 12 Aug 2009 09:47:04 +0000 (09:47 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/ecore@41699 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/ecore_con/Ecore_Con.h
src/lib/ecore_con/ecore_con_private.h
src/lib/ecore_con/ecore_con_url.c

index 9bf0d10..1dcc717 100644 (file)
@@ -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);
index c1f0e96..ea15c76 100644 (file)
@@ -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;
index 4f03a6a..8e094b8 100644 (file)
@@ -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;