---
title: "Verdikty a výnimky — Safe Fetch for Laravel | Roundly"
description: "Enum Reason, hierarchia výnimiek, retryable() a blockedBy(), neutrálne správy, ktoré nikdy neuvádzajú URL adresu, a pomenované konštruktory."
url: https://roundly-consulting.com/sk/open-source/navody/safe-fetch-for-laravel/verdikty-a-vynimky
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Safe Fetch for Laravel](https://roundly-consulting.com/sk/open-source/navody/safe-fetch-for-laravel.md)

# 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(), …):

```php
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:

```php
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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/safe-fetch-for-laravel.md)
