|
|
|
@ -8,7 +8,7 @@ |
|
|
|
|
|
|
|
struct notif_req { |
|
|
|
char *name; // just for logging |
|
|
|
struct curl_slist *headers; |
|
|
|
struct curl_slist *headers; // NULL = nothing to send |
|
|
|
char *full_filename_path; |
|
|
|
|
|
|
|
int64_t retry_time; |
|
|
|
@ -32,9 +32,10 @@ static size_t dummy_read(char *ptr, size_t size, size_t nmemb, void *userdata) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static void do_notify_http(struct notif_req *req) { |
|
|
|
static bool do_notify_http(struct notif_req *req) { |
|
|
|
const char *err = NULL; |
|
|
|
CURLcode ret; |
|
|
|
bool success = false; |
|
|
|
|
|
|
|
ilog(LOG_DEBUG, "Launching HTTP notification for '%s%s%s'", FMT_M(req->name)); |
|
|
|
|
|
|
|
@ -123,6 +124,8 @@ static void do_notify_http(struct notif_req *req) { |
|
|
|
|
|
|
|
/* success */ |
|
|
|
|
|
|
|
success = true; |
|
|
|
|
|
|
|
ilog(LOG_NOTICE, "HTTP notification for '%s%s%s' was successful", FMT_M(req->name)); |
|
|
|
|
|
|
|
if (notify_record && notify_purge) { |
|
|
|
@ -131,50 +134,22 @@ static void do_notify_http(struct notif_req *req) { |
|
|
|
else |
|
|
|
ilog(LOG_ERR, "File '%s%s%s' could not be deleted.", FMT_M(req->full_filename_path)); |
|
|
|
} |
|
|
|
goto cleanup; |
|
|
|
|
|
|
|
fail: |
|
|
|
if (c) |
|
|
|
curl_easy_cleanup(c); |
|
|
|
|
|
|
|
if (notify_retries >= 0 && req->retries < notify_retries) { |
|
|
|
/* schedule retry */ |
|
|
|
req->retries++; |
|
|
|
if (c) |
|
|
|
ilog(LOG_DEBUG, "Failed to perform HTTP notification for '%s%s%s': " |
|
|
|
"Error while %s: %s. Will retry in %" PRId64 " seconds (#%u)", |
|
|
|
FMT_M(req->name), |
|
|
|
err, curl_easy_strerror(ret), |
|
|
|
req->falloff_us / 1000000L, req->retries); |
|
|
|
else |
|
|
|
ilog(LOG_DEBUG, "Failed to perform HTTP notification for '%s%s%s': " |
|
|
|
"Failed to create CURL object. Will retry in %" PRId64 " seconds (#%u)", |
|
|
|
FMT_M(req->name), |
|
|
|
req->falloff_us / 1000000L, req->retries); |
|
|
|
req->retry_time = now_us() + req->falloff_us; |
|
|
|
req->falloff_us *= 2; |
|
|
|
|
|
|
|
pthread_mutex_lock(&timer_lock); |
|
|
|
g_tree_insert(notify_timers, req, req); |
|
|
|
pthread_cond_signal(&timer_cond); |
|
|
|
pthread_mutex_unlock(&timer_lock); |
|
|
|
curl_slist_free_all(req->headers); |
|
|
|
req->headers = NULL; |
|
|
|
|
|
|
|
return; |
|
|
|
} |
|
|
|
goto cleanup; |
|
|
|
|
|
|
|
fail: |
|
|
|
if (c) |
|
|
|
ilog(LOG_ERR, "Failed to perform HTTP notification for '%s%s%s' after %u retries: " |
|
|
|
ilog(LOG_ERR, "Failed to perform HTTP notification for '%s%s%s': " |
|
|
|
"Error while %s: %s", |
|
|
|
FMT_M(req->name), |
|
|
|
req->retries, err, curl_easy_strerror(ret)); |
|
|
|
err, curl_easy_strerror(ret)); |
|
|
|
else |
|
|
|
ilog(LOG_ERR, "Failed to perform HTTP notification for '%s%s%s' after %u retries: " |
|
|
|
ilog(LOG_ERR, "Failed to perform HTTP notification for '%s%s%s': " |
|
|
|
"Failed to create CURL object", |
|
|
|
FMT_M(req->name), |
|
|
|
req->retries); |
|
|
|
|
|
|
|
c = NULL; |
|
|
|
goto cleanup; |
|
|
|
FMT_M(req->name)); |
|
|
|
|
|
|
|
cleanup: |
|
|
|
if (c) |
|
|
|
@ -185,14 +160,44 @@ cleanup: |
|
|
|
curl_mime_free(mime); |
|
|
|
#endif |
|
|
|
|
|
|
|
curl_slist_free_all(req->headers); |
|
|
|
return success; |
|
|
|
} |
|
|
|
|
|
|
|
static void do_notify(void *p, void *u) { |
|
|
|
struct notif_req *req = p; |
|
|
|
|
|
|
|
do_notify_http(req); |
|
|
|
unsigned int fails = 0; |
|
|
|
|
|
|
|
fails += do_notify_http(req) == false; |
|
|
|
|
|
|
|
if (fails) { |
|
|
|
if (notify_retries >= 0 && req->retries < notify_retries) { |
|
|
|
/* schedule retry */ |
|
|
|
req->retries++; |
|
|
|
|
|
|
|
ilog(LOG_INFO, "Failure while sending notification for '%s%s%s': " |
|
|
|
"Will retry in %" PRId64 " seconds (#%u)", |
|
|
|
FMT_M(req->name), |
|
|
|
req->falloff_us / 1000000L, req->retries); |
|
|
|
|
|
|
|
req->retry_time = now_us() + req->falloff_us; |
|
|
|
req->falloff_us *= 2; |
|
|
|
|
|
|
|
pthread_mutex_lock(&timer_lock); |
|
|
|
g_tree_insert(notify_timers, req, req); |
|
|
|
pthread_cond_signal(&timer_cond); |
|
|
|
pthread_mutex_unlock(&timer_lock); |
|
|
|
|
|
|
|
return; // skip cleanup |
|
|
|
} |
|
|
|
|
|
|
|
ilog(LOG_ERR, "Failure while sending notification for '%s%s%s' after %u retries. " |
|
|
|
"Giving up", |
|
|
|
FMT_M(req->name), |
|
|
|
req->retries); |
|
|
|
} |
|
|
|
|
|
|
|
curl_slist_free_all(req->headers); |
|
|
|
g_free(req->name); |
|
|
|
g_free(req->full_filename_path); |
|
|
|
g_free(req); |
|
|
|
|