/** Handle asynchronous cancellation of a request * * If we're signalled that the request has been cancelled (FR_SIGNAL_CANCEL). * Cleanup any pending state and release the connection handle back into the pool. * * @param[in] instance of rlm_rest. * @param[in] thread Thread specific module instance. * @param[in] request being cancelled. * @param[in] rctx rlm_rest_handle_t currently used by the request. * @param[in] action What happened. */ void rest_io_module_action(void *instance, void *thread, REQUEST *request, void *rctx, fr_state_signal_t action) { rlm_rest_handle_t *randle = talloc_get_type_abort(rctx, rlm_rest_handle_t); rlm_rest_thread_t *t = thread; CURLMcode ret; if (action != FR_SIGNAL_CANCEL) return; RDEBUG2("Forcefully cancelling pending REST request"); ret = curl_multi_remove_handle(t->mandle, randle->candle); /* Gracefully terminate the request */ if (ret != CURLM_OK) { RERROR("Failed removing curl handle from multi-handle: %s (%i)", curl_multi_strerror(ret), ret); /* Not much we can do */ } t->transfers--; rest_request_cleanup(instance, randle); fr_pool_connection_release(t->pool, request, randle); }
static void rlm_rest_cleanup (rlm_rest_t *instance, rlm_rest_section_t *section, void *handle) { rest_request_cleanup(instance, section, handle); };