Récupérer des headers dans un callback ajax

Je vais craquer, je suis sûr que c’est un problème de merde mais je ne trouve pas…

Contexte: Je fait des requêtes ajax et mon serveur me retourne des infos dans des headers que j’aimerais récupérer dans mon callback de ma requête. cf le code ci-dessous

	var executeRequest = function(url, data, httpMethod, dataType, headers, expectedStatusCode, contentType, accepts , successCallback, errorCallback) {
		$.ajax({
			url : url,
			headers : headers,
			type : httpMethod,
			dataType : dataType,
			contentType : contentType,
			accepts: {
				text: accepts,
				xml : accepts,
				json : accepts,
				script : accepts
			},
			data : data,
			error: function(xhr) {
				...
			},
			success: function(data, status, jqXHR) {
                console.log('COOKIE: ' + jqXHR.getResponseHeader('X-SALEPUTE'));
				...

			}
		});

	}

La soucis : mon objet jqXHR ne contient strictement aucun headers. Que je passe par getAllResponseHeaders (qui me retourne un string vide -apparemment bug FF-)  ou individuellement (comme dans le code, ce qui me retourne un null) je n’ai rien à me mettre sous la dent. Si je regarde avec Firebug je vois pourtant bien mes headers :

Si je tente la meme requête avec curl, pareil, j’ai bien les headers présents.

Bref, impossible de les récupérer despuis mon callback ajax. Any idea ?

EDIT: testé sous FF/Chrome, same shit

la vraie question c’est : pourquoi ton serveur envoies des infos importantes dans le header.

Le header n’est PAS fait pour ça. du coup, c’est logique que tu recup rien coté client.

Par ailleurs tu utilises $.ajax qui est une fonction jquery. Regarde la maniere de faire de l’ajax avec le prototype de base si t’as pas les infos, mais ca m’etonnerait bien vu que c’est PAS fait pour ça.

function getXMLHttpRequest() 
{
    if (window.XMLHttpRequest) {
        return new window.XMLHttpRequest;
    }
    else {
        try {
            return new ActiveXObject("MSXML2.XMLHTTP.3.0");
        }
        catch(ex) {
            return null;
        }
    }
}

function handler()
{
    if (oReq.readyState == 4 /* complete */) {
        if (oReq.status == 200) {
            alert(oReq.responseText);
        }
    }
}

var oReq = getXMLHttpRequest();

if (oReq != null) {
    oReq.open("GET", "http://localhost/test.xml", true);
    oReq.onreadystatechange = handler;
    oReq.send();
}
else {
    window.alert("AJAX (XMLHTTP) not supported.");
}

regarde avec cette méthode ce que te renvoies oReq mais j’y crois pas…

Sincérement, utilise pas les headers…

Edit : après, recherche, tu peux les recups. J’ai un $request->getHeaders() dans Symfony 2. Si tu veux je plonge dans le code et je regarde ce qu’il fait mais ca m’etonnerait pas qu’il limite les header aux headers valide d’un point de vue W3C.

regarde dans ta variable $_SERVER

Bon alors vu que tout le monde me demande “mais pourquoi tu veux faire ça comme ça”… je vais expliquer:

A la base je veux juste setter un token avec le set-cookie. Vu que mon cookie n’était pas créé j’ai décidé d’essayer d’autre headers. Et c’est là que je me suis rendu compte que je n’arrivait à acceder à aucun header depuis le CB.

[quote=“Donjohn, post:2, topic: 54855”][/quote]

euh… je veux les headers de la response hein.

mmh, peut etre qu’il faut que t’explique plus, mais de ce que j’en ai compris, tu veux que ton appel Ajax cree un cookie chez le client ?

mmh si je me trompe pas, suffit de mettre un setCookie dans le controleur appellé par l’ajax et la header de réponse aura le set-cookie et fera son job.


Dans le set-cookie de ton header, je vois pas le domain, ça serait pas tout simplement ton problème ?

Alors tout a fait, c’est que je tente de faire mais le cookie cote client n’est au final jamais setté. C’est pour ça que j’ai décidé de tester d’autres headers. “pour voir”.

Le domain n’est pas affiché mais il est correct : localhost et pas de cross domain.

[quote=“Ivru, post:5, topic: 54855”][/quote]

“You can only set domain cookies for registry controlled domains, i.e. something ending in .com or so, but not IPs or intranet hostnames like localhost”

source

Crée toi un vrai DNS pour ton localhost . En general je créé monprojet.local pour bosser et avoir un vrai domaine.

Ok… Les mecs qui ont décidé de simplifier la vie de devs. Merci.

Bon, ça n’explique toujours pas pourquoi je ne peux pas acceder à mes headers depuis le callback. Parce que j’aimerais quand meme bien profiter du set-cookie moi

un localhost avec des alias pour bosser c’est pas l’idéal, tu peux pas test correctement le RewriteEngine des .htaccess ainsi que les redirections de sous-domaines par ex… bref, évite et crée toi un DomainHost pour chaque projet.

(la blague c’est que hosts de Windows ne prend pas les wildcard, résultat si t’as 200 sous domaines, faut les déclarer 1 par 1 au lieu de faire *.tondomaine.local)

Edit : pour acceder aux header dans le CB (donc en javascript), essaie sans JQuery de faire ton ajax et regarde ce que file l’objet oReq. On recup bien le status qui est dans les headers, doit avoir les headers là dedans…

Bon, alors on oublie tout ce qui vient de se passer depuis hier.
Je savais que c’était un truc de merde mais à ce point : j’étais bien en cross domain… Avec un RP j’accède à mes headers sous problème, mon cookie se créé tout seul, …

Merci donjohn.

Hinhinhin I TOLD YA !

Hahahaha ouais, ça explique mieux tes soucis :smiley:
Comment t’as pas vu que t’etais en X-domain ? Fait longtemps que j’ai pas eu le cas mais FireBug est pas censé mettre un warning à ce moment ?

(ou c’est ptet Chrome qui met une alerte…)

localhost VS localhost:3000 (oui je fais du node…)

(reverse proxy qui m’a mis dedans)

La prochaine fois arrete d’utiliser le localhost comme un DomainHost et tu te créé un DomainHost par projet. T’aurais penser au Xdomain avant même ton premier test.

le localhost n’est PAS un domain.

Bon, maintenant que j’ai pu identifier le problème, c’est au tour de Firefox de merde de faire chier en ne comprenant pas Access-Control-Expose-Headers