Ошибка cURL 8: недопустимая длина содержимого: значение
Когда я пытаюсь отправить запрос с библиотекой Guzzle, я получаю эту ошибку.
GuzzleHttp \ Exception \ RequestException
ошибка cURL 8: недопустимая длина содержимого: значение (см. http://curl.haxx.se/libcurl/c/libcurl-errors.html)
Я видел вышеуказанную ссылку, но она не содержит никакой полезной информации.
Я использую wamp64 и windows для разработки.
и следующий мой код:
use guzzle\http\Client;
$headers = [
'User-agent'=> 'Mozilla/5.0',
'Accept'=>
'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding'=> 'gzip',
];
$client = new Client();
$start_time = time();
$response = $client->request(
'get',
'https://www.google.com',
['headers' => $headers]
);
РЕДАКТИРОВАТЬ:
Это работает правильно для https://yahoo.com
но для http://yahoo.com
это поднимает предыдущую ошибку.
2 ответа
Я подозреваю, что ваше соединение находится за перехватчиком MITM-стиля, который отправляет неправильные заголовки Content-Length, но в любом случае вы можете указать curl игнорировать Content-Length с помощью CURLOPT_IGNORE_CONTENT_LENGTH
вариант - к сожалению, в PHP отсутствует константа для CURLOPT_IGNORE_CONTENT_LENGTH, но его магическое число равно 136, что означает, что вы можете просто сделать
if(!defined("CURLOPT_IGNORE_CONTENT_LENGTH")){
define("CURLOPT_IGNORE_CONTENT_LENGTH",136);
}
$response = $client->request(
'get',
'https://www.google.com',
['headers' => $headers, 'curl'=>[CURLOPT_IGNORE_CONTENT_LENGTH=>true]]
);
(обратите внимание, что это может привести к значительному снижению производительности, поскольку теперь curl должен продолжать чтение из сокета до тех пор, пока сервер не закроет его, а не чтение до получения байтов Content-Length, в зависимости от конфигурации сервера, что может быть A Чуть медленнее, многие серверы поддерживают соединения открытыми для схемы повторного использования сокетов. Возможно, вы захотите добавить заголовок http Connection: close
в то время как вы должны игнорировать заголовки длины содержимого.)
У меня была такая же проблема с cURL и разобрался с
'Content-Length: ' . strlen($data_string))
где
$data_string
содержит все POST
данные
в вашем случае это будет выглядеть так
use guzzle\http\Client;
$headers = [
'User-agent'=> 'Mozilla/5.0',
'Content-Length' => '0',
'Accept'=>
'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding'=> 'gzip',
];
$client = new Client();
$start_time = time();
$response = $client->request(
'get',
'https://www.google.com',
['headers' => $headers]
);