2010-03-20 67 views
14

在HttpWatch的幫助下,我試圖弄清楚GMail是如何實現Comet的。GMail如何實現Comet?

我用兩個賬號登錄GMail,一個在IE中,另一個在Firefox中。在GMail的GTalk中用「WASSUP」等魔法詞聊天。然後,我註銷這兩個GMail帳戶,過濾任何沒有「WASSUP」字符串的http內容。結果顯示哪個HTTP請求是流式傳輸通道。 (注意:我必須註銷,否則,永不停止的HTTP將不會在HttpWatch中顯示內容。)

結果很有趣。對河道的網址是這樣的:

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

沒有驚喜,Gmail的做彗星在IE IFRAME用。 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的彗星來說,這不起作用,對吧?

有什麼辦法可以弄清楚GMail如何實現Comet?

更新: 經過進一步調查,我認爲Gmail將實現彗星是這樣的: 1)在IE瀏覽器,它使用一個永遠隱藏的iframe; 2)在Firefox中,它使用forever-XHR而不使用multipart/x-mixed-replace標頭。客戶端將在conditon(readyState == 3)或(readyState == 4)中響應。也就是說,在交互狀態和完整狀態下。

回答

15

this article

那麼,什麼是由谷歌的Gmail 使用的解決方案?

該解決方案非常簡單, 直截了當,非常便攜! Gmail所做的是要求 包含 流部分的無限HTML頁面。給它 它是一個嘗試,它非常強大。因此,我們 將在客戶端有處理響應的js文件 ,以及包含 JavaScript Streams的另一個無限HTML。

本文的其餘部分將進行更詳細的介紹,包括對備選方案的探索以及GMail挑選的具體方案。

+0

這是一篇很好的文章。但是,它仍然無法解釋爲什麼GMail在Firefox中選擇JSON作爲響應。 – 2010-03-20 03:26:27

+0

@Morgan,JSON的封裝數據的確是一種不錯的方法,尤其是對於Javascript的使用並不完全是這樣 - cfr http://ajaxian.com/archives/json-vs-xml-the-debate和(尤指)很多鏈接由此。使用分塊傳輸編碼,它可以很好地工作......至少在符合標準的瀏覽器中;-)。 – 2010-03-20 03:52:04

+0

嗨,嘗試waybackmachine的文章,因爲文章關閉。你可以提供另一個鏈接?謝謝!! – loveNoHate 2014-12-13 23:21:14

相關問題