[/
    Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)

    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

    Official repository: https://github.com/boostorg/beast
]

[/-----------------------------------------------------------------------------]

[section:decorator Decorator]

For programs which need to modify either the outgoing WebSocket HTTP Upgrade
request, the outgoing WebSocket HTTP Upgrade response, or both, the stream
supports an optional property called a ['decorator]. This is a function 
pointer or callable object which is invoked before the implementation
sends an HTTP message. The decorator receives a modifiable reference to
the message, allowing for modifications. The interface to this system
uses:

[table WebSocket Decorator Interface
[[Name][Description]]
[[
    [link beast.ref.boost__beast__websocket__request_type `request_type`]
][
    This is the type of the object passed to the decorator to
    represent HTTP Upgrade requests.
]]
[[
    [link beast.ref.boost__beast__websocket__response_type `response_type`]
][
    This is the type of the object passed to the decorator to
    represent HTTP Upgrade response.
]]
[[
    [link beast.ref.boost__beast__websocket__stream_base__decorator `stream_base::decorator`]
][
    Objects of this type are used to hold a decorator to be
    set on the stream using `set_option`.
]]
[[
    [link beast.ref.boost__beast__websocket__stream.set_option `stream::set_option`]
][
    This function is used to set a `stream_base::decorator` on the stream.
]]
]

This declares a normal function which decorates outgoing HTTP requests:

[code_websocket_3_1]

When using a decorator, it must be set on the stream before any handshaking
takes place. This sets the decorator on the stream, to be used for all
subsequent calls to accept or handshake:

[code_websocket_3_2]

Alternatively, a function object may be used. Small function objects will
not incur a memory allocation. The follow code declares and sets a function
object as a decorator:

[code_websocket_3_3]

A lambda may be used in place of a named function object:

[code_websocket_3_4]

It also possible for a single decorator to handle both requests and
responses, if it is overloaded for both types either as a generic
lambda (C++14 and later) or as a class as shown here:

[code_websocket_3_5]

The implementation takes ownership by decay-copy of the invocable object
used as the decorator. Move-only types are possible:

[code_websocket_3_6]

[important
    Undefined behavior results if the decorator modifies the fields
    specific to perform the WebSocket Upgrade, such as the Upgrade
    or Connection fields.
]

[endsect]
