在HttpWatch的幫助下,我試圖弄清楚GMail是如何實現Comet的。GMail如何實現Comet?
我用兩個賬號登錄GMail,一個在IE中,另一個在Firefox中。在GMail的GTalk中用「WASSUP」等魔法詞聊天。然後,我註銷這兩個GMail帳戶,過濾任何沒有「WASSUP」字符串的http內容。結果顯示哪個HTTP請求是流式傳輸通道。 (注意:我必須註銷,否則,永不停止的HTTP將不會在HttpWatch中顯示內容。)
結果很有趣。對河道的網址是這樣的:
沒有驚喜,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)中響應。也就是說,在交互狀態和完整狀態下。
這是一篇很好的文章。但是,它仍然無法解釋爲什麼GMail在Firefox中選擇JSON作爲響應。 – 2010-03-20 03:26:27
@Morgan,JSON的封裝數據的確是一種不錯的方法,尤其是對於Javascript的使用並不完全是這樣 - cfr http://ajaxian.com/archives/json-vs-xml-the-debate和(尤指)很多鏈接由此。使用分塊傳輸編碼,它可以很好地工作......至少在符合標準的瀏覽器中;-)。 – 2010-03-20 03:52:04
嗨,嘗試waybackmachine的文章,因爲文章關閉。你可以提供另一個鏈接?謝謝!! – loveNoHate 2014-12-13 23:21:14