Aller au contenu

Lecture

phil/safe-http

Le client

$client = new SafeHttpClient(
    client: $httpClient,         // the transport; HttpClient::create() by default
    limits: new Limits(),        // what one read may cost
    resolve: [],                 // fixed addresses for host names, as curl's --resolve
);

Le client enveloppe le transport dans le NoPrivateNetworkHttpClient de Symfony ; quel que soit le transport qu'on lui donne, la garde demeure. Il ne garde rien d'une lecture pour la suivante, sauf les adresses que la garde a résolues, que reset() oublie : un worker l'appelle entre deux messages, comme kernel.reset le fait dans Symfony.

Les limites

LimiteValeur par défautBornesCe qu'elle borne
timeout5.00,1 à 60 secondesLe silence de l'hôte, jamais plus que ce qui reste de la durée totale
maxDuration10.00,1 à 120 secondesLa lecture entière, chaque redirection comprise
maxBytes1,048,5761 Kio à 64 MioLe corps conservé, après décompression
maxRedirects30 à 10Les redirections suivies
userAgentPhilSafeHttp/0.1Une ligne, aucun caractère de contrôleLe User-Agent de chaque requête

Des limites hors de leurs bornes lancent InvalidLimits. Donnez au User-Agent le nom du site et un moyen de joindre la personne qui l'exploite, comme le font les robots d'aperçu de lien : un site qui voit un lecteur inconnu le bloque.

La règle d'une lecture

ReadRule dit ce qui est lu du corps :

ChampValeur par défautRôle
accept*/*L'en-tête Accept, sur une ligne
typesaucunLes types de média dont le corps est lu, en minuscules ; tous si vide, les autres ne sont pas lus
stopAfternullUne marque après laquelle le transfert s'arrête, trouvée sans égard à la casse, même coupée entre deux morceaux

ReadRule::htmlHead() lit le HTML et le XHTML jusqu'à </head, pour les étiquettes d'une page.

Lire

AppelLit
get($url, $rule)Le statut, les en-têtes et le corps que la règle lit
head($url)Le statut et les en-têtes, sans corps

$url est un Phil\Url\Url, ou une chaîne que la garde lit. Une redirection — 301, 302, 303, 307 ou 308 avec un Location — est suivie avec la même méthode ; un autre 3xx, ou un 3xx sans Location, est la réponse.

La réponse

SafeResponse :

MembreContient
urlL'adresse qui a répondu, après les redirections
redirectsLes adresses vers lesquelles on a été redirigé, dans l'ordre, la dernière étant url
status, isSuccessful()Le statut ; s'il est 2xx
headers, header($name)Les en-têtes par nom en minuscules ; la première valeur de l'un d'eux
mediaType(), charset()Le type de média de Content-Type en minuscules, et son jeu de caractères tel qu'écrit
bodyLe corps dans la mesure où il a été lu
completeSi le corps a été lu jusqu'à sa fin : faux s'il a été coupé à maxBytes ou après la marque d'arrêt, ou s'il n'a pas été lu

Les exceptions

Toutes implémentent SafeHttpException.

ExceptionQuand
RefusedAddressL'adresse ou une redirection n'est pas une adresse HTTP ou HTTPS d'un nom d'hôte, ou son hôte est un réseau privé ou s'y résout
TooManyRedirectsLes redirections dépassent maxRedirects
FetchFailedL'hôte ne répond pas, reste silencieux plus longtemps que timeout, la lecture dépasse maxDuration, ou la connexion se rompt
InvalidLimitsDes limites, ou un en-tête d'une règle, hors de leurs bornes