ошибка cURL 8: недопустимая длина содержимого: значение - PullRequest
0 голосов
/ 17 февраля 2019

Когда я пытаюсь отправить запрос с библиотекой Guzzle, я получаю эту ошибку.

GuzzleHttp \ Exception \ RequestException
Ошибка cURL 8: недопустимая длина содержимого: значение (см. http://curl.haxx.se/libcurl/c/libcurl-errors.html)

Я видел вышеуказанную ссылку, но она не содержит никакой полезной информации.

Я использую wamp64 и окна для разработки.

иНиже приведен мой код:

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 ]

0 голосов
/ 18 февраля 2019

У меня была такая же проблема с 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]
);
0 голосов
/ 18 февраля 2019

Я подозреваю, что ваше соединение находится за перехваченным прокси-сервером в стиле 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, в зависимости от конфигурации сервера, что может быть ОЧЕНЬ медленнее, многие серверы оставляют соединения открытыми для схемы повторного использования сокетов. Возможно, вы захотите добавить заголовок http Connection: close, в то время какВы должны игнорировать заголовки длины содержимого.)

...