VMOD_BODYACCESS(3) | VMOD_BODYACCESS(3) |
vmod_bodyaccess - Varnish Module for request body access
import bodyaccess [from "path"] ; INT rematch_req_body(STRING re) VOID hash_req_body() INT len_req_body() VOID log_req_body(STRING prefix, INT length)
Varnish module that lets you access the request body.
VCL example:
vcl 4.0; import std; import bodyaccess; backend default { .host = "192.0.2.11"; .port = "8080"; } sub vcl_recv {
if (req.method == "POST") {
set req.http.x-method = req.method;
if (std.cache_req_body(110KB)) {
set req.http.x-len = bodyaccess.len_req_body();
set req.http.x-re = bodyaccess.rematch_req_body("Regex");
bodyaccess.log_req_body("PREFIX:", 3);
}
} return(hash); } sub vcl_hash {
bodyaccess.hash_req_body();
return (lookup); } sub vcl_backend_fetch {
set bereq.method = bereq.http.x-method; } sub vcl_deliver {
set resp.http.x-len = req.http.x-len;
set resp.http.x-re = req.http.x-re; }
N.B. The request body must be retrieved before doing any operations on it. It can be buffered using the cache_req_body() function from libvmod_std.
These functions applies only to standard REST methods. Caching is not allowed on PUT requests.
Note that the comparison is case sensitive and the request body must be buffered.
| std.cache_req_body(1KB); | | if (bodyaccess.rematch_req_body("FOO") == 1) { | std.log("is true"); | }
| sub vcl_recv { | std.cache_req_body(1KB); | } | | sub vcl_hash{ | bodyaccess.hash_req_body(); | }
Note that the request body must be buffered.
| std.cache_req_body(1KB); | set req.http.x-len = bodyaccess.len_req_body();
| std.cache_req_body(1KB); | bodyaccess.log_req_body("PREFIX:", 3);