• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

supabase / supabase / 42619658336
87%

Build:
DEFAULT BRANCH: master
Ran 09 Nov 2026 12:50PM UTC
Jobs 1
Files 192
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

09 Nov 2026 12:45PM UTC coverage: 87.167% (+0.04%) from 87.132%
42619658336

push

github

web-flow
fix(studio): retry empty JSON GET responses without the HTTP cache (#53089)

## Problem

Successful GET requests sometimes reach Studio as a `200` with an empty
body. The fetcher turns these into `data: {}`, which doesn't match the
generated types, so components crash on nested reads such as
`pages[0].pagination.count`, `project.ref` and `features.vectorBuckets`.

Sentry diagnostics from #51123 show:

- Nearly all of these events come from Firefox.
- A `cache: 'no-store'` refetch of the same request returns a normal
body in more than 99% of events, so the API isn't sending empty
responses.
- The API sends no `Cache-Control` and a weak ETag, so Firefox
revalidates stored entries with `If-None-Match`. A browser cache or
revalidation bug is the most likely cause, but it isn't proven.

## Solution

When a successful response has an empty body,
`normalizeEmptyBodyResponse` now tries to recover it before falling back
to `{}`:

1. If only the clone used for the peek was empty, it reads the original
response and uses that body.
2. For JSON GET requests, it re-fetches once with `cache: 'no-store'`
and a new `X-Request-Id`, using plain `fetch` so the middleware can't
recurse. The retry uses the query's abort signal. A `2xx` response with
a body is returned to the caller.
3. Otherwise it keeps today's behavior: `Content-Length: 0`, which gives
`data: {}`.

The retry only covers GET requests with an `application/json` response,
so these stay unchanged:

- empty mutation responses
- the branch diff endpoint, which legitimately returns an empty
`text/html` body when there's no diff

The retry replaces the diagnostic probe, so a failure costs two requests
instead of three. The Sentry report gets a new `recovered_by` tag
(`original_body`, `refetch` or `none`), which will show whether the fix
works and whether the clone or the cache was at fault. The existing
`probe_*` fields keep their names, and Sentry still only receives body
lengths, never bodies.

### Why not byp... (continued)

2071 of 2439 branches covered (84.91%)

Branch coverage included in aggregate %.

2867 of 3226 relevant lines covered (88.87%)

200.9 hits per line

Subprojects
ID Flag name Job ID Ran Files Coverage
1 studio-tests 42619658336.1 09 Nov 2026 12:50PM UTC 768
38.59
GitHub Action Run
Source Files on build 42619658336
  • Tree
  • List 192
  • Changed 159
  • Source Changed 0
  • Coverage Changed 159
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #42619658336
  • d69d8e1b on github
  • Prev Build on master (#42574739761)
  • Next Build on master (#42620748891)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc