Migrate http context struct into the AsyncIO struct; streamline other structs.
authorWilfried Goesgens <dothebart@citadel.org>
Sat, 21 May 2011 20:09:39 +0000 (20:09 +0000)
committerWilfried Goesgens <dothebart@citadel.org>
Sat, 21 May 2011 20:09:39 +0000 (20:09 +0000)
citadel/event_client.h
citadel/modules/eventclient/serv_curl.h
citadel/modules/eventclient/serv_eventclient.c
citadel/modules/extnotify/extnotify.h
citadel/modules/extnotify/funambol65.c

index 52e3de5ac9f132ddc01d24f78a8c2199cbd31298..8647fdde43720722de033bd6356932eaac566dc8 100644 (file)
@@ -4,6 +4,7 @@
 #include <netdb.h>
 #include <arpa/nameser.h>
 #include <ares.h>
+#include <curl/curl.h>
 
 typedef struct AsyncIO AsyncIO;
 
@@ -33,6 +34,18 @@ typedef struct _DNSQueryParts {
        void *Data;
 } DNSQueryParts;
 
+typedef struct _evcurl_request_data 
+{
+       CURL *chnd;
+       char errdesc[CURL_ERROR_SIZE];
+       int attached;
+       char* PlainPostData;
+       long PlainPostDataLen;
+       StrBuf *PostData;
+       StrBuf *ReplyData;
+///    ParsedURL *URL; /// take from AsyncIO->ConnectMe
+       struct curl_slist * headers;
+} evcurl_request_data;
 
 struct AsyncIO {
                eNextState NextState;
@@ -72,6 +85,8 @@ struct AsyncIO {
        struct ares_options DNSOptions;
        ares_channel DNSChannel;
        DNSQueryParts *DNSQuery;
+       
+       evcurl_request_data HttpReq;
 
        /* Custom data; its expected to contain  AsyncIO so we can save malloc()s... */
        void *Data;        /* application specific data */
@@ -107,3 +122,20 @@ void StopClientWatchers(AsyncIO *IO);
 void SetNextTimeout(AsyncIO *IO, double timeout);
 
 void InitC_ares_dns(AsyncIO *IO);
+
+#include <curl/curl.h>
+
+#define OPT(s, v) \
+       do { \
+               sta = curl_easy_setopt(chnd, (CURLOPT_##s), (v)); \
+               if (sta)  {                                             \
+                       CtdlLogPrintf(CTDL_ERR, "error setting option " #s " on curl handle: %s", curl_easy_strerror(sta)); \
+       } } while (0)
+
+
+int evcurl_init(AsyncIO *IO, 
+               void *CustomData, 
+               const char* Desc,
+               int CallBack);
+
+void evcurl_handle_start(AsyncIO *IO);
index 7b65d8eb4d0ae1bc4b7c8976516549477c7bfa37..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,34 +0,0 @@
-#include <curl/curl.h>
-
-
-typedef struct _evcurl_request_data 
-{
-       CURL *chnd;
-       char errdesc[CURL_ERROR_SIZE];
-       int attached;
-       char* PlainPostData;
-       long PlainPostDataLen;
-       StrBuf *PostData;
-       StrBuf *ReplyData;
-       ParsedURL *URL;
-       struct curl_slist * headers;
-} evcurl_request_data;
-
-
-
-
-
-#define OPT(s, v) \
-       do { \
-               sta = curl_easy_setopt(chnd, (CURLOPT_##s), (v)); \
-               if (sta)  {                                             \
-                       CtdlLogPrintf(CTDL_ERR, "error setting option " #s " on curl handle: %s", curl_easy_strerror(sta)); \
-       } } while (0)
-
-
-int evcurl_init(evcurl_request_data *handle, 
-               void *CustomData, 
-               const char* Desc,
-               int CallBack);
-
-void evcurl_handle_start(evcurl_request_data *handle);
index d5d17427a28997129f0877cf60ab48583f47541d..5de654fd4656b0056a23b9c49749cb2951bab446 100644 (file)
@@ -270,7 +270,7 @@ void curl_init_connectionpool(void)
 
 
 
-int evcurl_init(evcurl_request_data *handle
+int evcurl_init(AsyncIO *IO
                void *CustomData, 
                const char* Desc,
                int CallBack) 
@@ -279,15 +279,15 @@ int evcurl_init(evcurl_request_data *handle,
        CURL *chnd;
 
        CtdlLogPrintf(CTDL_DEBUG,"EVCURL: evcurl_init called ms\n");
-       handle->attached = 0;
-       chnd = handle->chnd = curl_easy_init();
+       IO->HttpReq.attached = 0;
+       chnd = IO->HttpReq.chnd = curl_easy_init();
        if (!chnd)
        {
                CtdlLogPrintf(CTDL_ERR, "EVCURL: error initializing curl handle\n");
                return 1;
        }
 
-       strcpy(handle->errdesc, Desc);
+       strcpy(IO->HttpReq.errdesc, Desc);
 
        OPT(VERBOSE, (long)1);
                /* unset in production */
@@ -303,53 +303,53 @@ int evcurl_init(evcurl_request_data *handle,
        OPT(LOW_SPEED_LIMIT, (long)64);
        OPT(LOW_SPEED_TIME, (long)600);
        OPT(CONNECTTIMEOUT, (long)600); 
-       OPT(PRIVATE, (void *)handle);
+       OPT(PRIVATE, (void *)IO);
 
 
        OPT(WRITEFUNCTION, &gotdata); 
-       OPT(WRITEDATA, (void *)handle);
-       OPT(ERRORBUFFER, handle->errdesc);
+       OPT(WRITEDATA, (void *)IO);
+       OPT(ERRORBUFFER, IO->HttpReq.errdesc);
 
                /* point to a structure that points back to the perl structure and stuff */
-       CtdlLogPrintf(CTDL_DEBUG, "EVCURL: Loading URL: %s\n", handle->URL->PlainUrl);
-       OPT(URL, handle->URL->PlainUrl);
-       if (StrLength(handle->URL->CurlCreds))
+       CtdlLogPrintf(CTDL_DEBUG, "EVCURL: Loading URL: %s\n", IO->ConnectMe->PlainUrl);
+       OPT(URL, IO->ConnectMe->PlainUrl);
+       if (StrLength(IO->ConnectMe->CurlCreds))
        {
                OPT(HTTPAUTH, (long)CURLAUTH_BASIC);
-               OPT(USERPWD, ChrPtr(handle->URL->CurlCreds));
+               OPT(USERPWD, ChrPtr(IO->ConnectMe->CurlCreds));
        }
 #ifdef CURLOPT_HTTP_CONTENT_DECODING
        OPT(HTTP_CONTENT_DECODING, 1);
        OPT(ENCODING, "");
 #endif
-       if (StrLength(handle->PostData) > 0)
+       if (StrLength(IO->HttpReq.PostData) > 0)
        { 
-               OPT(POSTFIELDS, ChrPtr(handle->PostData));
-               OPT(POSTFIELDSIZE, StrLength(handle->PostData));
+               OPT(POSTFIELDS, ChrPtr(IO->HttpReq.PostData));
+               OPT(POSTFIELDSIZE, StrLength(IO->HttpReq.PostData));
 
        }
-       else if ((handle->PlainPostDataLen != 0) && (handle->PlainPostData != NULL))
+       else if ((IO->HttpReq.PlainPostDataLen != 0) && (IO->HttpReq.PlainPostData != NULL))
        {
-               OPT(POSTFIELDS, handle->PlainPostData);
-               OPT(POSTFIELDSIZE, handle->PlainPostDataLen);
+               OPT(POSTFIELDS, IO->HttpReq.PlainPostData);
+               OPT(POSTFIELDSIZE, IO->HttpReq.PlainPostDataLen);
        }
 
-       if (handle->headers != NULL)
-               OPT(HTTPHEADER, handle->headers);
+       if (IO->HttpReq.headers != NULL)
+               OPT(HTTPHEADER, IO->HttpReq.headers);
 
        return 1;
 }
 
 void
-evcurl_handle_start(evcurl_request_data *handle
+evcurl_handle_start(AsyncIO *IO
 {
        CURLMcode msta;
        
        CtdlLogPrintf(CTDL_DEBUG, "EVCURL: attaching to curl multi handle\n");
-       msta = curl_multi_add_handle(global.mhnd, handle->chnd);
+       msta = curl_multi_add_handle(global.mhnd, IO->HttpReq.chnd);
        if (msta)
                CtdlLogPrintf(CTDL_ERR, "EVCURL: error attaching to curl multi handle: %s\n", curl_multi_strerror(msta));
-       handle->attached = 1;
+       IO->HttpReq.attached = 1;
 //     ev_timer_start(EV_DEFAULT, &global.timeev);
        ev_async_send (event_base, &WakeupCurl);
 }
index f28c59460cf30b2eb8b23e05d0c600b9d9ea42bf..63a8fcd8e13c23aadadde58e02cbba50a47e51ac 100644 (file)
@@ -19,7 +19,6 @@
  */
 
 #include "../eventclient/serv_curl.h"
-
 #define PAGER_CONFIG_MESSAGE "__ Push email settings __"
 #define FUNAMBOL_CONFIG_TEXT "funambol"
 #define PAGER_CONFIG_SYSTEM  "textmessage"    
@@ -38,7 +37,7 @@ typedef enum _eNotifyType {
 typedef struct _NotifyContext {
        StrBuf **NotifyHostList;
        HashList *NotifyErrors;
-       evcurl_request_data HTTPData;
+       AsyncIO IO;
 } NotifyContext;
 
 int notify_http_server(char *remoteurl, 
index fbba1ed54558bdd9833dfc537b56d5b610df3de9..628eaf82add590eaa13324e1023ae7efb39c8769 100644 (file)
@@ -120,28 +120,28 @@ int notify_http_server(char *remoteurl,
                contenttype=(char*) malloc(40+strlen(mimetype));
                sprintf(contenttype,"Content-Type: %s; charset=utf-8", mimetype);
 
-               Ctx->HTTPData.headers = curl_slist_append(Ctx->HTTPData.headers, "SOAPAction: \"\"");
-               Ctx->HTTPData.headers = curl_slist_append(Ctx->HTTPData.headers, contenttype);
-               Ctx->HTTPData.headers = curl_slist_append(Ctx->HTTPData.headers, "Accept: application/soap+xml, application/mime, multipart/related, text/*");
-               Ctx->HTTPData.headers = curl_slist_append(Ctx->HTTPData.headers, "Pragma: no-cache");
+               Ctx->IO.HttpReq.headers = curl_slist_append(Ctx->IO.HttpReq.headers, "SOAPAction: \"\"");
+               Ctx->IO.HttpReq.headers = curl_slist_append(Ctx->IO.HttpReq.headers, contenttype);
+               Ctx->IO.HttpReq.headers = curl_slist_append(Ctx->IO.HttpReq.headers, "Accept: application/soap+xml, application/mime, multipart/related, text/*");
+               Ctx->IO.HttpReq.headers = curl_slist_append(Ctx->IO.HttpReq.headers, "Pragma: no-cache");
 
                /* Now specify the POST binary data */
-               Ctx->HTTPData.PlainPostData = SOAPMessage;
-               Ctx->HTTPData.PlainPostDataLen = strlen(SOAPMessage);
+               Ctx->IO.HttpReq.PlainPostData = SOAPMessage;
+               Ctx->IO.HttpReq.PlainPostDataLen = strlen(SOAPMessage);
        }
        else {
                help_subst(remoteurl, "^notifyuser", user);
                help_subst(remoteurl, "^syncsource", config.c_funambol_source);
                help_subst(remoteurl, "^msgid", msgid);
                help_subst(remoteurl, "^msgnum", msgnumstr);
-               Ctx->HTTPData.headers = curl_slist_append(Ctx->HTTPData.headers, "Accept: application/soap+xml, application/mime, multipart/related, text/*");
-               Ctx->HTTPData.headers = curl_slist_append(Ctx->HTTPData.headers, "Pragma: no-cache");
+               Ctx->IO.HttpReq.headers = curl_slist_append(Ctx->IO.HttpReq.headers, "Accept: application/soap+xml, application/mime, multipart/related, text/*");
+               Ctx->IO.HttpReq.headers = curl_slist_append(Ctx->IO.HttpReq.headers, "Pragma: no-cache");
        }
 
-       ParseURL(&Ctx->HTTPData.URL, NewStrBufPlain (remoteurl, -1), 80);
-       CurlPrepareURL(Ctx->HTTPData.URL);
+       ParseURL(&Ctx->IO.ConnectMe, NewStrBufPlain (remoteurl, -1), 80);
+       CurlPrepareURL(Ctx->IO.ConnectMe);
        int CallBack;
-       if (! evcurl_init(&Ctx->HTTPData
+       if (! evcurl_init(&Ctx->IO
                          Ctx, 
                          "Citadel ExtNotify",
                          CallBack))
@@ -149,7 +149,7 @@ int notify_http_server(char *remoteurl,
                CtdlLogPrintf(CTDL_ALERT, "Unable to initialize libcurl.\n");
                goto abort;
        }
-       chnd = Ctx->HTTPData.chnd;
+       chnd = Ctx->IO.HttpReq.chnd;
        OPT(SSL_VERIFYPEER, 0);
        OPT(SSL_VERIFYHOST, 0);
 /*
@@ -166,7 +166,7 @@ int notify_http_server(char *remoteurl,
                OPT(INTERFACE, config.c_ip_addr);
        }
 
-       evcurl_handle_start(&Ctx->HTTPData);
+       evcurl_handle_start(&Ctx->IO);
 
        return 0;
 abort:
@@ -188,24 +188,24 @@ int EvaluateResult(NotifyContext *Ctx, int res, int b)
 
                CtdlLogPrintf(CTDL_ALERT, "libcurl error %d: %s\n", 
                              res, 
-                             Ctx->HTTPData.errdesc);
+                             Ctx->IO.HttpReq.errdesc);
                ErrMsg = NewStrBufPlain(HKEY("Error sending your Notification\n"));
                StrBufAppendPrintf(ErrMsg, "\nlibcurl error %d: %s\n", 
                                   res, 
-                                  Ctx->HTTPData.errdesc);
+                                  Ctx->IO.HttpReq.errdesc);
 ///            StrBufAppendBufPlain(ErrMsg, curl_errbuf, -1, 0);
                StrBufAppendBufPlain(ErrMsg, HKEY("\nWas Trying to send: \n"), 0);
-               StrBufAppendBufPlain(ErrMsg, Ctx->HTTPData.URL->PlainUrl, -1, 0);
-               if (Ctx->HTTPData.PlainPostDataLen > 0) {
+               StrBufAppendBufPlain(ErrMsg, Ctx->IO.ConnectMe->PlainUrl, -1, 0);
+               if (Ctx->IO.HttpReq.PlainPostDataLen > 0) {
                        StrBufAppendBufPlain(ErrMsg, HKEY("\nThe Post document was: \n"), 0);
                        StrBufAppendBufPlain(ErrMsg, 
-                                            Ctx->HTTPData.PlainPostData, 
-                                            Ctx->HTTPData.PlainPostDataLen, 0);
+                                            Ctx->IO.HttpReq.PlainPostData, 
+                                            Ctx->IO.HttpReq.PlainPostDataLen, 0);
                        StrBufAppendBufPlain(ErrMsg, HKEY("\n\n"), 0);                  
                }
-               if (StrLength(Ctx->HTTPData.ReplyData) > 0) {                   
+               if (StrLength(Ctx->IO.HttpReq.ReplyData) > 0) {                 
                        StrBufAppendBufPlain(ErrMsg, HKEY("\n\nThe Serverreply was: \n\n"), 0);
-                       StrBufAppendBuf(ErrMsg, Ctx->HTTPData.ReplyData, 0);
+                       StrBufAppendBuf(ErrMsg, Ctx->IO.HttpReq.ReplyData, 0);
                }
                else 
                        StrBufAppendBufPlain(ErrMsg, HKEY("\n\nThere was no Serverreply.\n\n"), 0);