Bug]: Crawl4aiDockerClient gets 400 with any BrowserConfig: dump() always sends the generated `headers`

Aperta Adatta ai principianti
#2,472 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
72/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
api, backend

Direzione di ricerca

Inizia leggendo BrowserConfig.dump() e l’inizializzazione descritta di BrowserConfig che genera sec-ch-ua; poi verifica la riproduzione del caricamento non attendibile nell’issue. Verifica che la configurazione serializzata non invii più il campo headers generato e che una richiesta con BrowserConfig() venga accettata dal server.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

⚙ Done 🐞 Bug 📌 Root caused
crawl4ai version

0.9.5 (also on develop; since 0.9.0)

Expected Behavior

Crawl4aiDockerClient.crawl(..., browser_config=BrowserConfig(headless=True)) is accepted by the server. The user did not set any headers.

Current Behavior

Every request with a BrowserConfig is rejected:

400 Rejected request: field 'headers' is not permitted on BrowserConfig from an untrusted request

BrowserConfig.__init__ always adds a sec-ch-ua header derived from the user agent:

self.browser_hint = UAGen.generate_client_hints(self.user_agent)
self.headers.setdefault("sec-ch-ua", self.browser_hint)

So headers is never empty, and dump() always writes it. The server forbids headers from an untrusted request (UNTRUSTED_FORBIDDEN_FIELDS["BrowserConfig"]) and rejects it whatever its value. The client sends browser_config.dump(), so it fails with any BrowserConfig, even BrowserConfig(). Without a BrowserConfig the request works.

The server rule is right. The problem is that dump() sends a header the user never set, and the server's __init__ derives the same value again from user_agent anyway.

#2262 hit the same 400 in the playground and worked around it there by forwarding only the typed params. The client was not fixed.

Is this reproducible?

Yes

Inputs Causing the Bug

Any BrowserConfig passed to Crawl4aiDockerClient, or any BrowserConfig(...).dump() posted to /crawl, /crawl/stream or /crawl/job.

Steps to Reproduce

Run the snippet below; it reproduces the server's check in-process. Against a running server, Crawl4aiDockerClient().crawl(["https://example.com"], browser_config=BrowserConfig()) returns the same 400.

Code snippets
from crawl4ai import BrowserConfig
from crawl4ai.async_configs import Provenance

data = BrowserConfig(headless=True).dump()
print(data["params"]["headers"])
# {'type': 'dict', 'value': {'sec-ch-ua': '"Chromium";v="116", "Not_A Brand";v="8", "Google Chrome";v="116"'}}

BrowserConfig.load(data, provenance=Provenance.UNTRUSTED)
# UntrustedConfigError: field 'headers' is not permitted on BrowserConfig from an untrusted request
OS

macOS 26.6 (platform-independent)

Python version

3.13

Browser

Not involved

Error logs & Screenshots (if applicable)

See above. I'll open a PR.

Lingua principale
Python
Stelle
86.8k
Fork
9k
Merge medio
2g 12h
PR unite (30g)
21

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di unclecode/crawl4ai

Tutte le issue di unclecode/crawl4ai

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.