Skip to content

Fix register_before_send with upgrade_adapter#1320

Merged
josevalim merged 3 commits into
elixir-plug:mainfrom
SteffenDE:sd-fix-before-sent-upgraded
Jun 30, 2026
Merged

Fix register_before_send with upgrade_adapter#1320
josevalim merged 3 commits into
elixir-plug:mainfrom
SteffenDE:sd-fix-before-sent-upgraded

Conversation

@SteffenDE

Copy link
Copy Markdown
Contributor

Adds :set_upgrade state and runs before_send before calling upgrade.

Comment thread lib/plug/conn.ex
{:ok, payload} ->
conn = run_before_send(conn, :upgraded)
%{conn | adapter: {adapter, payload}}
%{conn | state: :upgraded, adapter: {adapter, payload}}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we should set status: 101 here for phoenixframework/phoenix#6741.

Adds :set_upgrade state and runs before_send before calling upgrade.
@SteffenDE
SteffenDE force-pushed the sd-fix-before-sent-upgraded branch from 461296f to f664a53 Compare June 30, 2026 10:43
@josevalim
josevalim merged commit 96f573e into elixir-plug:main Jun 30, 2026
2 checks passed
@josevalim

Copy link
Copy Markdown
Member

💚 💙 💜 💛 ❤️

v0idpwn pushed a commit to supabase/supavisor that referenced this pull request Jul 23, 2026
…1125)

<!-- ccr-slack-attribution -->
_Requested by **Jefferson Venerando, Felipe Stival** · [Slack
thread](https://supabase.slack.com/archives/C04JR9DBNQL/p1784832508728499?thread_ts=1784832508.728499&cid=C04JR9DBNQL)_

### Before

After the Plug 1.20 bump (shipped in v2.9.9), a websocket upgrade on
`GET /v2` leaves `conn.status` nil. Plug 1.20.0 newly runs `before_send`
callbacks on `Plug.Conn.upgrade_adapter/3`, which fires Phoenix's
`[:phoenix, :endpoint, :stop]` telemetry handler while `conn.status` is
still `nil`. That handler calls `Plug.Conn.Status.code(nil)`, which
raises `:function_clause`. Erlang `:telemetry` then permanently detaches
the failing handler node-wide, so all per-request Phoenix logs stop
appearing in Logflare until the node restarts.

The offending route is `lib/supavisor_web/ws_proxy.ex`, which upgrades
via `Plug.Conn.upgrade_adapter/3` without setting a status.

### After

Bumping `plug` to 1.20.3 makes upgrades default `conn.status` to `101`
before running `before_send` (Plug
[#1320](elixir-plug/plug#1320)), so the
telemetry handler never sees `nil`, never raises, and request logging
keeps working. 1.20.3 also carries CVE fixes.

### How

Single-line `mix.lock` bump of `plug` from 1.20.1 to 1.20.3. `plug` is a
transitive dependency (via `phoenix`/`plug_cowboy`), so there is no
`mix.exs` change and no application code change.

Refs:
- Plug fix:
[elixir-plug/plug#1320](elixir-plug/plug#1320)
- Phoenix report:
[phoenixframework/phoenix#6741](phoenixframework/phoenix#6741)
(closed "Fixed upstream!")

---
_Generated by [Claude
Code](https://claude.ai/code/session_01DuxufDmqyTd3iswyfg5msD)_

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants