2011-09-18 12 views
26

me he dado cuenta de que los resultados de XMLHttpRequest.getResponseHeader() y no siempre coinciden con los encabezados reales devueltos (si la solicitud se realiza de manera regular).Restricciones del getResponseHeader() de XMLHttpRequest

Por ejemplo, supongo que estoy haciendo una solicitud xhr para https://foo.example.com/api/resource/100. En la consola para desarrolladores de Chrome, en "Red", puedo ver que se está respondiendo; también puedo ver todos los encabezados de respuesta (digamos, 10). Sin embargo (consola copiada):

> response 
    XMLHttpRequest 
> response.getAllResponseHeaders(); 
    "content-type: text/html 
    " 

¿Existen restricciones sobre qué encabezados están disponibles? ¿Esto depende del tipo de respuesta? Recuerdo haber obtenido un conjunto completo de encabezados para 404, pero solo este para 400.

¿Qué ofrece?

+0

Si hago una petición a 'http: // stackoverflow.com/'en esta página, puedo recuperar todos los encabezados. No estoy seguro de cómo reproducirme. – pimvdb

+0

Soy consciente de la vaguedad, tratando de reducir a un caso adecuado. La solicitud original realizada es una solicitud de origen cruzado, con Access-Control-Allow-Origin. Disculpe la apresurada sensación de la pregunta, se ampliará pronto: no tuve tiempo de investigar esto más en este momento. Esperaba que esto fuera una clase de restricción conocida que desconozco. – maligree

Respuesta

34

El estado actual de la estandarización de la XMLHttpRequest API no solamente restringir el acceso a los campos de cabeceraSet-Cookie y Set-cookie2:

cliente .getAllResponseHeaders()

Devuelve todos los encabezados de la respuesta, con la excepción de aquellos cuyo nombre de campo es Set-Cookie o Set-Cookie2.

Se debe devolver cualquier otro campo de encabezado.

Pero como se está haciendo una petición de origen cruzado, el navegador necesita implementar XMLHttpRequest Level 2 como el XMLHttpRequest original no sólo permiten solicitudes del mismo origen:

La especificación XMLHttpRequest Nivel 2 mejora XMLHttpRequest con el objeto nuevas características, como las solicitudes de origen cruzado [...]

Allí se puede leer que el “Cross-Origin Resource Sharing specification filtra los encabezados que filtra las cabeceras que están expuestos por getResponseHeader() para same-origin solicitudes no.”. Y que la especificación prohíbe el acceso a cualquier campo de cabecera de respuesta sí, excepto el simple response header fields (es decir Cache-Control, Content-Language, Content-Type, Expira, Last-Modified y Pragma):

los agentes de usuario deben filtrar todas las cabeceras de respuesta distintos de los que son una cabecera de respuesta sencilla [...]

Ej el método getResponseHeader() de XMLHttpRequest no expondrá ningún encabezado no indicado anteriormente.

+1

Derecha, gracias. Sin embargo, todavía quedan algunos misterios. He establecido un adecuado 'Access-Control-Expose-Headers:' - solo para descubrir que funciona solo en Gecko, no en WebKit. WebKit felizmente "Se rehusó a obtener un encabezado inseguro (...)", Gecko no ve ningún problema. Segundo problema: 'getAllResponseHeaders()' miente. No puedo 'getResponseHeader()' encabezados que el primero no aparece como disponible. – maligree

+0

@maligree: [WebKit aún no es compatible con * Access-Control-Expose-Headers *] (https://bugs.webkit.org/show_bug.cgi?id=41210) Pero, ¿qué pasa con el otro problema? ¿Qué navegador hace eso? – Gumbo

+0

Sí, me he topado con ese problema bugzilla, pero al ver la fecha en que se abrió, lo tomé con un grano de sal. * Y * en cuanto al segundo problema, estoy viendo esto en Firefox 6. 'getAllResponseHeaders()' devuelve '" "', mientras que un 'getResponseHeader ('content-length')' o 'getResponseHeader ('www-authenticate') '(que es uno de los encabezados que estoy configurando y' Access-Control-Expose-Header''ing) devuelve el valor de encabezado correcto. Prefiero no exponer el URI utilizado en este momento, pero si ayuda, puedo diseñar un caso de prueba aislado más tarde. – maligree

3

Es la cabecera Access-Control-Allow-Origin y la forma en que permite evitar las cabeceras están expuestas al navegador. Docs at mozilla.