antiwork/gumroad · warning
Dropped a non-Inertia response to a background content-page
Error message
Dropped a non-Inertia response to a background content-page poll of ${redactUrlForLogging(requestedUrl)} (path redacted on purpose — it is not safe to share). Something between the browser and Gumroad answered the poll with its own page (an edge challenge, a proxy error, a captive portal). The page keeps what it already loaded and the poll keeps retrying; further drops for this page are not logged. What it means
Not a thrown error — a one-time-per-URL console breadcrumb from warnAboutDroppedPollResponse. The buyer content page's background poll (an Inertia partial reload of audio_durations / latest_media_locations, every few seconds) received a non-Inertia response (no X-Inertia header) from the same URL it requested; the guard decided to drop it instead of navigating, so the page keeps its state and the poll retries. The logged path is redacted to /d/[redacted] because the /d/:token URL is itself the access credential and the warning is expected to be pasted into support tickets.
Source
Thrown at app/javascript/utils/inertia_partial_reload.ts:170
/**
* Warns once per URL that a background poll response was dropped. Safe to call on every drop.
* The warning names only the redacted path shape — never the content token or query string.
*
* `response` is the same axios response passed to `isUnredirectedDownloadPagePollResponse`.
*/
export const warnAboutDroppedPollResponse = (response: unknown): void => {
if (!isRecord(response)) return;
const { config, request } = response;
// Prefer the URL the browser actually ended on; fall back to the one the request asked for.
const requestedUrl =
(isRecord(request) ? stringOrNull(request.responseURL) : null) ??
(isRecord(config) ? stringOrNull(config.url) : null);
if (requestedUrl === null || alreadyWarnedUrls.has(requestedUrl)) return;
alreadyWarnedUrls.add(requestedUrl);
// eslint-disable-next-line no-console
console.warn(
`Dropped a non-Inertia response to a background content-page poll of ${redactUrlForLogging(requestedUrl)} (path redacted on purpose — it is not safe to share). Something between the browser and Gumroad answered the poll with its own page (an edge challenge, a proxy error, a captive portal). The page keeps what it already loaded and the poll keeps retrying; further drops for this page are not logged.`,
);
};
View on GitHub (pinned to afeacbd394)
Solutions
- Treat it as network interception, not an app bug: ask the buyer to switch networks or retry after leaving the captive portal; the poll self-heals when interception ends.
- If reproducible on a clean network, capture the actual response body/status in devtools to identify which middlebox is answering.
- No page code change is needed — dropping and retrying is the designed recovery; the warning exists only as a diagnostic breadcrumb.
Defensive patterns
Strategy: fallback
Validate before calling
import { isUnredirectedDownloadPagePollResponse, warnAboutDroppedPollResponse } from "@/utils/inertia_partial_reload";
// In the Inertia "invalid" response handler, before navigating:
if (isUnredirectedDownloadPagePollResponse(response)) {
warnAboutDroppedPollResponse(response); // one-time, redacted breadcrumb
return; // keep page state; the poll retries on its timer
}
// otherwise navigate as Inertia does by default Type guard
// Narrows an unknown axios response to a droppable download-page poll
const isUnredirectedDownloadPagePollResponse = (response: unknown): boolean => {
if (!isRecord(response)) return false;
const { config } = response;
if (!isRecord(config)) return false;
return isGet(config) && isDownloadPagePoll(config) && !wasRedirected(config, (response as { request?: unknown }).request);
}; Prevention
- Never navigate on a same-URL non-Inertia poll response — navigating re-issues the intercepted request and loses the buyer's session progress.
- Log only redacted URL shapes from buyer pages; /d/:token URLs are credentials and end up pasted into support tickets.
- Warn once per URL per page load; per-poll logging buries the console and leaks nothing extra.
When it happens
Trigger: A network middlebox answers the poll with its own HTML while the buyer is on a /d/:token content page: cloudflare-style edge challenge, ISP or captive-portal interception, corporate proxy error page, or an injected gateway login. The URL is deliberately not safe to print because the token grants file access.
Common situations: Buyers on hotel/airport wifi behind captive portals, VPNs with TLS inspection, regions with DNS-level interception, or transient CDN 502/503 HTML pages during incidents.
Related errors
AI-assisted analysis of antiwork/gumroad@afeacbd394 (2026-08-21).
Data as JSON: /api/errors/2239f42b46fe30c9.
Report an issue: GitHub.