return ret;
}
-/** Cleans up after a REST request.
- *
- * Resets all options associated with a CURL handle, and frees any headers
- * associated with it.
- *
- * Calls rest_read_ctx_free and rest_response_free to free any memory used by
- * context data.
- *
- * @param[in] instance configuration data.
- * @param[in] randle to cleanup.
- */
-void rest_request_cleanup(UNUSED rlm_rest_t const *instance, fr_curl_io_request_t *randle)
-{
- rlm_rest_curl_context_t *ctx = talloc_get_type_abort(randle->uctx, rlm_rest_curl_context_t);
- CURL *candle = randle->candle;
-
- /*
- * Clear any previously configured options
- */
- curl_easy_reset(candle);
-
- /*
- * Free header list
- */
- if (ctx->headers != NULL) {
- curl_slist_free_all(ctx->headers);
- ctx->headers = NULL;
- }
-
- /*
- * Free response data
- */
- TALLOC_FREE(ctx->body);
- TALLOC_FREE(ctx->response.buffer);
- TALLOC_FREE(ctx->request.encoder);
- TALLOC_FREE(ctx->response.decoder);
-
- randle->request = NULL;
-}
-
/** URL encodes a string.
*
* Encode special chars as per RFC 3986 section 4.
xlat_ctx_t const *xctx,
request_t *request, UNUSED FR_DLIST_HEAD(fr_value_box_list) *in)
{
- rlm_rest_t const *inst = talloc_get_type_abort(xctx->mctx->inst->data, rlm_rest_t);
rlm_rest_xlat_rctx_t *rctx = talloc_get_type_abort(xctx->rctx, rlm_rest_xlat_rctx_t);
int hcode;
ssize_t len;
fr_dcursor_insert(out, vb);
}
- rest_request_cleanup(inst, handle);
-
fr_rest_slab_release(handle);
talloc_free(rctx);
RPEDEBUG("Failed escaping URI");
error:
- rest_request_cleanup(inst, randle);
fr_rest_slab_release(randle);
talloc_free(section);
}
finish:
- rest_request_cleanup(inst, handle);
-
fr_rest_slab_release(handle);
RETURN_MODULE_RCODE(rcode);
ret = rlm_rest_perform(mctx, section, handle, request, NULL, NULL);
if (ret < 0) {
- rest_request_cleanup(inst, handle);
fr_rest_slab_release(handle);
RETURN_MODULE_FAIL;
}
finish:
- rest_request_cleanup(inst, handle);
-
fr_rest_slab_release(handle);
RETURN_MODULE_RCODE(rcode);
ret = rlm_rest_perform(mctx, section,
handle, request, username->vp_strvalue, password->vp_strvalue);
if (ret < 0) {
- rest_request_cleanup(inst, handle);
fr_rest_slab_release(handle);
RETURN_MODULE_FAIL;
}
finish:
- rest_request_cleanup(inst, handle);
-
fr_rest_slab_release(handle);
RETURN_MODULE_RCODE(rcode);
ret = rlm_rest_perform(mctx, section, handle, request, NULL, NULL);
if (ret < 0) {
- rest_request_cleanup(inst, handle);
fr_rest_slab_release(handle);
RETURN_MODULE_FAIL;
}
finish:
- rest_request_cleanup(inst, handle);
-
fr_rest_slab_release(handle);
RETURN_MODULE_RCODE(rcode);
ret = rlm_rest_perform(mctx, section, handle, request, NULL, NULL);
if (ret < 0) {
- rest_request_cleanup(inst, handle);
-
fr_rest_slab_release(handle);
RETURN_MODULE_FAIL;
return 0;
}
+/** Cleans up after a REST request.
+ *
+ * Resets all options associated with a CURL handle, and frees any headers
+ * associated with it.
+ *
+ * Calls rest_read_ctx_free and rest_response_free to free any memory used by
+ * context data.
+ *
+ * @param[in] randle to cleanup.
+ * @param[in] uctx unused.
+ */
+static int rest_request_cleanup(fr_curl_io_request_t *randle, UNUSED void *uctx)
+{
+ rlm_rest_curl_context_t *ctx = talloc_get_type_abort(randle->uctx, rlm_rest_curl_context_t);
+ CURL *candle = randle->candle;
+
+ /*
+ * Clear any previously configured options
+ */
+ curl_easy_reset(candle);
+
+ /*
+ * Free header list
+ */
+ if (ctx->headers != NULL) {
+ curl_slist_free_all(ctx->headers);
+ ctx->headers = NULL;
+ }
+
+ /*
+ * Free response data
+ */
+ TALLOC_FREE(ctx->body);
+ TALLOC_FREE(ctx->response.buffer);
+ TALLOC_FREE(ctx->request.encoder);
+ TALLOC_FREE(ctx->response.decoder);
+
+ randle->request = NULL;
+ return 0;
+}
+
static int rest_conn_alloc(fr_curl_io_request_t *randle, void *uctx)
{
rlm_rest_t const *inst = talloc_get_type_abort(uctx, rlm_rest_t);
randle->uctx = curl_ctx;
talloc_set_destructor(randle, _mod_conn_free);
+ fr_rest_slab_element_set_destructor(randle, rest_request_cleanup, NULL);
+
return 0;
}