Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
VCL-STEPS(7)	       Miscellaneous Information Manual		  VCL-STEPS(7)

NAME
       VCL-steps - Built-in subroutines

DESCRIPTION
       Various built-in	subroutines are	called during processing of client and
       backend requests	as well	as upon	vcl.load and vcl.discard.

       See  reference-states  for  a detailed graphical	overview of the	states
       and how they relate to core code	functions and VCL subroutines.

       Built-in	subroutines always terminate with a return  (<action>),	 where
       <action>	 determines how	processing continues in	the request processing
       state machine.

       The behaviour of	actions	is identical or	at least similar  across  sub-
       routines, so differences	are only documented where relevant.

       Common  actions	are documented in vcl_actions in the next section. Ac-
       tions specific to only  one  or	some  subroutines  are	documented  in
       vcl_steps.

       A  default  behavior  is	 provided  for	all  reference-states  in  the
       vcl-built-in-code code.

VCL ACTIONS
       Actions are used	with the return(<action>) keyword, which returns  con-
       trol  from  subroutines	back to	vinyld.	The action determines how pro-
       cessing in vinyld continues as shown in reference-states.

       Common actions are documented here, while additional  actions  specific
       to  only	 one  or  some	subroutines are	documented in the next section
       vcl_steps as well as which action can be	used from which	built in  sub-
       routine.

   Common actions for the client and backend side
   fail(err)
	  Transition  to vcl_synth on the client side as for return(synth(503,
	  "VCL Failed")), but with any request	state  changes	undone	as  if
	  std.rollback()  was  called  and forcing a connection	close. The op-
	  tional string	argument err is	logged to VSL under a VCL_Error	tag.

	  Returning fail from vcl_synth	sends a	minimal	response  with	a  500
	  status.

	  Intended  for	fatal errors, for which	only minimal error handling is
	  possible.

   Common actions for the client side
   synth(status	code, reason)
	  Transition to	vcl_synth with resp.status and resp.reason being  pre-
	  set to the arguments of synth().

   pass
	  Switch  to  pass  mode, making the current request not use the cache
	  and not putting its response into it.	Control	will  eventually  pass
	  to vcl_pass.

   pipe
	  Switch to pipe mode. Control will eventually pass to vcl_pipe.

   restart
	  Restart the transaction. Increases the req.restarts counter.

	  If the number	of restarts is higher than the max_restarts parameter,
	  control  is  passed  to vcl_synth as for return(synth(503, "Too many
	  restarts"))

	  For a	restart, all modifications to req attributes are preserved ex-
	  cept for req.restarts	and req.xid, which need	to change by design.

   Common actions for the backend side
   abandon
	  Abandon the backend request. Unless the backend request was a	 back-
	  ground fetch,	control	is passed to vcl_synth on the client side with
	  resp.status preset to	503.

VCL STEPS
   Client side
   vcl_recv
       Called  at  the	beginning of a request,	after the complete request has
       been received and parsed, after a restart or as the result  of  an  ESI
       include.

       Its  purpose is to decide whether or not	to serve the request, possibly
       modify it and decide on how to process it further. A backend  hint  may
       be set as a default for the backend processing side.

       The  vcl_recv  subroutine may terminate with calling return() on	one of
       the following keywords:

	  fail(err)
	    see	fail section above

	  synth(status code, reason)
	    see	synth section above

	  restart
	    see	restart	section	above

	  pass
	    see	pass section above

	  pipe
	    see	pipe section above

	  hash
	    Continue processing	the object as a	potential candidate for
	    caching. Passes the	control	over to	vcl_hash.

	  purge
	    Purge the object and it's variants.	Control	passes through
	    vcl_hash to	vcl_purge.

	  vcl(label)
	    Switch to vcl labelled label.

	    This will roll back	the request as if std.rollback(req) was
	    called and continue	vcl processing in vcl_recv of the vcl
	    labelled label as if it was	the active vcl.

	    The	vcl(label) return is only valid	while the req.restarts
	    count is zero and if used from the active vcl.

	    See	the ref_cli_vcl_label command in vinyl-cli(7).

   vcl_pipe
       Called upon entering pipe mode. In this mode, the request is passed  on
       to  the	backend, and any further data from both	the client and backend
       is passed on unaltered until either end closes  the  connection.	 Basi-
       cally,  Vinyl  Cache  will  degrade  into a simple TCP proxy, shuffling
       bytes back and forth. For a connection in pipe mode, no other VCL  sub-
       routine will ever get called after vcl_pipe.

       The vcl_pipe subroutine may terminate with calling return() with	one of
       the following keywords:

	  fail(err)
	    see	fail section above

	  synth(status code, reason)
	    see	synth section above

	  pipe
	    Proceed with pipe mode.

   vcl_pass
       Called  upon entering pass mode.	In this	mode, the request is passed on
       to the backend, and the backend's response is passed on to the  client,
       but  is	not entered into the cache. Subsequent requests	submitted over
       the same	client connection are handled normally.

       The vcl_pass subroutine may terminate with calling return() with	one of
       the following keywords:

	  fail(err)
	    see	fail section above

	  synth(status code, reason)
	    see	synth section above

	  restart
	    see	restart	section	above

	  fetch
	    Proceed with pass mode - initiate a	backend	request.

   vcl_hash
       Called after vcl_recv to	create a hash value for	the request.  This  is
       used as a key to	look up	the object in Vinyl Cache.

       The vcl_hash subroutine may terminate with calling return() with	one of
       the following keywords:

	  fail(err)
	    see	 fail section above

	  lookup
	    Look up the	object in cache.

	    Control passes to vcl_purge	when coming from a purge
	    return in vcl_recv.

	    Otherwise control passes to	the next subroutine depending on the
	    result of the cache	lookup:

	    * a	hit: pass to vcl_hit

	    * a	miss or	a hit on a hit-for-miss	object (an object with
	      obj.uncacheable == true):	pass to	vcl_miss

	    * a	hit on a hit-for-pass object (for which	pass(DURATION) had been
	      previously returned from vcl_backend_response): pass to
	      vcl_pass

   vcl_purge
       Called after the	purge has been executed	and all	its variants have been
       evicted.

       The  vcl_purge  subroutine may terminate	with calling return() with one
       of the following	keywords:

	  fail(err)
	    see	fail section above

	  synth(status code, reason)
	    see	synth section above

	  restart
	    see	restart	section	above

   vcl_miss
       Called after a cache lookup if the requested document was not found  in
       the cache or if vcl_hit returned	fetch.

       Its purpose is to decide	whether	or not to attempt to retrieve the doc-
       ument  from the backend.	A backend hint may be set as a default for the
       backend processing side.

       The vcl_miss subroutine may terminate with calling return() with	one of
       the following keywords:

	  fail(err)
	    see	fail section above

	  synth(status code, reason)
	    see	synth section above

	  restart
	    see	restart	section	above

	  pass
	    see	pass section above

	  fetch
	    Retrieve the requested object from the backend. Control will
	    eventually pass to vcl_backend_fetch.

   vcl_hit
       Called when a cache lookup is successful. The object being hit  may  be
       stale:  It can have a zero or negative ttl with only grace or keep time
       left.

       The vcl_hit subroutine may terminate with calling return() with one  of
       the following keywords:
	  fail(err)
	    see	fail section above

	  synth(status code, reason)
	    see	synth section above

	  restart
	    see	restart	section	above

	  pass
	    see	pass section above

	  deliver
	    Deliver the	object.	If it is stale,	a background fetch to refresh
	    it is triggered.

   vcl_deliver
       Called  before any object except	a vcl_synth result is delivered	to the
       client.

       The vcl_deliver subroutine may terminate	with calling return() with one
       of the following	keywords:

	  fail(err)
	    see	fail section above

	  synth(status code, reason)
	    see	synth section above

	  restart
	    see	restart	section	above

	  deliver
	    Deliver the	object to the client.

   vcl_synth
       Called to deliver a synthetic object. A synthetic object	 is  generated
       in VCL, not fetched from	the backend. Its body may be constructed using
       the synthetic() function.

       A  vcl_synth  defined  object  never  enters  the  cache, contrary to a
       vcl_backend_error defined object, which may end up in cache.

       The subroutine may terminate with calling return() with one of the fol-
       lowing keywords:

	  fail(err)
	    see	fail section above

	  restart
	    see	restart	section	above

	  deliver
	    Directly deliver the object	defined	by vcl_synth to	the client
	    without calling vcl_deliver.

   Backend Side
   vcl_backend_fetch
       Called before sending the backend request. In this subroutine you typi-
       cally alter the request before it gets to the backend.

       The vcl_backend_fetch subroutine	may terminate  with  calling  return()
       with one	of the following keywords:

	  fail(err)
	    see	fail section above

	  abandon
	    see	abandon	section	above

	  fetch
	    Fetch the object from the backend.

	  error(status code, reason)
	    Transition to vcl_backend_error with beresp.status and
	    beresp.reason being	preset to the arguments	of error() if
	    arguments are provided.

       Before  calling	vcl_backend_fetch, Vinyl Cache core prepares the bereq
       backend request as follows:

        Unless	the request is a pass,

	  set bereq.method to GET and bereq.proto to HTTP/1.1 and

	  set bereq.http.Accept_Encoding to gzip if  ref_param_http_gzip_sup-
	   port	is enabled.

        If  there  is	an  existing  cache  object  to	 be  revalidated,  set
	 bereq.http.If-Modified-Since from its Last-Modified header and/or set
	 bereq.http.If-None-Match from its Etag	header

        Set bereq.http.X-Vinyl	to the current transaction id (vxid)

       These changes can be undone or modified in vcl_backend_fetch before the
       backend request is issued.

       In particular, to cache non-GET requests, req.method needs to be	 saved
       to  a  header or	variable in vcl_recv and restored to bereq.method. No-
       tice that caching non-GET requests typically also requires changing the
       cache key in vcl_hash e.g. by also hashing the  request	method	and/or
       request body.

       HEAD request can	be satisfied from cached GET responses.

   vcl_backend_refresh
       This  subroutine	 is called after a legitimate 304 response is received
       from the	backend	so that	you can	chose how to handle the	object revali-
       dation.

       The default is to apply the RFC logic which is to merge the new headers
       with the	stale ones.

       The returned value only affects response	headers, the body that is  de-
       livered is always the one from the stale	object.

       See vcl-built-in-refresh	for additional explanations.

	  merge
	    Merge the headers we got from the backend response with
	    the	ones we	had in the cached object.

	  obj_stale
	    Return the stale object's headers without performing the RFC merge logic.

	  beresp
	    Return the beresp headers as they were at the end of this subroutine
	    without executing the RFC merge logic. Any content-length and
	    content-encoding headers present in	the 304	beresp will be removed and
	    replaced by	the stale object ones if available. Etag and Last-Modified
	    headers are	also copied from the stale object to allow future revalidations.

	  fail
	    see	fail section above

	  abandon
	    see	abandon	section	above

	  retry
	    Retry the backend transaction. Increases the retries counter.
	    If the number of retries is	higher than max_retries,
	    control will be passed to vcl_backend_error.

	  error(status code, reason)
	    Transition to vcl_backend_error with beresp.status and
	    beresp.reason being	preset to the arguments	of error() if
	    arguments are provided.

   vcl_backend_response
       Called after the	response headers have been successfully	retrieved from
       the backend.

       The vcl_backend_response	subroutine may terminate with calling return()
       with one	of the following keywords:

	  fail(err)
	    see	fail section above

	  abandon
	    see	abandon	section	above

	  deliver
	    For	a 304 response,	create an updated cache	object.
	    Otherwise, fetch the object	body from the backend and initiate
	    delivery to	any waiting client requests, possibly in parallel
	    (streaming).

	  retry
	    Retry the backend transaction. Increases the retries counter.
	    If the number of retries is	higher than max_retries,
	    control will be passed to vcl_backend_error.

	  pass(duration)
	    Mark the object as a hit-for-pass for the given duration. Subsequent
	    lookups hitting this object	will be	turned into passed transactions,
	    as if vcl_recv had returned	pass.

	  error(status code, reason)
	    Transition to vcl_backend_error with beresp.status and
	    beresp.reason being	preset to the arguments	of error() if
	    arguments are provided.

   vcl_backend_error
       This  subroutine	 is  called if we fail the backend fetch or if max_re-
       tries has been exceeded.

       Returning with abandon does not leave a cache object.

       If returning with deliver and beresp.uncacheable	== false, a  synthetic
       cache  object  is generated in VCL, whose body may be constructed using
       the synthetic() function.

       Since these synthetic objects  are  cached  in  these  special  circum-
       stances,	be cautious with putting private information there. If you re-
       ally  must,  then you need to explicitly	set beresp.uncacheable to true
       in vcl_backend_error.

       The vcl_backend_error subroutine	may terminate  with  calling  return()
       with one	of the following keywords:

	  fail(err)
	    see	fail section above

	  abandon
	    see	abandon	section	above

	  deliver
	    Deliver and	possibly cache the object defined in
	    vcl_backend_error as if it was fetched from	the backend, also
	    referred to	as a "backend synth".

	  retry
	    Retry the backend transaction. Increases the retries counter.
	    If the number of retries is	higher than max_retries,
	    vcl_synth on the client side is called with	resp.status
	    preset to 503.

   During vcl.load / vcl.discard
   vcl_init
       Called  when VCL	is loaded, before any requests pass through it.	 Typi-
       cally used to initialize	VMODs.

       The vcl_init subroutine may terminate with calling return() with	one of
       the following keywords:

	  ok
	    Normal return, VCL continues loading.

	  fail(err)
	    Abort loading of this VCL.

   vcl_fini
       Called when VCL is discarded only after all requests  have  exited  the
       VCL.  Typically used to clean up	VMODs.

       The vcl_fini subroutine may terminate with calling return() with	one of
       the following keywords:

	  ok
	    Normal return, VCL will be discarded.

SEE ALSO
        vinyld(1)

        vcl(7)

COPYRIGHT
       This document is	licensed under the same	license	as Vinyl Cache itself.
       See LICENSE for details.

        Copyright (c) 2006 Verdens Gang AS

        Copyright (c) 2006-2021 Varnish Software AS

								  VCL-STEPS(7)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=vcl-step&sektion=7&manpath=FreeBSD+Ports+15.1.quarterly>

home | help