Ein cURL-Write-Callback kann ein begrenztes Body-Präfix behalten und den Transfer beenden, sobald dieses Limit erreicht ist. Mit einem eigenen Flag unterscheiden Sie diesen absichtlichen Abbruch von einem anderen Schreibfehler.

Für ein frisches Handle, dessen Ziel-URL bereits gesetzt ist:

$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);
}

Das socks5h-Schema der Proxy-URL veranlasst den Proxy, den Ziel-Hostnamen aufzulösen. Für einen erlaubten Test gegen ein öffentliches Ziel auf dem gezeigten neuen Handle kann ein Eintrag ohne Konto aus der SOCKS5-Proxy-Liste diesen Endpunkt bereitstellen. Die TLS-Zertifikatsprüfung behält ihre normalen Einstellungen.

Null für einen nicht leeren Chunk zurückzugeben teilt libcurl mit, dass das Callback die gelieferten Daten nicht angenommen hat. Es bricht mit CURLE_WRITE_ERROR ab. Nur die Kombination aus diesem Fehler und dem limitReached-Flag des Callbacks gilt hier als erwartet.

Eine Antwort, die kürzer als das Limit ist, endet normal. Am oder über dem Limit hält prefix höchstens 32 KiB, selbst wenn das letzte Callback einen größeren Chunk erhält. Chunk-Größen variieren; eine angeforderte Puffergröße ist kein Versprechen fest langer Aufrufe.

Das begrenzt den behaltenen Body, nicht jedes bereits gepufferte oder über die Verbindung übertragene Byte. Das Präfix kann mitten in einem Multibyte-Zeichen, einem JSON-Wert oder einem HTML-Element enden, gehen Sie also nicht davon aus, dass es ein vollständig parsebares Dokument ist.

Ähnliche Artikel