fix: don't read Cloudflare's injected jsd script as a refusal
demonicscans.org turned JS detections on, so Cloudflare began injecting /cdn-cgi/challenge-platform/scripts/jsd/main.js into ordinary 200 pages. isInterstitial matched the bare /cdn-cgi/challenge-platform/ prefix, so every real demonic series page became errChallengeHeld: two per pass parked the Lane in the 15m refusal backoff while plain TLS was in fact returning the full page (200, 133KB, 22 chapter anchors, verified live 2026-08-16). Match the challenge orchestration path /cdn-cgi/challenge-platform/h/ instead — served only by the interstitial itself, stable across its wording and locale.
This commit is contained in:
@@ -117,6 +117,25 @@ func TestBrowserOnlyCoverURL(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// The jsd script is injected into ordinary 200 pages when a zone turns JS
|
||||
// detections on; only the orchestration path means the page itself is the
|
||||
// challenge. Conflating the two parked the demonic Lane in refusal backoff
|
||||
// while every fetch was in fact the real series page (observed 2026-08-16).
|
||||
func TestIsInterstitial(t *testing.T) {
|
||||
if !isInterstitial(challengeFixture) {
|
||||
t.Fatal("challenge page not detected as interstitial")
|
||||
}
|
||||
const jsdInjected = `<html><head><title>The Possessed Grappler</title>
|
||||
<script src="/cdn-cgi/challenge-platform/scripts/jsd/main.js"></script></head>
|
||||
<body><a href="/chaptered.php?manga=13721&chapter=22">Chapter 22</a></body></html>`
|
||||
if isInterstitial(jsdInjected) {
|
||||
t.Fatal("real page carrying the injected jsd script misread as interstitial")
|
||||
}
|
||||
if got, ok := demonicLatestChapter("", jsdInjected); !ok || got.Label != "Chapter 22" {
|
||||
t.Fatalf("demonicLatestChapter = %+v, ok = %v, want Chapter 22", got, ok)
|
||||
}
|
||||
}
|
||||
func TestClassifyBrowserInterruption(t *testing.T) {
|
||||
if err := classifyBrowserError(context.Background(), true, context.Canceled); !errors.Is(err, errBrowserInterrupted) {
|
||||
t.Fatalf("classifyBrowserError(context.Canceled) = %v, want browser interruption", err)
|
||||
|
||||
Reference in New Issue
Block a user