<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
Hello,</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
I am trying to use Varnish in one of my projects and I need to parse some JSON and make some decisions as part of the design. Since Varnish supports LUA I decided to do the parsing and decision making in LUA. I am using
<a href="https://github.com/flygoast/libvmod-lua">libvmod-lua</a> to invoke LUA scripts from Varnish. I setup a container with Apache2, Varnish 4.1, LUA 5.1.5, and LUARocks 2.3.0 along with all the dependencies. I then installed libvmod-lua in the container.
 I changed the default.vcl file to look like this:</div>
<blockquote style="color: rgb(0, 0, 0); font-size: 14px; margin: 0px 0px 0px 40px; border: none; padding: 0px;">
<div>
<div><font face="Courier"># Marker to tell the VCL compiler that this VCL has been adapted to the</font></div>
<div><font face="Courier"># new 4.0 format.</font></div>
<div><font face="Courier">vcl 4.0;</font></div>
<div><font face="Courier"><br>
</font></div>
<div><font face="Courier">import lua;</font></div>
<div><font face="Courier">import std;</font></div>
<div><font face="Courier"><br>
</font></div>
<div><font face="Courier"># Default backend definition. Set this to point to your content server.</font></div>
<div><font face="Courier">backend default {</font></div>
<div><font face="Courier">    .host = "127.0.0.1";</font></div>
<div><font face="Courier">    .port = "8080";</font></div>
<div><font face="Courier">}</font></div>
<div><font face="Courier"><br>
</font></div>
<div><font face="Courier">sub vcl_recv {</font></div>
<div><font face="Courier">    lua.init("/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua", </font></div>
<div><font face="Courier">             "/usr/local/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so",</font></div>
<div><font face="Courier">             "/my/foo.lua");</font></div>
<div><font face="Courier">}</font></div>
<div><font face="Courier"><br>
</font></div>
<div><font face="Courier">sub vcl_deliver {</font></div>
<div><font face="Courier">    set resp.http.x-json = lua.call("test_json");</font></div>
<div><font face="Courier">    set resp.http.x-now = lua.call("test_now");</font></div>
<div><font face="Courier">    return (deliver);</font></div>
<div><font face="Courier">}</font></div>
</div>
</blockquote>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
And following are the contents of foo.lua:</div>
<blockquote style="margin: 0px 0px 0px 40px; border: none; padding: 0px;">
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">local cjson = require("cjson")</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier"><br>
</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">function test_json()</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">    local t = {}</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">    t[1] = "hello"</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">    t[2] = "world"</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">    return cjson.encode(t)</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">end</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier"><br>
</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">function test_now()</font></div>
<div style="color: rgb(0, 0, 0); font-size: 14px;"><font face="Courier">    return 1234 </font></div>
<div><font face="Courier" style="color: rgb(0, 0, 0); font-size: 14px;">end</font></div>
</blockquote>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
But when I curl localhost:80 the x-json and x-now headers show up as empty in the response. I was wondering if I am missing something in the setup. I ran the LUA script independently and made sure its returning the right thing. I would appreciate any help on
 this issue.</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
Also wanted to note that libvmod-lua doesn’t compile with LUA 5.3.2 which is the latest version of LUA. Are there plans to update the vmod?</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
Thanks,</div>
<div style="color: rgb(0, 0, 0); font-size: 14px; font-family: Calibri, sans-serif;">
<div><span style="font-family: Helvetica, sans-serif; font-size: 12px;">—</span></div>
<div><font class="Apple-style-span" color="#000000"><font class="Apple-style-span" face="Calibri">Nishant.</font></font></div>
<div></div>
</div>
</body>
</html>