::: Protocol upgrades Cowboy features many different handlers, each for different purposes. All handlers have a common entry point: the `init/3` function. The default handler type is the simple HTTP handler. To switch to a different protocol, you must perform a protocol upgrade. This is what is done for Websocket and REST and is explained in details in the respective chapters. You can also create your own protocol on top of Cowboy and use the protocol upgrade mechanism to switch to it. For example, if you create the `my_protocol` module implementing the `cowboy_sub_protocol` behavior, then you can upgrade to it by simply returning the module name from `init/3`. ``` erlang init(_, _, _Opts) -> {upgrade, protocol, my_protocol}. ``` The `cowboy_sub_protocol` behavior only requires one callback, `upgrade/4`. It receives the Req object, the middleware environment, and the handler and options for this request. This is the same module as the `init/3` function and the same options that were passed to it. ``` erlang upgrade(Req, Env, Handler, HandlerOpts) -> %% ... ``` This callback is expected to behave like a middleware. Please see the corresponding chapter for more information.