内联C清漆(VCL_deliver)

时间:2014-09-05 14:41:34

标签: varnish varnish-vcl

我正在使用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中没有声明)

2 个答案:

答案 0 :(得分:4)

因此,上述例子中Varnish 4和3之间可能没有文件记载的差异是:

  • VRT_GetHdr现在是VRT_GetHdr(context,struct gethdr_s)
  • sp不存在,但有一个“ctx”变量

找到了,那里:

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);

由于某种原因,该字符串中的长度值必须是八进制的,而八进制中的1315。做出这些改变后,这对我有用。话虽这么说,你们很多人都希望使用openfcntl代替fopen,因为没有文件锁定我不确定争用该文件的多个请求的影响是什么