.. _whatsnew_changes_7.4:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Changes in Varnish **7.4**
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

For information about updating your current Varnish deployment to the
new version, see :ref:`whatsnew_upgrading_7.4`.

A more detailed and technical account of changes in Varnish, with
links to issues that have been fixed and pull requests that have been
merged, may be found in the `change log`_.

.. _change log: https://github.com/varnishcache/varnish-cache/blob/master/doc/changes.rst

varnishd
========

HTTP/2 header field validation is now more strict with respect to
allowed characters.

The :ref:`vcl-step(7)` manual page has been added to document the VCL
state machines.

VCL Tracing
~~~~~~~~~~~

VCL tracing now needs to be explicitly activated by setting the
``req.trace`` or ``bereq.trace`` VCL variables, which are initialized
from the ``feature +trace`` flag. Only if the trace variables are set
will ``VCL_trace`` log records be generated.

Consequently, ``VCL_trace`` has been removed from the default
``vsl_mask``, so any trace records will be emitted by
default. ``vsl_mask`` can still be used to filter ``VCL_trace``
records.

To trace ``vcl_init {}`` and ``vcl_fini {}``, set the ``feature
+trace`` flag while the vcl is loaded/discarded.

Parameters
~~~~~~~~~~

The ``startup_timeout`` parameter now specifically replaces
``cli_timeout`` for the initial startup only.

Changes to VCL
==============

The ``Content-Length`` and ``Transfer-Encoding`` headers are now
protected. For the common use case of ``unset
(be)req.http.Content-Length`` to dismiss a body, ``unset
(be)req.body`` should be used.

varnishlog
==========

Object creation failures by the selected storage engine are now logged
under the ``Error`` tag as ``Failed to create object object from %s
%s``.

varnishadm
==========

Tabulation of the ``vcl.list`` CLI output has been modified slightly.

varnishstat
===========

The counter ``MAIN.http1_iovs_flush`` has been added to track the
number of premature ``writev()`` calls due to an insufficient number
of IO vectors. This number is configured through the ``http1_iovs``
parameter for client connections and implicitly defined by the amount
of free workspace for backend connections.

varnishtest
===========

The basename of the test directory is now available as the ``vtcid``
macro to serve as a unique string across concurrently running tests.

The ``varnishd_args_prepend`` and ``varnishd_args_append`` macros have
been added to allow addition of arguments to ``varnishd`` invocations
before and after those added by ``varnishtest`` by default.

``User-Agent`` request and ``Server`` response headers are now created
by default, containing the respective client and server name. The
``txreq -nouseragent`` and ``txresp -noserver`` options disable
addition of these headers.

Changes for developers and VMOD authors
=======================================

Call sites of VMOD functions and methods can now be restricted to
built-in subroutines using the ``$Restrict`` stanza in the VCC file.

``.vcc`` files of VMODs are now installed to
``/usr/share/varnish/vcc`` (or equivalent) to enable re-use by other
tools like code editors.

API Changes
~~~~~~~~~~~

The ``varnishapi`` version has been increased to 3.1 and the
``VSHA256_*``, ``VENC_Encode_Base64()`` and ``VENC_Decode_Base64()``
functions are now exposed.

In ``struct vsmwseg`` and ``struct vsm_fantom``, the ``class`` member
has been renamed to ``category``.

The ``VSB_quote_pfx()`` (and, consequently, ``VSB_quote()``) function
no longer produces ``\v`` for a vertical tab. This improves
compatibility with JSON.

Additions to varnish C header files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The ``PTOK()`` macro has been added to ``vas.h`` to simplify error
checking of ``pthread_*`` POSIX functions.

The ``v_cold`` macro has been added to add ``__attribute__((cold))``
on compilers supporting it. It is used for ``VRT_fail()`` to mark
failure code paths as cold.

The utility macros ``ALLOC_OBJ_EXTRA()`` and ``ALLOC_FLEX_OBJ()`` have
been added to ``miniobj.h`` to simplify allocation of objects larger
than a struct and such with a flexible array.

*eof*
