2014-09-05 62 views
1

我正在使用清漆4.0。内联C清漆(VCL_deliver)

我的后端也加入到了一些回应的HTTP标头“X-数”

我想的“X-数”值登录到带有换行符的文件。

我认为我应该在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: In function ‘VGC_function_vcl_deliver’: ./vcl.gK2lu7uM.c:1049:22: error: ‘sp’ undeclared (first use in this function) ./vcl.gK2lu7uM.c:1049:22: note: each undeclared identifier is reported only once for each function it appears in ./vcl.gK2lu7uM.c:1049:5: error: passing argument 2 of ‘VRT_GetHdr’ makes pointer from integer without a cast [-Werror] ./vcl.gK2lu7uM.c:330:7: note: expected ‘const struct gethdr_s *’ but argument is of type ‘int’ ./vcl.gK2lu7uM.c:1049:5: error: too many arguments to function ‘VRT_GetHdr’ ./vcl.gK2lu7uM.c:330:7: note: declared here

我不得不说,我只需复制/粘贴“sp”从一些例子,但我不知道它来自哪里(我想内联C是在不同的上下文,因此它被宣布在那里,但没有在vcl_deliver)

回答

4

所以在上面的实施例4清漆和3之间的大概无证区别在于:现在

  • VRT_GetHdr是VRT_GetHdr(上下文,结构gethdr_s)
  • 属不存在,但有一个“ 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); 

而现在一个不同的故事:光油作为后端发回尽快崩溃“计数这个”,但是这是一个不同的问题:P(我蹩脚的ç大概代码)

2

我没有清漆4.0公顷ndy来测试这个,但我能够让你的例子与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。做出这些改变让这个为我工作。话虽如此,你很多人想用openfcntl而不是fopen,因为没有文件锁定我不知道多个请求争夺该文件的效果是什么。

+0

谢谢你,但.. “if”中的“:”是编辑问题,但“八进制值而不是十进制”是一个很好的提示。然而,“sp”变量仍然不存在,可能是一个Varnish 3/4的东西:( – cyqui 2014-09-08 07:59:15