Connector: Generic HTTP (http)
Purpose: HTML pages (pricing, news lists, security bulletins, changelogs), JSON documents, plain text and
HEAD-only header monitoring. Sensor types: HTML, JSON, XML, HTTP_HEADERS, FILE.
Retrieval: conditional GET (ETag / If-Modified-Since), gzip/br, manual redirects (≤ 5, SSRF-checked per hop),
12 MB limit, 25 s timeout, HTTP/2 with automatic HTTP/1.1 pin on NGHTTP2 stream errors, one browser-UA retry on
403 or TLS/connection resets, Scrapfly fallback if the source allows it.
Normalization: canonicalizeHtml (removes script/style/nav/footer/aside/cookie chrome, comments, tracking
params; scrubs clock times, "x minutes ago", hashes/UUIDs, tokens, visitor counters) → canonical text, headings,
links, structure counts, meta dates; JSON → sorted-key canonical form (jsonPath, ignoreKeys config).
Thin pages (< 40 chars, no headings: JS shells, interstitials) get extraction confidence 0.3 and never produce
events (flip protection).
Config: keepChrome, jsonPath, ignoreKeys, accept, headers, method: HEAD, renderJs (Scrapfly).
Known quirks: Akamai/Cloudflare bot management returns 403 or resets the connection for unknown UAs (handled
by the browser-UA retry, else Scrapfly). Client-rendered pages produce thin canonical text — prefer feeds/APIs.
Tests: packages/core/src/core.test.ts (canonicalization, diff, heuristics). Verified: 2026-09-08 on
~85 HTML/JSON sensors (Anthropic news/pricing, Stripe changelog, Apple system status, Wikipedia ITN…).