LIveview web socket connect not calling plug

Hi,

I’ve written a small plug that depending on the host that is connecting injects host specific parameters. This seems to work fine for the initial connection and mount, but fails when mounting the web socket connection afterwards (as described in the Liveview behaviour), ie here:

[info] CONNECTED TO Phoenix.LiveView.Socket in 16µs
  Transport: :websocket
  Parameters: %{"_csrf_token" => "asdfasdf", "_live_referer" => "undefined", "_mounts" => "0", "_track_static" => %{"0" => "http://localhost:4000/assets/app.css", "1" => "http://localhost:4000/assets/app.js"}, "vsn" => "2.0.0"}

The page now renders (due to the first mount succeeding), but shows a “Something went wrong! Hang in there while we get back on track” error message when attempting the web socket connection afterwards.

Is this expected? Can i somehow make the plug be executed like with the initial connection?

Tried to find documentation on this but to no success.

Wasn’t able to get the plugs to work reliably with liveview, so i instead used an on_mount function that acts the same (link to the docs). Shame, as it means one can’t share the same plug between liveview and normal views, but it works.

Isn’t it a proof that liveview web socket is calling your plug? Otherwis, it wouldn’t be broken. Maybe the parameters you injected interfere with liveview connection, so it think the connection attempt is from a unauthorized party, ie. cross-site attack.

What did you do in your plug?

The fact is that LiveView only passes through the Plug pipeline on the first connection.

So you could have a plug that adds information into the session for example.
On the mount/3 callback you could take the info from the session, add it to the state of the LiveView and use it on all other LiveView interactions.

After LiveView is mounted, it will not go through the plug pipeline again