<div dir="ltr"><div>Hey everyone,</div><div><br></div><div>I've been stumped tonight trying to cache POST requests based on body content. I first tried 4.0.3 with libvmod-bodyaccess and I was getting 400's from my upstream server from what appeared to be a missing content length header (or maybe even missing body). I saw another email on this list from last year where PHK thought there was a bug that had been fixed.</div><div><br></div><div>So I moved on to 4.1 and rebuilt libvmod-bodyaccess but unfortunately now I'm just seeing a crash so I'm sure I've done something silly.</div><div><br></div><div>Any help would be greatly appreciated - VCL and varnish log below...</div><div><br></div><div>Thanks! </div><div><br></div>VCL<div><br></div><div><div># cat /etc/varnish/default.vcl</div><div>vcl 4.0;</div><div>import bodyaccess;</div><div>import std;</div><div># Requires libvmod-bodyaccess</div><div># See <a href="http://info.varnish-software.com/blog/introducing-libvmod-bodyaccess-reqbody-access-functions">http://info.varnish-software.com/blog/introducing-libvmod-bodyaccess-reqbody-access-functions</a></div><div># Check this file once installed with</div><div># sudo /usr/sbin/varnishd -C -f /etc/varnish/default.vcl</div><div><br></div><div>backend default {</div><div>    .host = "10.1.1.109";</div><div>    .port = "80";</div><div>}</div><div><br></div><div><br></div><div># Hash requests based on the request body (model input)</div><div>sub vcl_hash {</div><div>  if (req.method == "POST") {</div><div>    bodyaccess.hash_req_body();</div><div>  }</div><div>    return(lookup);</div><div>}</div><div><br></div><div># On cache things that look like model api calls</div><div>sub vcl_recv {</div><div>    if (req.url ~ "/([-0-9a-zA-Z]+)/models/([-0-9a-zA-Z]+)/" && req.method == "POST") {</div><div>        # Set the method as a header so we can reuse it for the fetch</div><div>        set req.http.x-meth = req.method;</div><div>        # Buffer the request body</div><div>        std.cache_req_body(10KB);</div><div>        return (hash);</div><div>    }</div><div>    return (pass);</div><div>}</div><div><br></div><div>sub vcl_backend_fetch {</div><div>  # Reuse our method we kept as a header in recv</div><div>  set bereq.method = bereq.http.x-meth;</div><div>  return(fetch);</div><div>}</div><div><br></div><div>sub vcl_backend_response {</div><div>  # Cache everything for 5 minutes</div><div>  set beresp.ttl = 5m;</div><div>}</div><div><br></div><div>sub vcl_deliver {</div><div>    if (obj.hits > 0) {</div><div>        set resp.http.X-Cache = "HIT";</div><div>    } else {</div><div>        set resp.http.X-Cache = "MISS";</div><div>    }</div><div>}</div></div><div><br></div><div><br></div><div>and varnish log</div><div><br></div><div><br></div><div><div>*              << Session  >>   1</div><div>-            1 Begin          c sess 0 HTTP/1</div><div>-            1 SessOpen       c 50.142.106.39 46903 :80 10.1.1.145 80 1453875715.569886 9</div><div>-            1 Link           c req 2 rxreq</div><div>-            1 VSL            - flush</div><div>-            1 End            - synth</div><div><br></div><div>*              << Request  >>   2</div><div>-            2 Begin          c req 1 rxreq</div><div>-            2 Timestamp      c Start: 1453875715.569958 0.000000 0.000000</div><div>-            2 Timestamp      c Req: 1453875715.569958 0.000000 0.000000</div><div>-            2 ReqStart       c 50.142.106.39 46903</div><div>-            2 ReqMethod      c POST</div><div>-            2 ReqURL         c /lee/models/HelloWorld/</div><div>-            2 ReqProtocol    c HTTP/1.1</div><div>-            2 ReqHeader      c Authorization: Basic bGVlOmU0YjFjMTAyZTI1YmYyNjk2Njk1NzRkMjE2MDlhMGZm</div><div>-            2 ReqHeader      c Host: 54.213.164.12</div><div>-            2 ReqHeader      c Connection: close</div><div>-            2 ReqHeader      c User-Agent: Paw/2.2.9 (Macintosh; OS X/10.11.3) GCDHTTPRequest</div><div>-            2 ReqHeader      c Content-Length: 21</div><div>-            2 ReqHeader      c X-Forwarded-For: 50.142.106.39</div><div>-            2 VCL_call       c RECV</div><div>-            2 ReqHeader      c x-meth: POST</div><div>-            2 Storage        c malloc Transient</div><div>-            2 Timestamp      c ReqBody: 1453875715.570038 0.000079 0.000079</div><div>-            2 Debug          c "VRT_CacheReqBody(10240): 21"</div><div>-            2 VCL_return     c hash</div><div>-            2 VCL_call       c HASH</div><div>-            2 VSL            c flush</div><div>-            2 End            c synth</div><div><br></div><div>Log abandoned</div><div>Log reacquired</div></div></div>