feat(tradein-browser): additive POST /fetch-json + BrowserFetcher.fetch_json (#915 Stage 2) #1915
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1915
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/915-stage2-fetch-json"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
POST /fetch-jsonto the camoufox sidecar +BrowserFetcher.fetch_json()client method.fetch()from the warm camoufox page (same-origin, real fingerprint + context cookies + per-provider proxy) and get{status, body}back.origin(anchor page, short 500ms settle vs fullBROWSER_WAIT_MS), runsfetchviapage.evaluate, mirrors_fetch_oncelifecycle + recycle/relaunch;_do_fetch_jsonmirrors_do_fetchcrash-retry;fetch_json_handlermirrorsfetch_handler(400/503/500).fetch's single-retry-on-HTTPError/TransportError pattern./fetch,_fetch_once,_do_fetch,fetch_handler,BrowserFetcher.fetchuntouched. Nothing in prod calls it yet — a follow-up PR (#915 Stage 3) wires avito IMV to it, which can unblock #562 (IMV via warm browser session instead of needing the #853 proxy).Test plan
browser/test_server_fetch_json.py— 8 tests (happy path, origin navigation, explicit origin, POST passthrough, 400 missing url, 400 bad json, 503 unavailable, 500 on evaluate error + page closed).tests/scrapers/test_browser_fetcher.py— 5 new fetch_json tests (returns dict, full payload, defaults, one retry, raise-after-two) → 13 passed.ruff checkclean on all changed files.Refs #915
Add an in-page fetch() path so backend code can run a same-origin fetch from inside the warm camoufox page (real fingerprint + context cookies + per-provider proxy) and get back {status, body}. Purely additive: /fetch, _fetch_once, _do_fetch, fetch_handler and BrowserFetcher.fetch are untouched. Nothing in the prod flow calls it yet — a later PR wires avito IMV to it. Sidecar: _fetch_json_once navigates to origin (anchor page, short 500ms settle instead of full BROWSER_WAIT_MS), runs fetch via page.evaluate, mirrors the _fetch_once page lifecycle + recycle/relaunch. _do_fetch_json mirrors _do_fetch crash-retry. fetch_json_handler mirrors fetch_handler (400/503/500 handling). Client: BrowserFetcher.fetch_json posts to /fetch-json with the same single-retry-on-HTTPError/TransportError pattern as fetch. Tests: browser/test_server_fetch_json.py (handler happy path, origin navigation, POST payload passthrough, 400 missing url, 400 bad json, 503 unavailable, 500 on evaluate error) and backend fetch_json client tests (payload, defaults, retry, raise-after-two-errors). Refs #915 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>