при извлечении данных из URL с использованием curl я иногда (в 80% случаев) получаю
ошибка 18: передача закрыта с остальными оставленными данными чтения
Часть возвращаемых данных отсутствует. Странно, что это никогда не происходит, когда для параметра CURLOPT_RETURNTRANSFER установлено значение false, то есть функция curl_exec не возвращает данные, а отображает содержимое напрямую.
В чем может быть проблема? Могу ли я установить некоторые параметры, чтобы избежать такого поведения?
Большое спасибо за ваши предложения!
Я уверен, что это связано с неправильным заголовком Content-Length, отправленным одноранговым узлом. Мой совет заключается в том, чтобы позволить завиткам установить длину сама по себе.
Строка ошибки – это просто то, что видит libcurl: поскольку он получает поток закодированного кодирования, он знает, когда есть данные, оставшиеся в куске для приема. Когда соединение закрыто, libcurl знает, что последний полученный фрагмент был неполным. Затем вы получите этот код ошибки.
Нет ничего, что можно было бы сделать, чтобы избежать этой ошибки при неизмененном запросе, но вы можете попытаться обойти ее, выпустив вместо этого запрос HTTP 1.0 (поскольку кодирование с коротким тоном не произойдет), но факт в том, что это, скорее всего, недостаток на сервере или в вашей сети / настройке.
У меня была та же проблема, но мне удалось исправить ее, подавив заголовок «Ожидание: 100-продолжить», который обычно отправляет cURL (следующий код PHP, но должен работать аналогично другим API-интерфейсам cURL):
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:'));
Кстати, я отправляю вызовы на HTTP-сервер, который включен в состав JDK 6 REST, который имеет всевозможные проблемы. В этом случае он сначала отправляет 100 ответов, а затем с некоторыми запросами не отправляет последующий ответ 200 правильно.
У меня была проблема с pycurl, и я решил это, используя
c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_0)
как говорит Эрик Карон .
Я решил эту ошибку таким образом.
$ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, 'http://www.someurl/' ); curl_setopt ( $ch, CURLOPT_TIMEOUT, 30); ob_start(); $response = curl_exec ( $ch ); $data = ob_get_clean(); if(curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200 ) success;
Ошибка все еще происходит, но я могу обрабатывать данные ответа в переменной.
Я получил эту ошибку, когда мой серверный процесс получил исключение на полпути во время генерации ответа и просто закрыл соединение, не попрощавшись. завихрение все еще ожидало данных от связи и жаловалось (по праву).