Stop en PHP cURL-overførsel efter et body-prefiks
Behold et afgrænset præfiks i et write-callback og genkend kun den skrivefejl, som callbacket selv forårsager med vilje.
Et cURL-write-callback kan beholde et begrænset præfiks af bodyen og stoppe overførslen, når grænsen er nået. Brug dit eget flag til at skelne det bevidste stop fra en anden skrivefejl.
For et nyt handle, hvis mål-URL allerede er konfigureret:
$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);
}
Proxy-URL'ens socks5h-skema beder proxyen om at slå værtsnavnet op. Til en tilladt test mod et offentligt mål på det viste nye handle kan en post uden konto fra SOCKS5-proxylisten levere det endpoint. TLS-certifikatverifikation beholder sine normale indstillinger.
At returnere nul for et ikke-tomt chunk fortæller libcurl, at callbacket ikke accepterede de leverede data. Det afbryder med CURLE_WRITE_ERROR. Kun kombinationen af den fejl og callbackets limitReached-flag betragtes her som forventet.
Et svar, der er kortere end grænsen, afsluttes normalt. Ved eller over grænsen holder prefix højst 32 KiB, selv hvis det sidste callback modtager et større chunk. Chunkstørrelser varierer; en ønsket bufferstørrelse er ikke et løfte om kald med fast længde.
Dette begrænser den bevarede body, ikke hver byte der allerede er bufret eller overført på forbindelsen. Præfikset kan ende midt i et multibyte-tegn, en JSON-værdi eller et HTML-element, så antag ikke, at det er et komplet dokument, der kan parses.