Skip to content

v1.2.33: fix: Hluboce zanořený JSON už neshodí uložení těla requestu

Choose a tag to compare

@thorewi thorewi released this 08 Sep 05:52
· 39 commits to main since this release
MySQL pustí do sloupce typu `json` zanoření do 100 úrovní a hlubší dokument
odmítne chybou 3157 (The JSON document exceeds the maximum depth). PHP proti
tomu parsuje do 512, takže tělo mezi těmito limity projde celou aplikací
a rozbije se až při insertu do `request_log_body`.

Následek byl horší, než vypadá: `request_log` s metadaty se zapsal (jde
o samostatný insert před tělem), ale celý obsah requestu i odpovědi se
ztratil a v logu zůstalo jen „RequestLogger selhal". Kdo o tom ví, umí si
tak zařídit, že obsah jeho požadavku v logu nebude - stačí do platného těla
přidat dostatečně zanořené pole.

Hloubka se proto hlídá spolu s validitou: co se do `json` sloupce nevejde,
uloží se jako text do `raw_data_text`, respektive `response_text`. Horší na
dotazování, ale je to pořád celý obsah.

`params` ani `headers` to neřeší schválně - $_GET je omezený direktivou
max_input_nesting_level (výchozích 64) a hlavičky jsou ploché, takže se přes
100 úrovní nedostanou.

Nahlášeno z produkčního API: SQLSTATE[22032] 3157 na POST /v1/orders.