#include <netdb.h>
#include <arpa/nameser.h>
#include <ares.h>
+#include <curl/curl.h>
typedef struct AsyncIO AsyncIO;
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;
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 */
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);
-#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);
-int evcurl_init(evcurl_request_data *handle,
+int evcurl_init(AsyncIO *IO,
void *CustomData,
const char* Desc,
int CallBack)
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 */
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);
}
*/
#include "../eventclient/serv_curl.h"
-
#define PAGER_CONFIG_MESSAGE "__ Push email settings __"
#define FUNAMBOL_CONFIG_TEXT "funambol"
#define PAGER_CONFIG_SYSTEM "textmessage"
typedef struct _NotifyContext {
StrBuf **NotifyHostList;
HashList *NotifyErrors;
- evcurl_request_data HTTPData;
+ AsyncIO IO;
} NotifyContext;
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))
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);
/*
OPT(INTERFACE, config.c_ip_addr);
}
- evcurl_handle_start(&Ctx->HTTPData);
+ evcurl_handle_start(&Ctx->IO);
return 0;
abort:
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);