Для конкретного случая использования мне нужно было написать подпрограмму C внутри скрипта vcl. Там мне нужно было динамически установить заголовок Location. После прохождения учебника по лаку и небольшого переполнения стека (я хотел бы упомянуть об этом https://stackoverflow.com/a/27717417),, я получил хорошее представление, а затем написал следующую процедуру:
char* set_location_with_param(void *sp, const char *key, const char *value){
const char *key_value_separator = "=";
const char *req_url = VRT_r_req_url(sp);
const char *req_host = VRT_GetHdr(sp, HDR_REQ, "\005Host:");
const char *param_separator = strchr(req_url, '?') ? "&" : "?";
char *query_string = malloc(strlen(param_separator) + strlen(key) + strlen(key_value_separator) + strlen(value) + 1);
if(query_string != NULL){
strcpy(query_string, param_separator);
strcat(query_string, key);
strcat(query_string, key_value_separator);
strcat(query_string, value);
VRT_SetHdr(sp, HDR_OBJ, "\011Location:", "https://", req_host, req_url, query_string, vrt_magic_string_end);
free(query_string);
}
}
А потом я звоню из sub vcl_error . Вот часть этого:
if (obj.status == somevalue) {
C{set_location_with_param(sp, "something", "somethingelse");}C
set obj.status = 302;
return(deliver);
}
Требуется экспертное заключение по написанию функции C и настройке заголовка с использованием метода VRT_SetHdr. Есть ли потенциальный риск, если я пойду с вышеупомянутым решением?