From 0ba7769c0b3602d670ad87d4b9b7d971fb84d873 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Sat, 21 May 2011 20:09:39 +0000 Subject: [PATCH] Migrate http context struct into the AsyncIO struct; streamline other structs. --- citadel/event_client.h | 32 ++++++++++++++ citadel/modules/eventclient/serv_curl.h | 34 -------------- .../modules/eventclient/serv_eventclient.c | 44 +++++++++---------- citadel/modules/extnotify/extnotify.h | 3 +- citadel/modules/extnotify/funambol65.c | 42 +++++++++--------- 5 files changed, 76 insertions(+), 79 deletions(-) diff --git a/citadel/event_client.h b/citadel/event_client.h index 52e3de5ac..8647fdde4 100644 --- a/citadel/event_client.h +++ b/citadel/event_client.h @@ -4,6 +4,7 @@ #include #include #include +#include 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 + +#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); diff --git a/citadel/modules/eventclient/serv_curl.h b/citadel/modules/eventclient/serv_curl.h index 7b65d8eb4..e69de29bb 100644 --- a/citadel/modules/eventclient/serv_curl.h +++ b/citadel/modules/eventclient/serv_curl.h @@ -1,34 +0,0 @@ -#include - - -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); diff --git a/citadel/modules/eventclient/serv_eventclient.c b/citadel/modules/eventclient/serv_eventclient.c index d5d17427a..5de654fd4 100644 --- a/citadel/modules/eventclient/serv_eventclient.c +++ b/citadel/modules/eventclient/serv_eventclient.c @@ -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); } diff --git a/citadel/modules/extnotify/extnotify.h b/citadel/modules/extnotify/extnotify.h index f28c59460..63a8fcd8e 100644 --- a/citadel/modules/extnotify/extnotify.h +++ b/citadel/modules/extnotify/extnotify.h @@ -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, diff --git a/citadel/modules/extnotify/funambol65.c b/citadel/modules/extnotify/funambol65.c index fbba1ed54..628eaf82a 100644 --- a/citadel/modules/extnotify/funambol65.c +++ b/citadel/modules/extnotify/funambol65.c @@ -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); -- 2.30.2