2010-03-20 10 views
14

Con la ayuda de HttpWatch, traté de descubrir cómo GMail implementa Comet.¿Cómo implementa GMail Comet?

Ingresé a GMail con dos cuentas, una en IE y la otra en Firefox. Chateando en GTalk en GMail con algunas palabras mágicas como "WASSUP". Luego, cierro sesión en ambas cuentas de GMail, filtro cualquier contenido http sin cadena "WASSUP". El resultado muestra qué solicitud HTTP es el canal de transmisión. (Nota: Tengo que cerrar sesión. De lo contrario, HTTP interminable no mostraría contenido en HttpWatch.)

El resultado es interesante. La URL para el canal de flujo es como:

https://mail/channel/bind?VER=8&at=xn3j33vcvk39lkfq .....

No es de extrañar que GMail hacer cometa en IE con IFRAME. El contenido de Http comienza con "<html><body>".

Originalmente, supuse que GMail hace Comet en Firefox con multiparte XmlHttpRequest. Para mi sorpresa, el encabezado de respuesta no tiene el encabezado "multipart/x-mixed-replace". Las cabeceras de respuesta son las siguientes:

HTTP/1.1 200 OK 
Content-Type: text/plain; charset=utf-8 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: Fri, 01 Jan 1990 00:00:00 GMT 
Date: Sat, 20 Mar 2010 01:52:39 GMT 
X-Frame-Options: ALLOWALL 
Transfer-Encoding: chunked 
X-Content-Type-Options: nosniff 
Server: GSE 
X-XSS-Protection: 0 

Por desgracia, la HttpWatch no indica si una petición HTTP es de XmlHttpRequest o no. El contenido no es HTML sino JSON. Parece una respuesta para XHR, pero eso no funcionaría para Comet sin multipart/x-mixed-replace, ¿verdad?

¿Hay alguna manera de averiguar cómo GMail implementa Comet?

Actualización: Después de investigaciones adicionales, creo GMail implementa el cometa esta manera: 1) en el IE, se utiliza un marco flotante para siempre oculto; 2) en Firefox, usa forever-XHR sin encabezado multipart/x-mixed-replace. El cliente responderá en la condición (readyState == 3) O (readyState == 4). Es decir, tanto en estado interactivo como en estado completo.

Respuesta

15

por this article,

Entonces, ¿cuál es la solución utilizada por Google Gmail?

La solución es realmente simple, directo y muy portátil. Lo que hizo Gmail es solicitar una página html sin fin que contiene secuencias de porciones de JavaScript. Dar es una prueba, es muy poderoso. Entonces, nosotros tendremos en el lado del cliente un archivo js que procesa las respuestas, y otro html interminable que contiene las secuencias Javascript .

El resto del artículo entra en mucho más detalle, incluyendo una exploración de alternativas, así como la específica elegida por GMail.

+0

Es un buen artículo. Pero aún no explica por qué GMail elige JSON como respuesta en Firefox. –

+0

@Morgan, JSON es una buena forma de empaquetar datos, especialmente aunque no exclusivamente para uso de Javascript - cfr http://ajaxian.com/archives/json-vs-xml-the-debate y (especialmente) los muchos enlaces de eso. Con la codificación de transferencia fragmentada, funciona bien ... al menos en navegadores que cumplen decentemente con los estándares ;-). –

+0

Hola, probé la máquina de paso para el artículo porque el artículo está caído. ¿Puedes entregar otro enlace? ¡¡Gracias!! – loveNoHate