Une fonction de rappel d'écriture cURL peut conserver un préfixe limité du corps et arrêter le transfert dès que cette limite est atteinte. Utilisez votre propre indicateur pour distinguer cet arrêt volontaire d'une autre erreur d'écriture.

Pour un handle neuf dont l'URL cible est déjà configurée :

$limit = 32768;
$prefix = '';
$limitReached = false;

curl_setopt_array($ch, [
    CURLOPT_PROXY => 'socks5h://proxy.example.net:1080',
    CURLOPT_HEADER => false,
    CURLOPT_WRITEFUNCTION => function ($handle, $chunk)
        use (&$prefix, &$limitReached, $limit) {
        $remaining = $limit - strlen($prefix);
        $prefix .= substr($chunk, 0, $remaining);

        if (strlen($prefix) >= $limit) {
            $limitReached = true;
            return 0;
        }

        return strlen($chunk);
    },
]);

$result = curl_exec($ch);
$error = curl_errno($ch);

$expectedStop = $limitReached && $error === CURLE_WRITE_ERROR;
if ($result === false && !$expectedStop) {
    throw new RuntimeException(curl_error($ch), $error);
}

Le schéma socks5h de l'URL du proxy demande au proxy de résoudre le nom d'hôte cible. Pour un test autorisé vers une cible publique sur le handle neuf montré, une entrée sans compte de la liste de proxies SOCKS5 peut fournir ce point de terminaison. La vérification du certificat TLS conserve ses réglages habituels.

Renvoyer zéro pour un fragment non vide indique à libcurl que la fonction n'a pas accepté les données fournies. Elle interrompt le transfert avec CURLE_WRITE_ERROR. Ici, seule la combinaison de cette erreur et de l'indicateur limitReached de la fonction est considérée comme attendue.

Une réponse plus courte que la limite se termine normalement. À la limite ou au-delà, prefix ne retient que 32 KiB au plus, même si la fonction finale reçoit un fragment plus gros. Les tailles de fragment varient ; une taille de tampon demandée ne garantit pas des appels de longueur fixe.

Cela limite le corps conservé, pas chaque octet déjà mis en tampon ou transféré sur la connexion. Le préfixe peut se terminer au milieu d'un caractère multioctet, d'une valeur JSON ou d'un élément HTML, ne supposez donc pas qu'il s'agit d'un document complet analysable.

Articles similaires