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:
| Hodnota | Vyhodené ako | retryable() | Význam |
|---|---|---|---|
invalid_url | DestinationRejected | — | Nie je to URL adresa, ktorú ochrana dokáže prečítať jediným spôsobom (riadiaci znak, chýbajúca autorita, spätná lomka). |
scheme | DestinationRejected | — | Nie je to http(s), alebo schéma, ktorú pravidlá nepovoľujú (predvolene len https). |
credentials | DestinationRejected | — | Používateľské údaje (user:pw@) v autorite. |
non_canonical_host | DestinationRejected | — | Hostiteľ zapísaný v tvare, ktorý parsery čítajú rôzne (číselné IPv4, %, zone id, medzery). |
port | DestinationRejected | — | Mimo 1–65535, alebo port, ktorý pravidlá nepovoľujú. |
blocked | DestinationRejected | — | Privátny, loopback, metadátový alebo blokovaný cieľ — blockedBy() pomenuje pravidlo. |
unresolved | DestinationUnavailable | áno | Meno hostiteľa sa nepreloží. DNS sa môže zotaviť. |
not_allowed | DestinationRejected | — | Striktný zoznam povolených hostiteľov hostiteľa neobsahuje. |
cannot_pin | DestinationRejected | — | Spojenie sa nepodarilo pripnúť na overené adresy (chýba curl, alebo smerovalo inam). |
too_many_redirects | DestinationRejected | — | Viac presmerovaní, než pravidlá dovoľujú. |
redirect_downgrade | DestinationRejected | — | Presmerovanie z https na http. |
timeout | DestinationUnavailable · FetchFailed | áno | Časový rozpočet vypršal — medzi krokmi, alebo curl 28 vo fetch() / download(). |
status | FetchFailed | 408, 429, 5xx | fetch() alebo download() dostal odpoveď mimo 2xx; na výnimke status() a retryAfter(). |
too_large | FetchFailed | — | Telo väčšie než limit bajtov. |
connection | FetchFailed | áno | Spojenie zlyhalo alebo sa prerušilo. |
tls | FetchFailed | — | TLS certifikát servera sa nepodarilo overiť. |
protocol | FetchFailed | — | 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:
| Pravidlo | Význam |
|---|---|
hostname | localhost alebo *.localhost, ktorý nie je uvedený ako privátny hostiteľ. |
blocked_host | Hostiteľ v hosts.blocked / blockHosts() — odmietnutý pred prekladom. |
app_host | Jeden z hostiteľov aplikácie, alebo adresa, ktorá je jednou z jej adries, kým je blokovanie zapnuté. |
blocked_range | Adresa v ranges.blocked / blockRanges(). |
private_address | Adresa 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 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.