Reacting to client disconnect

If I have a long running http request, say a search in an admin UI or a report on an analytics dashboard and the user takes an action on the front end that makes that request stale I would abort it with an AbortSignal. This immediately terminates the request from the client’s perspective. If I have this code in C# as an example:

[HttpGet]
public async Task<string> Timeout(CancellationToken abort, int seconds)
{
    var tokenSource = CancellationTokenSource.CreateLinkedTokenSource(abort);
    var duration = new SqlParameter("duration", $"00:00:{seconds:00}");
    tokenSource.CancelAfter(2000);  
    await _context.Users.FromSqlRaw($"WAITFOR DELAY @duration;select * from AspNetUsers", duration).ToListAsync(tokenSource.Token);
    return "Done";
}

And I execute this in the browser:

fetch('https://localhost:7117/api/registration?seconds=2', { signal: AbortSignal.timeout(100)})

The C# code immediately aborts through the token, raising a System.Threading.Tasks.TaskCanceledException that the controller can handle and clean up with. Go does something very similar through a Context value in the request which can be forwarded to the SQL interface and used to abort queries immediately.

A similar function in Phoenix:

def index(conn, %{"seconds" => seconds}) do
  seconds = String.to_integer(seconds)
  query = "SELECT pg_sleep($1)"
  params = [seconds]
  t = Task.async(fn ->
    SQL.query(Timeouts.Repo, query, params)
  end)
  case Task.yield(t, 2_000) do
    {:ok, {:ok, _result}} ->
      send_resp(conn, 200, "Slept for #{seconds} seconds")
    {:ok, {:error, _reason}} ->
      send_resp(conn, 500, "Failed to execute sleep query")
    nil ->
      send_resp(conn, 503, "Failed to complete in time")
  end
end

This handles timeouts nicely, and I can see the query being aborted and cleaned up in the logs. This is 80% of what I want so I’m already pretty happy. However if I send the query with the abort signal it still runs up until the server’s timeout. Does anything in Plug or Bandit signal the client hanging up in a similar way as the C# example? There are a few places in my app where I would like to release resources sooner if possible.