14

在 HttpWatch 的帮助下,我试图弄清楚 GMail 是如何实现 Comet 的。

我使用两个帐户登录 GMail,一个在 IE 中,另一个在 Firefox 中。在 GMail 中使用诸如“WASSUP”之类的魔法词在 GTalk 中聊天。然后,我注销两个 GMail 帐户,过滤任何没有“WASSUP”字符串的 http 内容。结果显示哪个 HTTP 请求是流式传输通道。(注意:我必须注销。否则,永无止境的 HTTP 不会在 HttpWatch 中显示内容。)

结果很有趣。流通道的 URL 如下:

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

GMail 使用 IFRAME 在 IE 中做 Comet 也就不足为奇了。Http 内容以“ <html><body>”开头。

最初,我猜测 GMail 在 Firefox 中使用多部分 XmlHttpRequest 执行 Comet。令我惊讶的是,响应标头没有“multipart/x-mixed-replace”标头。响应头如下:

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

不幸的是,HttpWatch 无法判断 HTTP 请求是否来自 XmlHttpRequest。内容不是 HTML 而是 JSON。它看起来像是对 XHR 的回应,但如果没有 multipart/x-mixed-replace,这对 Comet 不起作用,对吧?

还有其他方法可以弄清楚 GMail 是如何实现 Comet 的吗?

更新: 经过进一步调查,我相信 GMail 以这种方式实现 Comet:1)在 IE 中,它使用永远隐藏的 iframe;2) 在 Firefox 中,它使用没有 multipart/x-mixed-replace 标头的 forever-XHR。客户端将响应条件 (readyState == 3) OR (readyState == 4)。即,处于交互状态和完成状态。

4

1 回答 1

15

根据这篇文章

那么谷歌Gmail使用的解决方案是什么?

该解决方案非常简单、直接且非常便携!Gmail 所做的是请求包含 Javascript 部分流的无休止的 html 页面。试试看,很强大。因此,我们将在客户端拥有一个处理响应的 js 文件,以及另一个包含 Javascript 流的无限 html。

本文的其余部分会更详细地介绍,包括对替代方案的探索以及 GMail 选择的具体方案。

于 2010-03-20T02:50:26.283 回答