我正在使用Varnish 4.0。
我的后端正在为一些回复添加一个http标头" x-count"
我想记录" x-count"的值进入带换行符的文件。
我认为我应该在VCL交付中这样做。
这是我到目前为止所拥有的:
sub vcl_deliver {
if (resp.http.x-count-this:) {
set resp.http.X-infodbg = "xx";
C{
FILE *fp;
fp = fopen("/tmp/test.txt", "w+");
fputs(VRT_GetHdr(sp, HDR_OBJ, "\013x-count-this:"), fp);
fputs("\n", fp);
fclose(fp);
}C
}
}
当然它不起作用,但有一些错误..
./vcl.gK2lu7uM.c:在函数'VGC_function_vcl_deliver'中: ./vcl.gK2lu7uM.c:1049:22:错误:'sp'未声明(首次使用此处 函数)./vcl.gK2lu7uM.c:1049:22:注意:每个未声明的标识符 报告的每个功能仅报告一次 ./vcl.gK2lu7uM.c:1049:5:错误:传递'VRT_GetHdr'的参数2 在没有强制转换的情况下从整数生成指针[-Werror] ./vcl.gK2lu7uM.c:330:7:注意:预期'const struct gethdr_s *'但是 参数的类型为'int'./vcl.gK2lu7uM.c:1049:5:错误:太多了 函数'VRT_GetHdr'的参数./vcl.gK2lu7uM.c:330:7:注意: 在这里宣布
我不得不说我只是复制/粘贴" sp"从一些例子,但我不知道它来自哪里(我想内联C在不同的上下文中,因此它在那里声明但在vcl_deliver中没有声明)
答案 0 :(得分:4)
因此,上述例子中Varnish 4和3之间可能没有文件记载的差异是:
找到了,那里:
http://jan.bogutzki.de/Artikel/395/set-ttl-in-varnish-4.html
char *stuffid;
const struct gethdr_s hdr = { HDR_BERESP, "\015x-count-this:" };
stuffid = VRT_GetHdr(ctx, &hdr);
现在又出现了一个不同的故事:一旦后端发回“count-this”,Varnish就会崩溃,但这是一个不同的问题:p(可能是我糟糕的C代码)
答案 1 :(得分:2)
我没有Varnish 4.0来测试这个,但我能够让你的例子与Varnish 3.0一起工作。当我按原样尝试VCL时,我没有得到你确切的错误。第一个变化:
if (resp.http.x-count-this:) {
需要:
if (resp.http.x-count-this) {
当以这种方式引用时,冒号应该不在标题名称之外。下一个:
fputs(VRT_GetHdr(sp, HDR_OBJ, "\013x-count-this:"), fp);
需要:
fputs(VRT_GetHdr(sp, HDR_OBJ, "\015x-count-this:"), fp);
由于某种原因,该字符串中的长度值必须是八进制的,而八进制中的13
是15
。做出这些改变后,这对我有用。话虽这么说,你们很多人都希望使用open
和fcntl
代替fopen
,因为没有文件锁定我不确定争用该文件的多个请求的影响是什么