- Allow https://
Obviously won't work if curl is not compiled with SSL support,
perhaps something like this could be put in:
int ecore_con_url_supports_https()
{
curl_version_info_data *curl_info = curl_version_info(CURLVERSION_NOW);
if(curl_info->features & CURL_VERSION_SSL)
return 1;
else
return 0;
}
- Add Header cb event: receive headers from http connections.
Your callback will receive _one_ header each time called (as curl does)
- Allow api users to supply arbitrary http-headers.
cheers,
Øystein
Index: libs/ecore/src/lib/ecore_con/Ecore_Con.h =================================================================== RCS file: /var/cvs/e/e17/libs/ecore/src/lib/ecore_con/Ecore_Con.h,v retrieving revision 1.18 diff -u -r1.18 Ecore_Con.h --- libs/ecore/src/lib/ecore_con/Ecore_Con.h 30 Mar 2006 06:48:45 -0000 1.18 +++ libs/ecore/src/lib/ecore_con/Ecore_Con.h 27 May 2006 11:21:06 -0000 @@ -83,6 +83,7 @@ typedef struct _Ecore_Con_Event_Client_Data Ecore_Con_Event_Client_Data; typedef struct _Ecore_Con_Event_Server_Data Ecore_Con_Event_Server_Data; typedef struct _Ecore_Con_Event_Url_Data Ecore_Con_Event_Url_Data; + typedef struct _Ecore_Con_Event_Url_Header Ecore_Con_Event_Url_Header; typedef struct _Ecore_Con_Event_Url_Complete Ecore_Con_Event_Url_Complete; struct _Ecore_Con_Event_Client_Add @@ -125,6 +126,13 @@ void *data; int size; }; + + struct _Ecore_Con_Event_Url_Header + { + Ecore_Con_Url *url_con; + void *header; + int size; + }; struct _Ecore_Con_Event_Url_Complete { @@ -139,6 +147,7 @@ EAPI extern int ECORE_CON_EVENT_CLIENT_DATA; EAPI extern int ECORE_CON_EVENT_SERVER_DATA; EAPI extern int ECORE_CON_EVENT_URL_DATA; + EAPI extern int ECORE_CON_EVENT_URL_HEADER; EAPI extern int ECORE_CON_EVENT_URL_COMPLETE; EAPI int ecore_con_init(void); @@ -169,6 +178,8 @@ EAPI Ecore_Con_Url *ecore_con_url_new(const char *url); EAPI void ecore_con_url_destroy(Ecore_Con_Url *url_con); EAPI int ecore_con_url_url_set(Ecore_Con_Url *url_con, const char *url); + EAPI int ecore_con_url_header_add(Ecore_Con_Url *url_con, const char *header); + EAPI void ecore_con_url_header_free_all(Ecore_Con_Url *url_con); EAPI int ecore_con_url_send(Ecore_Con_Url *url_con, void *data, size_t length, char *content_type); EAPI int ecore_con_dns_lookup(const char *name, Index: libs/ecore/src/lib/ecore_con/ecore_con_private.h =================================================================== RCS file: /var/cvs/e/e17/libs/ecore/src/lib/ecore_con/ecore_con_private.h,v retrieving revision 1.14 diff -u -r1.14 ecore_con_private.h --- libs/ecore/src/lib/ecore_con/ecore_con_private.h 20 Mar 2006 07:45:58 -0000 1.14 +++ libs/ecore/src/lib/ecore_con/ecore_con_private.h 27 May 2006 11:21:06 -0000 @@ -87,6 +87,7 @@ CURL *curl_easy; char *url; struct curl_slist *headers; + Ecore_List *user_headers; Ecore_Fd_Handler *fd_handler; char active : 1; }; Index: libs/ecore/src/lib/ecore_con/ecore_con_url.c =================================================================== RCS file: /var/cvs/e/e17/libs/ecore/src/lib/ecore_con/ecore_con_url.c,v retrieving revision 1.9 diff -u -r1.9 ecore_con_url.c --- libs/ecore/src/lib/ecore_con/ecore_con_url.c 8 Jan 2006 02:37:50 -0000 1.9 +++ libs/ecore/src/lib/ecore_con/ecore_con_url.c 27 May 2006 11:21:08 -0000 @@ -44,11 +44,14 @@ static int _ecore_con_url_fd_handler(void *data, Ecore_Fd_Handler *fd_handler); static int _ecore_con_url_perform(Ecore_Con_Url *url_con); static size_t _ecore_con_url_data_cb(void *buffer, size_t size, size_t nmemb, void *userp); +static size_t _ecore_con_url_header_cb(void *buffer, size_t size, size_t nmemb, void *userp); static void _ecore_con_event_url_complete_free(void *data __UNUSED__, void *ev); static void _ecore_con_event_url_data_free(void *data __UNUSED__, void *ev); +static void _ecore_con_event_url_header_free(void *data __UNUSED__, void *ev); static int _ecore_con_url_process_completed_jobs(Ecore_Con_Url *url_con_to_match); int ECORE_CON_EVENT_URL_DATA = 0; +int ECORE_CON_EVENT_URL_HEADER = 0; int ECORE_CON_EVENT_URL_COMPLETE = 0; static CURLM *curlm = NULL; @@ -64,6 +67,7 @@ if (!ECORE_CON_EVENT_URL_DATA) { ECORE_CON_EVENT_URL_DATA = ecore_event_type_new(); + ECORE_CON_EVENT_URL_HEADER = ecore_event_type_new(); ECORE_CON_EVENT_URL_COMPLETE = ecore_event_type_new(); } @@ -76,7 +80,7 @@ if (!curlm) { FD_ZERO(&_current_fd_set); - if (curl_global_init(CURL_GLOBAL_NOTHING)) + if (curl_global_init(CURL_GLOBAL_SSL)) { ecore_list_destroy(_url_con_list); _url_con_list = NULL; @@ -154,6 +158,8 @@ 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_HEADERFUNCTION, _ecore_con_url_header_cb); + curl_easy_setopt(url_con->curl_easy, CURLOPT_WRITEHEADER, url_con); /* * FIXME: Check that these timeouts are sensible defaults * FIXME: Provide a means to change these timeouts @@ -181,6 +187,7 @@ curl_multi_remove_handle(curlm, url_con->curl_easy); curl_easy_cleanup(url_con->curl_easy); } + ecore_con_url_header_free_all(url_con); curl_slist_free_all(url_con->headers); free(url_con->url); free(url_con); @@ -203,11 +210,40 @@ return 1; } +EAPI int +ecore_con_url_header_add(Ecore_Con_Url *url_con, const char *header) +{ +#ifdef HAVE_CURL + if(url_con->user_headers == NULL) + { + url_con->user_headers = ecore_list_new(); + ecore_list_set_free_cb(url_con->user_headers, free); + } + + return ecore_list_append(url_con->user_headers, strdup(header)); +#else + return 0; +#endif +} + +EAPI void +ecore_con_url_header_free_all(Ecore_Con_Url *url_con) +{ +#ifdef HAVE_CURL + if(url_con->user_headers != NULL) + { + ecore_list_destroy(url_con->user_headers); + url_con->user_headers = NULL; + } +#endif +} + EAPI int ecore_con_url_send(Ecore_Con_Url *url_con, void *data, size_t length, char *content_type) { #ifdef HAVE_CURL char tmp[256]; + char *tmp_header; if (url_con->active) return 0; if (!url_con->url) return 0; @@ -215,6 +251,16 @@ curl_slist_free_all(url_con->headers); url_con->headers = NULL; + /* Put user-supplied headers into the curl headers list */ + if(url_con->user_headers != NULL) + { + ecore_list_goto_first(url_con->user_headers); + while((tmp_header = ecore_list_next(url_con->user_headers)) != NULL) + { + url_con->headers = curl_slist_append(url_con->headers, tmp_header); + } + } + if (data) { curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, data); @@ -231,6 +277,7 @@ else { curl_easy_setopt(url_con->curl_easy, CURLOPT_POSTFIELDS, NULL); + curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPGET, 1); } curl_easy_setopt(url_con->curl_easy, CURLOPT_HTTPHEADER, url_con->headers); @@ -262,6 +309,27 @@ return real_size; } +static size_t +_ecore_con_url_header_cb(void *buffer, size_t size, size_t nmemb, void *userp) +{ + Ecore_Con_Url *url_con; + Ecore_Con_Event_Url_Header *e; + size_t real_size = size * nmemb; + + url_con = (Ecore_Con_Url *)userp; + e = calloc(1, sizeof(Ecore_Con_Event_Url_Header)); + if (e) + { + e->url_con = url_con; + e->header = calloc(1, real_size); + memcpy(e->header, buffer, real_size); + e->size = real_size; + ecore_event_add(ECORE_CON_EVENT_URL_HEADER, e, + _ecore_con_event_url_header_free, NULL); + } + return real_size; +} + /* * FIXME: Use * CURLOPT_PROGRESSFUNCTION and CURLOPT_PROGRESSDATA to @@ -396,6 +464,16 @@ free(e); } + static void +_ecore_con_event_url_header_free(void *data __UNUSED__, void *ev) +{ + Ecore_Con_Event_Url_Header *e; + + e = ev; + free(e->header); + free(e); +} + static void _ecore_con_event_url_complete_free(void *data __UNUSED__, void *ev) {