fix(zoom): skip participants partitions blocked by Cloudflare WAF - #1933
Conversation
Since 2026-07-23 every zoom sync on dev-vhc dies on the participants stream: Cloudflare in front of api.zoom.us false-positives on the literal meeting uuid "9XG9hLVrTtWhAK2A7TFO6w==" and answers HTTP 403 with an HTML "Sorry, you have been blocked" page instead of a Zoom JSON error. Verified unauthenticated from the cluster: the block fires in both single- and double-escaped encodings, while other uuids with the same "==" tail get a normal Zoom 401 JSON - so it is the uuid string itself, not quota, encoding, or IP reputation. A meeting uuid is immutable, so the partition can never succeed; and because the parent _meetings cursor persists only via this stream's state (incremental_dependency), one blocked meeting wedges every subsequent sync on the same partition. Add an HttpResponseFilter (action=SUCCESS) matching the Cloudflare block page body next to the existing 404-skip filter. error_message_contains falls back to the raw body for non-JSON responses, so it matches the Cloudflare HTML page but never a genuine Zoom 403 (missing dashboard_meetings:read:admin scope - a JSON body), which keeps failing the sync loudly. Filter conditions OR together in the CDK and predicate only sees parsed JSON, so a body match without http_codes is the only way to express this. Mock tests: a Cloudflare-blocked partition is skipped while other meetings emit and parent_state advances past the blocked meeting; a genuine Zoom 403 still fails the sync. Issue: constructorfabric#1932 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Roman Mitasov <Roman.Mitasov@constructor.tech>
|
|
Warning Review limit reached
Next review available in: 1 minute Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
… manifest (#1936) #1933 fixed the participants stream (skip partitions 403-blocked by Cloudflare's WAF) in connector.yaml but left descriptor version at 1.2.0 — the version already active in Airbyte since Jul 14. Reconcile republishes a manifest only on descriptor-version drift, so it no-ops and the pre-fix manifest keeps running (and failing) every nightly sync. Patch bump per ADR-0015: republish + catalog re-discover, no full-refresh — the fix only skips poisoned partitions at extract time; bronze→silver semantics are unchanged. Refs #1932, #1933. Signed-off-by: Roman Mitasov <Roman.Mitasov@constructor.tech> Co-authored-by: Roman Mitasov <Roman.Mitasov@constructor.tech> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
What
Adds an
HttpResponseFilter(action: SUCCESS,error_message_contains: "Sorry, you have been blocked") to theparticipantsrequester of the zoom connector, next to the existing 404-skip filter, so partitions answered by Cloudflare's WAF block page are skipped instead of failing the sync forever.Issue: #1932
Why
Since 2026-07-23 every zoom sync on dev-vhc dies on
participants: Cloudflare in front ofapi.zoom.usfalse-positives on the literal meeting uuid9XG9hLVrTtWhAK2A7TFO6w==and answers HTTP 403 with an HTML "Sorry, you have been blocked" page instead of a Zoom JSON error. Verified unauthenticated from inside the cluster: the block fires in both single- and double-escaped encodings, while other uuids with the same==tail get a normal Zoom 401 JSON — it is the uuid string itself, not quota, encoding, or IP reputation. A meeting uuid is immutable, so the partition can never succeed; and because the parent_meetingscursor persists only via this stream's state (incremental_dependency), one blocked meeting wedges every subsequent sync on the same partition.Why match the body, not the status code
Real Zoom 403s (missing
dashboard_meetings:read:adminscope — a JSON body) must keep failing the sync loudly: silently skipping them would advance the parent cursor over meetings that were never fetched (permanent data loss, green-but-empty syncs). In the declarative CDK, filter conditions (http_codes/predicate/error_message_contains) OR together andpredicateonly sees the parsed JSON body, so an AND of "403 + Cloudflare body" is not expressible;error_message_containsfalls back to the raw body for non-JSON responses, which makes a body-only match on the block-page phrase exactly the discriminator needed. On a skipped partition theJsonDecoderyields{}for the HTML body, so the partition emits 0 records and the stream moves on — same mechanics as the existing 404 skip.Tests
Two new mock tests in
tests/test_participants.py(suite 18/18 green,validate_strict.pypasses):parent_stateadvances past the blocked meeting (it is deliberately the older one);After merge
Deploy the connector image on dev-vhc, then
argo submit --from cronwf/zoom-default-sync -n insightand verify the job is green and the_meetingscursor advances (checklist in #1932).🤖 Generated with Claude Code