X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Frssclient%2Fserv_rssclient.c;h=88015ad476dd1d3eb7a1ddaea9926315d9ba2983;hb=2711c26ef2248bec46b835406abfdb694610995c;hp=743948b090e5b757c575f4cdb0b1df55185e5826;hpb=1493fd8ff0de73d30336607b43b1c8113ffcffa2;p=citadel.git diff --git a/citadel/modules/rssclient/serv_rssclient.c b/citadel/modules/rssclient/serv_rssclient.c index 743948b09..88015ad47 100644 --- a/citadel/modules/rssclient/serv_rssclient.c +++ b/citadel/modules/rssclient/serv_rssclient.c @@ -108,6 +108,37 @@ ConstStr RSSStates[] = { {HKEY("checking usetable")} }; + +static size_t GetLocationString( void *ptr, size_t size, size_t nmemb, void *userdata) +{ +#define LOCATION "location" + if (strncasecmp((char*)ptr, LOCATION, sizeof(LOCATION) - 1) == 0) + { + AsyncIO *IO = (AsyncIO *) userdata; + rss_aggregator *RSSAggr = (rss_aggregator *)IO->Data; + + char *pch = (char*) ptr; + char *pche; + + pche = pch + (size * nmemb); + pch += sizeof(LOCATION); + + while (isspace(*pch) || (*pch == ':')) + pch ++; + + while (isspace(*pche) || (*pche == '\0')) + pche--; + if (RSSAggr->RedirectUrl == NULL) { + RSSAggr->RedirectUrl = NewStrBufPlain(pch, pche - pch + 1); + } + else { + FlushStrBuf(RSSAggr->RedirectUrl); + StrBufPlain(RSSAggr->RedirectUrl, pch, pche - pch + 1); + } + } + return size * nmemb; +} + static void SetRSSState(AsyncIO *IO, RSSState State) { CitContext* CCC = IO->CitContext; @@ -191,6 +222,7 @@ void DeleteRssCfg(void *vptr) EVRSSCM_syslog(LOG_DEBUG, "RSS: destroying\n"); FreeStrBuf(&RSSAggr->Url); + FreeStrBuf(&RSSAggr->RedirectUrl); FreeStrBuf(&RSSAggr->rooms); FreeStrBuf(&RSSAggr->CData); FreeStrBuf(&RSSAggr->Key); @@ -402,7 +434,7 @@ eNextState RSSSaveMessage(AsyncIO *IO) /* write the uidl to the use table so we don't store this item again */ - CheckIfAlreadySeen("RSS Item Insert", RSSAggr->ThisMsg->MsgGUID, IO->Now, 0, eWrite, CCID, IO->ID); + CheckIfAlreadySeen("RSS Item Insert", RSSAggr->ThisMsg->MsgGUID, EvGetNow(IO), 0, eWrite, CCID, IO->ID); } if (GetNextHashPos(RSSAggr->Messages, @@ -416,7 +448,9 @@ eNextState RSSSaveMessage(AsyncIO *IO) eNextState RSS_FetchNetworkUsetableEntry(AsyncIO *IO) { + static const time_t antiExpire = USETABLE_ANTIEXPIRE_HIRES; #ifndef DEBUG_RSS + time_t seenstamp = 0; const char *Key; long len; rss_aggregator *Ctx = (rss_aggregator *) IO->Data; @@ -424,18 +458,20 @@ eNextState RSS_FetchNetworkUsetableEntry(AsyncIO *IO) /* Find out if we've already seen this item */ // todo: expiry? SetRSSState(IO, eRSSUT); - if (CheckIfAlreadySeen("RSS Item Seen", - Ctx->ThisMsg->MsgGUID, - IO->Now, - IO->Now - USETABLE_ANTIEXPIRE_HIRES, - eCheckUpdate, - CCID, IO->ID) - != 0) + seenstamp = CheckIfAlreadySeen("RSS Item Seen", + Ctx->ThisMsg->MsgGUID, + EvGetNow(IO), + antiExpire, + eCheckUpdate, + CCID, IO->ID); + if (seenstamp != 0) { /* Item has already been seen */ EVRSSC_syslog(LOG_DEBUG, - "%s has already been seen\n", - ChrPtr(Ctx->ThisMsg->MsgGUID)); + "%s has already been seen - %ld < %ld", + ChrPtr(Ctx->ThisMsg->MsgGUID), + seenstamp, antiExpire); + SetRSSState(IO, eRSSParsing); if (GetNextHashPos(Ctx->Messages, @@ -451,6 +487,11 @@ eNextState RSS_FetchNetworkUsetableEntry(AsyncIO *IO) else #endif { + /* Item has already been seen */ + EVRSSC_syslog(LOG_DEBUG, + "%s Parsing - %ld >= %ld", + ChrPtr(Ctx->ThisMsg->MsgGUID), + seenstamp, antiExpire); SetRSSState(IO, eRSSParsing); NextDBOperation(IO, RSSSaveMessage); @@ -496,17 +537,68 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO) StrBuf *guid; rss_aggregator *Ctx = (rss_aggregator *) IO->Data; - if (IO->HttpReq.httpcode != 200) - { + + if ((IO->HttpReq.httpcode >= 300) && + (IO->HttpReq.httpcode < 400) && + (Ctx->RedirectUrl != NULL)) { + StrBuf *ErrMsg; long lens[2]; const char *strs[2]; SetRSSState(IO, eRSSFailure); ErrMsg = NewStrBuf(); - EVRSSC_syslog(LOG_ALERT, "need a 200, got a %ld !\n", + if (IO) EVRSSC_syslog(LOG_ALERT, "need a 200, got a %ld !\n", IO->HttpReq.httpcode); + strs[0] = ChrPtr(Ctx->Url); + lens[0] = StrLength(Ctx->Url); + + strs[1] = ChrPtr(Ctx->rooms); + lens[1] = StrLength(Ctx->rooms); + + if (IO->HttpReq.CurlError == NULL) + IO->HttpReq.CurlError = ""; + + StrBufPrintf(ErrMsg, + "Error while RSS-Aggregation Run of %s\n" + " need a 200, got a %ld !\n" + " Curl Error message: \n%s / %s\n" + " Redirect header points to: %s\n" + " Response text was: \n" + " \n %s\n", + ChrPtr(Ctx->Url), + IO->HttpReq.httpcode, + IO->HttpReq.errdesc, + IO->HttpReq.CurlError, + ChrPtr(Ctx->RedirectUrl), + ChrPtr(IO->HttpReq.ReplyData) + ); + + CtdlAideFPMessage( + ChrPtr(ErrMsg), + "RSS Aggregation run failure", + 2, strs, (long*) &lens, + CCID, + IO->ID, + EvGetNow(IO)); + FreeStrBuf(&ErrMsg); + EVRSSC_syslog(LOG_DEBUG, + "RSS feed returned an invalid http status code. <%s>\n", + ChrPtr(Ctx->Url), + IO->HttpReq.httpcode); + return eAbort; + } + else if (IO->HttpReq.httpcode != 200) + { + StrBuf *ErrMsg; + long lens[2]; + const char *strs[2]; + + SetRSSState(IO, eRSSFailure); + ErrMsg = NewStrBuf(); + if (IO) EVRSSC_syslog(LOG_ALERT, "need a 200, got a %ld !\n", + IO->HttpReq.httpcode); strs[0] = ChrPtr(Ctx->Url); lens[0] = StrLength(Ctx->Url); @@ -533,8 +625,9 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO) ChrPtr(ErrMsg), "RSS Aggregation run failure", 2, strs, (long*) &lens, - IO->Now, - IO->ID, CCID); + CCID, + IO->ID, + EvGetNow(IO)); FreeStrBuf(&ErrMsg); EVRSSC_syslog(LOG_DEBUG, @@ -548,7 +641,7 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO) while (pCfg != NULL) { - UpdateLastKnownGood (pCfg, IO->Now); + UpdateLastKnownGood (pCfg, EvGetNow(IO)); if ((Ctx->roomlist_parts > 1) && (it == NULL)) { @@ -590,8 +683,8 @@ eNextState RSSAggregator_AnalyseReply(AsyncIO *IO) if (CheckIfAlreadySeen("RSS Whole", guid, - IO->Now, - IO->Now - USETABLE_ANTIEXPIRE, + EvGetNow(IO), + EvGetNow(IO) - USETABLE_ANTIEXPIRE, eCheckUpdate, CCID, IO->ID) != 0) @@ -620,6 +713,9 @@ int rss_do_fetching(rss_aggregator *RSSAggr) AsyncIO *IO = &RSSAggr->IO; rss_item *ri; time_t now; + CURLcode sta; + CURL *chnd; + now = time(NULL); @@ -641,6 +737,8 @@ int rss_do_fetching(rss_aggregator *RSSAggr) EVRSSCM_syslog(LOG_ALERT, "Unable to initialize libcurl.\n"); return 0; } + chnd = IO->HttpReq.chnd; + OPT(HEADERFUNCTION, GetLocationString); SetRSSState(IO, eRSSCreated); safestrncpy(((CitContext*)RSSAggr->IO.CitContext)->cs_host,