Varnish C-使用VRT_SetHdr方法的标头设置

时间:2019-01-24 11:28:05

标签: varnish varnish-vcl

对于一个特定的用例,我需要在vcl脚本中编写一个C例程。在那里,我需要动态设置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);
}

需要有关使用VRT_SetHdr方法编写C函数和设置标头的专家意见。如果采用上述解决方案,是否有潜在的风险?

0 个答案:

没有答案