101 votes

Erreur curl 18 - transfert fermé avec des données de lecture en attente

Lors de la récupération de données à partir d'une URL en utilisant curl, il m'arrive parfois (dans 80% des cas) d'obtenir

l'erreur 18 : transfert fermé avec des données de lecture en attente

Une partie des données renvoyées manque alors. La chose étrange est que cela ne se produit jamais lorsque CURLOPT_RETURNTRANSFER est défini sur false, c'est-à-dire que la fonction curl_exec ne renvoie pas les données mais affiche directement le contenu.

Quel pourrait être le problème ? Puis-je définir certaines options pour éviter un tel comportement ?

56voto

Daniel Stenberg Points 9116

La chaîne d'erreur est tout simplement exactement ce que libcurl voit : comme il reçoit un flux encodé en morceaux, il sait quand il reste des données dans un morceau à recevoir. Lorsque la connexion est fermée, libcurl sait que le dernier morceau reçu était incomplet. Ensuite, vous obtenez ce code d'erreur.

Il n'y a rien que vous puissiez faire pour éviter cette erreur avec la demande inchangée, mais vous pouvez essayer de contourner le problème en envoyant une requête HTTP 1.0 à la place (puisque l'encodage en morceaux ne se produira pas alors) mais le fait est que c'est très probablement une faille dans le serveur ou dans votre réseau/configuration d'une manière ou d'une autre.

42voto

Christophe Eblé Points 4606

Je parie que cela est lié à une mauvaise en-tête Content-Length envoyée par le pair. Mon conseil est de laisser curl définir la longueur par lui-même.

18voto

rambii Points 141

En voyant cette erreur lors de l'utilisation de Guzzle aussi. L'en-tête suivant l'a corrigé pour moi:

'headers' => [
    'accept-encoding' => 'gzip, deflate',
],

J'ai émis la requête avec Postman qui m'a donné une réponse complète et aucune erreur. Ensuite, j'ai commencé à ajouter les en-têtes que Postman envoie à la requête Guzzle et c'est celui qui l'a corrigé.

7voto

J'ai eu le même problème, mais j'ai réussi à le résoudre en supprimant l'en-tête 'Expect: 100-continue' que cURL envoie habituellement (le code suivant est en PHP, mais devrait fonctionner de manière similaire avec d'autres APIs cURL) :

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:'));

En passant, j'envoie des appels au serveur HTTP qui est inclus dans le JDK 6 REST, qui présente toutes sortes de problèmes. Dans ce cas, il envoie d'abord une réponse 100, puis avec certaines demandes, n'envoie pas correctement la réponse 200 suivante.

5voto

FeiXia Points 71

Rencontré un problème similaire, mon serveur est derrière nginx. Il n'y a pas d'erreur dans le journal du serveur web (Python flask), mais quelques messages d'erreur dans le journal de nginx.

[crit] 31054#31054: *269464 open() "/var/cache/nginx/proxy_temp/3/45/0000000453" failed (13: Permission denied) while reading upstream

J'ai résolu ce problème en corrigeant les permissions du répertoire :

/var/cache/nginx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X