Commit 12a4c8b2 authored by Nils Goroll's avatar Nils Goroll

start moduralizing esiextra vcl

parent aee4bd24
...@@ -52,19 +52,20 @@ varnish v1 -vcl+backend { ...@@ -52,19 +52,20 @@ varnish v1 -vcl+backend {
.port = "${v1_port}"; .port = "${v1_port}";
} }
sub vcl_init { sub esiextra_init {
new esilm = esiextra.lm(); new esilm = esiextra.lm();
} }
sub vcl_recv { sub vcl_init {
call esiextra_init;
}
sub esiextra_recv {
if (req.restarts == 0) { if (req.restarts == 0) {
unset req.http.X-Do-Recurse; unset req.http.X-Do-Recurse;
} }
if (req.esi_level > 0) { if (req.esi_level > 0) {
set req.url = req.url + req.esi_level;
set req.http.X-TE = "trailers"; set req.http.X-TE = "trailers";
return (hash); } else {
} # esi level == 0
if (req.http.X-Do-Recurse) { if (req.http.X-Do-Recurse) {
set req.backend_hint = recursive; set req.backend_hint = recursive;
set req.esi = false; set req.esi = false;
...@@ -80,7 +81,14 @@ varnish v1 -vcl+backend { ...@@ -80,7 +81,14 @@ varnish v1 -vcl+backend {
unset req.http.X-TE; unset req.http.X-TE;
} }
} }
sub vcl_miss { }
sub vcl_recv {
if (req.esi_level > 0) {
set req.url = req.url + req.esi_level;
}
call esiextra_recv;
}
sub esiextra_miss {
if (req.esi_level == 0 && if (req.esi_level == 0 &&
! req.http.TE && ! req.http.TE &&
! req.http.X-Do-Recurse && ! req.http.X-Do-Recurse &&
...@@ -89,12 +97,11 @@ varnish v1 -vcl+backend { ...@@ -89,12 +97,11 @@ varnish v1 -vcl+backend {
return(restart); return(restart);
} }
} }
sub deliver_esi { sub vcl_miss {
if (resp_top.http.X-ESI) { call esiextra_miss;
set resp_top.http.X-ESI = resp_top.http.X-ESI + ":" + req.url;
} else {
set resp_top.http.X-ESI = req.url;
} }
# to be called from esi_level > 0
sub esiextra_deliver_esi {
# updating for level > 1 would just be a waste, only the # updating for level > 1 would just be a waste, only the
# last update wins anyway # last update wins anyway
if (req.esi_level == 1) { if (req.esi_level == 1) {
...@@ -105,25 +112,53 @@ varnish v1 -vcl+backend { ...@@ -105,25 +112,53 @@ varnish v1 -vcl+backend {
} else { } else {
esilm.update(std.time(resp.http.Last-Modified, now - 10s)); esilm.update(std.time(resp.http.Last-Modified, now - 10s));
} }
}
# to be called from esi_level == 0
sub esiextra_deliver {
esilm.update(std.time(resp.http.Last-Modified, now - 10s));
if (req.http.TE == "trailers") {
set resp.http.Trailer = "Last-Modified";
}
# no vmod_re
if (! resp.http.Vary) {
#
} else if (resp.http.Vary ~ "^\s*TE\s*$") {
unset resp.http.Vary;
} else if (resp.http.Vary ~ "\bTE\s*,\s*") {
set resp.http.Vary = regsub(resp.http.Vary, "\bTE\s*,\s*", "");
} else if (resp.http.Vary ~ "\s*,\s*TE\b") {
set resp.http.Vary = regsub(resp.http.Vary, "\s*,\s*TE\b", "");
}
}
sub deliver_esi {
if (resp_top.http.X-ESI) {
set resp_top.http.X-ESI = resp_top.http.X-ESI + ":" + req.url;
} else {
set resp_top.http.X-ESI = req.url;
}
call esiextra_deliver_esi;
return (deliver); return (deliver);
} }
sub vcl_deliver { sub vcl_deliver {
if (req.esi_level > 0) { if (req.esi_level > 0) {
call deliver_esi; call deliver_esi;
} }
esilm.update(std.time(resp.http.Last-Modified, now - 10s)); call esiextra_deliver;
if (req.http.TE == "trailers") { if (req.http.TE == "trailers") {
set resp.http.Trailer = "X-ESI, Last-Modified"; if (resp.http.Trailer) {
set resp.http.Trailer = "X-ESI, " + resp.http.Trailer;
} else {
set resp.http.Trailer = "X-ESI";
}
set resp.http.X-ESI = req.url; set resp.http.X-ESI = req.url;
} }
unset resp.http.Vary;
if (resp.http.hits) { if (resp.http.hits) {
set resp.http.hits = resp.http.hits + "," + obj.hits; set resp.http.hits = resp.http.hits + "," + obj.hits;
} else { } else {
set resp.http.hits = obj.hits; set resp.http.hits = obj.hits;
} }
} }
sub vcl_backend_fetch { sub esiextra_backend_fetch {
if (bereq.http.X-Do-Recurse) { if (bereq.http.X-Do-Recurse) {
set bereq.http.X-Recursive = "1"; set bereq.http.X-Recursive = "1";
# TE does not get copied to the backend side, but X-TE # TE does not get copied to the backend side, but X-TE
...@@ -131,7 +166,10 @@ varnish v1 -vcl+backend { ...@@ -131,7 +166,10 @@ varnish v1 -vcl+backend {
set bereq.http.TE = "trailers"; set bereq.http.TE = "trailers";
} }
} }
sub vcl_backend_response { sub vcl_backend_fetch {
call esiextra_backend_fetch;
}
sub esiextra_backend_response {
if (bereq.http.X-Do-Recurse) { if (bereq.http.X-Do-Recurse) {
# The recursively fetched Variant has all the headers # The recursively fetched Variant has all the headers
unset bereq.http.X-TE; unset bereq.http.X-TE;
...@@ -143,10 +181,14 @@ varnish v1 -vcl+backend { ...@@ -143,10 +181,14 @@ varnish v1 -vcl+backend {
} else { } else {
set beresp.http.Trailer = "ETag"; set beresp.http.Trailer = "ETag";
} }
return (deliver);
} }
set beresp.do_esi = true;
set beresp.http.Vary = "X-TE"; set beresp.http.Vary = "X-TE";
} }
sub vcl_backend_response {
call esiextra_backend_response;
set beresp.do_esi = true;
}
} }
logexpect l1 -v v1 -g raw { logexpect l1 -v v1 -g raw {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment