Comment puis-je arrêter cURL à partir de l'utilisation de 100 Continuer?
Donc, longue histoire courte, j'ai une application AJAX qui utilise les API Web MVC en tant que back-end. Le client a cependant des appels à partir d'un domaine différent et utilise PHP fichier de proxy pour contourner la croix-demande de domaine questions.
Cependant, en utilisant le PHP proxy, Web API répond à certaines demandes avec un 100 Continue
en-tête HTTP et toutes les demandes qui obtenir ce retour prendre trop de temps pour le terminer (nous parlons à 2 minutes environ) et peut également renvoyer à une non-réponse valide.
Ce semble être un problème connu avec cURL et la solution de contournement est souvent cité comme l'insertion de la ligne ci-dessous pour supprimer le fait de s'attendre: 100-tête dans la demande cURL
Malheureusement, la solution semble être hors de portée pour moi:
$headers = getallheaders();
$headers_new = "";
foreach($headers as $title => $body) {
$headers_new[] = $title.": ".$body;
}
//$headers_new[] = 'Expect:';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_new);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:') );
Ce code fonctionne mais supprime tous les autres en-têtes (ce qui n'est pas viable pour moi comme je suis à l'aide de HTTP basic auth les en-têtes d'authentification avec l'API).
Vous pouvez également remarquer j'ai essayé d'ajouter le Expect:
à l'existant, en-têtes, mais cela ne m'aide pas non plus.
Comment puis-je maintenir les en-têtes, mais aussi de prévenir cURL de s'attendre à une 100 de continuer?
getallheaders()
ne fait pas ce que vous semblez penser qu'il fait. Il récupère les en-têtes de demande qui ont été envoyés, et non les en-têtes de requête que curl utilisation. Vous devriez seulement besoin de lacurl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:') );
ligne - supprimer tout le reste du code ci-dessus et cela devrait fonctionner.- DaveRandom - en fait, c'est exactement l'intention - si je prends les en-têtes de requête et de les transmettre sur les API (ils comprennent les HTTP Auth genre de trucs). Le problème est que cURL ajouter le
Expect: 100
de ces en-têtes. - Se référant à ceci pourriez-vous essayer d'ajouter
curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
? Espérons que cette aide. - Problème est, ce n'est pas classée comme une erreur - il n'est en fait pas défaut!
- Même les auteurs de curl pense que ce comportement (de libcurl) n'est pas bon.
- Voir aussi stackoverflow.com/questions/49670008/...
Vous devez vous connecter pour publier un commentaire.
À l'aide de
$headers_new[] = 'Expect:';
fonctionne sauf la$headers_new
tableau contient une chaîne de caractères qui est'Expect: 100-continue'
. Dans ce cas, vous devez le retirer de la pile sinon il va être attend les 100 continuer (logiquement).Parce que dans votre code que vous utilisez
getallheaders()
et vous n'êtes pas vérifier si elle contient uneExpect: 100-continue
en-tête déjà si c'est probablement ce qui est le cas dans votre cas.Ici est un résumé de la situation générale (et le script qui l'a créé):
Code:
Merci pour le script, Hakre. Depuis que j'ai besoin de cette pour HTTP PUT, j'ai prolongé un peu avec les résultats suivants:
Voici le script: