Všetky balíky
Safe Fetch for Laravel
Presmerovania
Predvolene vypnuté: presmerovanie sa vráti volajúcemu bez sledovania. Zapnete ich pre jedno volanie alebo v konfigurácii (redirects.enabled):
use RoundlyConsulting\SafeFetch\DataTransferObjects\RedirectPolicy;
Http::safe(SafeFetch::policy()->followRedirects())->post($url, $payload); // 307/308, ≤ 3 hops
Http::safe(SafeFetch::policy()->redirects(RedirectPolicy::methodPreserving(5)))->post($url, $payload);
Http::safe(SafeFetch::policy()->redirects(RedirectPolicy::methodPreserving(3, forwardHeaders: ['webhook-signature'])))
->post($url, $payload);RedirectPolicy
Nemenné — každá with-metóda vráti kópiu so zmeneným jedným nastavením a ostatné ponechá:
| Pole | Predvolené | Význam |
|---|---|---|
enabled | false | Či sa presmerovania vôbec sledujú. |
max | 3 | Najviac sledovaných krokov, 0–10 → too_many_redirects. |
statuses | null | null: 307 a 308; inak neprázdna podmnožina 301, 302, 303, 307, 308. |
allowDowngrade | false | https → http (pravidlá musia povoliť aj http) → inak redirect_downgrade. |
forwardHeaders | [] | Názvy hlavičiek, prevedené na malé písmená a overené, ktoré idú aj na iný origin. |
statusesGiven | — | Či boli stavy zadané alebo predvolené — fetch() a download() rozšíria predvolenú množinu na všetkých päť. |
| Metóda | Čo robí |
|---|---|
RedirectPolicy::none() | Presmerovania sa vrátia volajúcemu, nikdy sa nesledujú. |
RedirectPolicy::methodPreserving(int $max = 3, array $forwardHeaders = []) | Sleduje 307 a 308 (metóda a telo sa zachovajú), najviac $max krokov, a pomenované hlavičky pošle aj na iný origin. |
enabled(bool $enabled = true, ?int $max = null) | Tie isté pravidlá, sledované alebo nie. |
withStatuses(array $statuses) | Sledovať presne tieto stavy. |
forwardHeaders(array $headers) | Nahradí zoznam preposielaných hlavičiek. Prihlasovacie údaje nejdú nikdy: uveďte len hlavičky, ktoré je bezpečné zopakovať. |
allowingDowngrade(bool $allow = true) | Sledovať https → http alebo nie. |
max(int $max) | Najviac $max krokov, 0–10. |
follows(int $status) | Či sa odpoveď so stavom $status a hlavičkou Location sleduje. |
$redirects = RedirectPolicy::methodPreserving(3)
->withStatuses([301, 302, 303, 307, 308]) // follow all five
->forwardHeaders(['webhook-signature']) // replaces the list
->max(5); // 0–10
RedirectPolicy::none(); // returned unfollowed — the default
$redirects->follows(302); // trueKeď sú presmerovania zapnuté
- Ktoré stavy: predvolene 307 a 308 (metóda a telo sa zachovajú). Pravidlá môžu určiť ľubovoľnú podmnožinu 301, 302, 303, 307 a 308; fetch() a download() (len GET) sledujú všetkých päť, ak pravidlá žiadne neurčia.
- 301 a 302 po POST a 303 po čomkoľvek okrem HEAD prepnú na GET a zahodia telo aj jeho hlavičky Content-*. Každé iné sledované presmerovanie zachová metódu; ak telo posiela znovu, najprv ho pretočí na začiatok, a telo, ktoré sa pretočiť nedá, nechá presmerovanie vrátené bez sledovania.
- Každý krok sa overí a pripne znovu, presne ako prvý; odmietnutie reťaz zastaví.
- Najviac max krokov (0–10, predvolene 3) → too_many_redirects.
- https → http len pri zapnutom allowDowngrade (a ak pravidlá povoľujú http); inak redirect_downgrade.
- Jeden časový rozpočet pokrýva všetky kroky.
- Location sa rieši podľa RFC 3986 §5.2 voči prestavanej URL (SafeFetch::urls()->resolveRedirect()); relatívna hodnota so spätnou lomkou alebo riadiacim znakom sa odmietne (invalid_url).
- Sledované presmerovanie sa posudzuje len podľa stavu a Location — prenos skončí pred jeho telom.
- Hlavičky len na prvý origin. Krok na iný origin (schéma, hostiteľ alebo port) nesie len Accept, Accept-Encoding, Accept-Language, Content-Type, Content-Length, Content-Encoding, User-Agent a forwardHeaders z pravidiel. Voľba auth, HTTPAUTH / USERPWD z curl (digest, NTLM) a digest stav Guzzle sa zahodia tiež (CVE-2022-31090) a zostanú zahodené, aj keď sa neskorší krok vráti na prvý origin.
- Cookies pri každom kroku: každý krok pošle cookies z úložiska pre vlastnú URL a každá odpoveď uloží svoje Set-Cookie k požiadavke, ktorá ju dostala — stránka, na ktorú bola požiadavka presmerovaná, nemôže nastaviť cookies pre tú prvú. withOptions(['cookies' => false]) cookies vypne.
- Záznamník Laravelu zaznamená každý krok, takže Http::assertSentCount() počíta kroky.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.