The HTTP protocol provides a special mechanism allowing an already established connection to a new, incompatible, protocol. This mechanism is always client initiated, and the server may accept or refuse the switch to the new protocol.
When the client wants to upgrade to a new protocol, it sends a normal request to the server (being a
POST or any other request type) and add the Upgrade: header followed by the protocol it wants to upgrade too. It can specify several of them, in order of preference.
The server may either refuse the upgrade — in this case it merely ignores the Upgrade: header and send back a regular response (
200 OK if it can serve the requested resource, a
30x status code if it wants to perform a redirect, a
50x one if it can't serve the requested resource) — or accept the upgrade. In this case it sends back a
101 Switching Protocols along with an Upgrade header containing the protocol chosen.
Right after sending the
101 status code, an eventual handshake for the new protocol happens, if this one requires one, then the server send the answer requested for the previous request, following the new protocol rules.
The Upgrade: header
The 101 status code