Я понял, глядя на диаграмму конвейера Varnish , что vcl_pipe
может быть вызван только из vcl_recv
.
Я настраиваю VCL для обслуживания двоичных ресурсов из серверной части в зависимости от некоторых условий, включая контроль доступа.
Как я думал об этом, пока что так: пройти все мои проверки, включая выход из vcl_recv
; если установлены условия для потоковой передачи ресурса, установить флаг; перезапустить транзакцию; сначала проверьте флаг в vcl_recv
, и, если он установлен, вызовите vcl_pipe
.
Единственная серьезная проблема заключается в том, что я не знаю, как установить флаг (например, в http.request
), который не удалось подделать заголовком запроса. Таким образом, вызывающий абонент, который знает мой VCL, может легко установить флаг конвейера и обойти все проверки.
Другой вариант - сохранить все проверки в vcl_recv
, но это может быть неудобно или даже невозможно.
Предложения будут оценены. Спасибо.
Единственная серьезная проблема заключается в том, что я не знаю, как установить флаг
Вы можете снять его в начале вашего vcl_recv
, если количество перезапусков равно нулю (это указать «начальную» посадку в VCL, например
sub vcl_recv {
if (req.restarts == 0) {
unset req.http.X-Foo;
}
О, и я нашел только именно то, что вы искали при получении синтаксиса для этого :)