NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Safe Fetch for Laravel

Verdikty a výnimky

Dôvody

Enums\Reason je enum s reťazcovými hodnotami. Reason::retryable() vracia stĺpec nižšie; pre status vracia false a rozhoduje výnimka:

HodnotaVyhodené akoretryable()Význam
invalid_urlDestinationRejected—Nie je to URL adresa, ktorú ochrana dokáže prečítať jediným spôsobom (riadiaci znak, chýbajúca autorita, spätná lomka).
schemeDestinationRejected—Nie je to http(s), alebo schéma, ktorú pravidlá nepovoľujú (predvolene len https).
credentialsDestinationRejected—Používateľské údaje (user:pw@) v autorite.
non_canonical_hostDestinationRejected—Hostiteľ zapísaný v tvare, ktorý parsery čítajú rôzne (číselné IPv4, %, zone id, medzery).
portDestinationRejected—Mimo 1–65535, alebo port, ktorý pravidlá nepovoľujú.
blockedDestinationRejected—Privátny, loopback, metadátový alebo blokovaný cieľ — blockedBy() pomenuje pravidlo.
unresolvedDestinationUnavailableánoMeno hostiteľa sa nepreloží. DNS sa môže zotaviť.
not_allowedDestinationRejected—Striktný zoznam povolených hostiteľov hostiteľa neobsahuje.
cannot_pinDestinationRejected—Spojenie sa nepodarilo pripnúť na overené adresy (chýba curl, alebo smerovalo inam).
too_many_redirectsDestinationRejected—Viac presmerovaní, než pravidlá dovoľujú.
redirect_downgradeDestinationRejected—Presmerovanie z https na http.
timeoutDestinationUnavailable · FetchFailedánoČasový rozpočet vypršal — medzi krokmi, alebo curl 28 vo fetch() / download().
statusFetchFailed408, 429, 5xxfetch() alebo download() dostal odpoveď mimo 2xx; na výnimke status() a retryAfter().
too_largeFetchFailed—Telo väčšie než limit bajtov.
connectionFetchFailedánoSpojenie zlyhalo alebo sa prerušilo.
tlsFetchFailed—TLS certifikát servera sa nepodarilo overiť.
protocolFetchFailed—Odpoveď nebola čitateľné HTTP (stav mimo 100–599, poškodená hlavička).

Enum má spoločné pomocné metódy z enums-for-laravel (values(), names(), options(), label(), is(), isIn(), fromName(), validationRule(), …):

use RoundlyConsulting\SafeFetch\Enums\Reason;

Reason::values()->all();               // ['invalid_url', 'scheme', 'credentials', …]
Reason::Unresolved->retryable();       // true
Reason::from($row->reason)->isIn([Reason::Blocked, Reason::NotAllowed]);

Výnimky

RuntimeException
└── SafeFetchException (abstract)      reason(): Reason · retryable(): bool · url(): string · host(): string
    ├── DestinationRejected            + blockedBy(): ?string
    ├── DestinationUnavailable
    └── FetchFailed                    + status(): ?int · retryAfter(): ?int
LogicException
└── UnsafeRequestOptions               a programmer error; names the option
  • url() vráti URL adresu tak, ako ju volajúci odovzdal; host() kanonického hostiteľa, ktorého sa verdikt týka (prázdny, ak URL žiadneho čitateľného nemala). Ani jedno nie je v správe.
  • FetchFailed::retryAfter() je Retry-After servera v sekundách (sekundy alebo HTTP dátum, najviac 86 400), len pri opakovateľnom stave.
  • UnsafeRequestOptions sa vyhodí pre voľbu, ktorá by požiadavku vyviedla mimo ochranu (pozrite Chránené požiadavky). Jej správa uvádza voľbu, len po anglicky — ide o chybu programátora, podobne ako vlastné výnimky Laravelu.

Správy, ktoré nič neprezradia

Správy sú pevné pre každý dôvod (safe-fetch::messages.<reason>, v angličtine a slovenčine) a nikdy neobsahujú URL ani adresu. blocked a unresolved znejú rovnako — „URL adresu nie je možné načítať: jej cieľ nie je povolený alebo nie je dostupný.“ — takže správu môžete bezpečne zobraziť tomu, kto URL odoslal: rozlíšenie „privátne“ od „neexistuje“ by komukoľvek, kto URL ovláda, zmapovalo vašu internú sieť.

reason(), retryable() a blockedBy() ich rozlišujú — sú pre váš kód a vašich prevádzkovateľov. Tento rozdiel sa nikdy nesmie dostať k tomu, kto URL odoslal: „skúste neskôr“ zobrazené len pri retryable() je ten istý únik informácie. Opakujte na pozadí a zobrazujte jednu správu.

blockedBy()

DestinationRejected::blockedBy() — len pre prevádzkovateľov — pomenuje pravidlo za verdiktom blocked:

PravidloVýznam
hostnamelocalhost alebo *.localhost, ktorý nie je uvedený ako privátny hostiteľ.
blocked_hostHostiteľ v hosts.blocked / blockHosts() — odmietnutý pred prekladom.
app_hostJeden z hostiteľov aplikácie, alebo adresa, ktorá je jednou z jej adries, kým je blokovanie zapnuté.
blocked_rangeAdresa v ranges.blocked / blockRanges().
private_addressAdresa v tabuľke blokovaných sietí, ktorá nie je v povolenom rozsahu ani (ak nejde o cloudové metadáta) adresou privátneho hostiteľa.

Pomenované konštruktory

Cez ne ochrana vytvára svoje výnimky; sú verejné, takže testovací dvojník alebo vlastný obal môže vyhodiť presne to, čo vyhadzuje balík. $url je #[SensitiveParameter] a nikdy nie je v správe:

DestinationRejected::because(Reason::Blocked, $url, 'internal.example', blockedBy: 'private_address');
DestinationUnavailable::unresolved($url, 'gone.example');                 // retryable
DestinationUnavailable::timedOut($url, 'slow.example');                   // retryable
FetchFailed::forStatus($url, 'api.example', 503, retryAfter: 30);         // status() 503, retryAfter() 30
FetchFailed::because(Reason::Connection, $url, 'api.example');            // retryable
UnsafeRequestOptions::option('proxy', 'a proxy resolves the host name itself.');

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 kryptomien

Odoslaní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.