Erreur 0x2ef3 sous Internet Explorer lors d’un POST via XMLHttpRequest

bugie

Cette après-midi, j’ai pu découvrir un nouveau bug étrange dans Internet Explorer (oui, encore lui). J’ai pu remarquer qu’une requête POST via XMLHttpRequest échouait systématiquement (serveur Apache 2.2 et 2.4) avec le message suivant quand le serveur utilisait un certificat SSL:

XMLHttpRequest: Erreur réseau 0x2ef3, Impossible d’effectuer l’opération à cause de l’erreur suivante 00002ef3.

Nb: Les changements suivants ont été effectués sur un Apache 2.2 et 2.4 tournant sur respectivement Debian 7 et 8.

Après quelques recherches, je me suis rendu compte qu’Internet Explorer ne tolère qu’un KeepAlive de 60 secondes. Un keepalive inférieur entraîne un échec des requêtes après le délai de timeout (5 secondes par défaut sur Apache).

La solution pour fixer ce bug est donc de soit désactiver le KeepAlive ou alors de l’augmenter au-dessus de 60 secondes (à gérer au cas par cas).

Le KeepAlive, c’est quoi ?

Quand vous surfez sur un site web, vous allez chercher plusieurs fichiers sur le même serveur (le site, les images, le css,…).

Afin d’éviter d’ouvrir et de fermer une nouvelle connexion pour chaque requête, votre navigateur peut garder une connexion réseau temporairement ouverte (dite persistante) et l’utiliser pour faire passer l’entièreté de ses requêtes dedans, d’une traite, sans interruption donc. Il va de soit que ne pas devoir ouvrir et fermer une nouvelle connexion améliore les performances de chargement de la page, uniquement si celle-ci dispose de nombreux fichiers différents à charger. Cela permet de ne pas renégocier la partie TCP de la connexion client/serveur.

Comment le désactiver sous apache ?

C’est très simple, éditez le fichier apache2.conf et remplacez la ligne

KeepAlive On

par

KeepAlive Off

Nb: ce paramètre se trouve à la ligne 92 dans mon cas.

Comment incrémenter la valeur ?

De nouveau dans apache2.conf, éditez la ligne suivante:

KeepAliveTimeout 5

et changez le 5 par le nombre de secondes voulu (au delà de 60 pour régler le soucis sous IE)

KeepAliveTimeout 70

Conseils: Internet Explorer intègre aussi un débogueur/inspecteur

Pour cela, appuyez sur F12 et l’inspecteur s’ouvrira.

Il permet par exemple de simuler les plus vieilles versions d’IE, en spécifiant le moteur de rendu, c’est toujours utile pour un développeur web 🙂
D’ailleurs on peut se rendre compte que dans la liste des moteurs de rendus disponibles se trouve une valeur nommée Edge. Un nom équivoque: s’agit-il du successeur d’Internet Explorer qui arrivera avec la sortie de Windows 10? Dans ce cas, le nom de ce successeur était alors connu depuis longtemps, ou s’agit t-il du nom attribué au dernier moteur de rendu disponible avec ses patches? La question est lancée, si un employé de Microsoft lit ce blog (espérons 😉 ).

2 commentaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *