mozilla
是一個以瀏覽器為中心的軟件平臺,它在我們平臺中占有重要地位,。我們用它來實(shí)現(xiàn)WEB瀏覽器,、WAP瀏覽器、郵件系統(tǒng),、電子書和幫助閱讀器等應(yīng)用程序,。為
此,我最近花了不少時間去閱讀mozilla的代碼和文檔,,我將寫一系列的BLOG作為筆記,,供有需要的朋友參考。本文介紹一下傳輸協(xié)議,。 Mozilla
瀏覽器作為HTTP協(xié)議的客戶端,,它與HTTP服務(wù)器(如Apache和IIS等)通信,進(jìn)行數(shù)據(jù)下載和上傳,,自然要用到HTTP協(xié)議了,。不過HTTP協(xié)
議只是Mozilla所支持的眾多協(xié)議的一種,這些協(xié)議有的是網(wǎng)絡(luò)協(xié)議,,比如HTTP,,有的是本地協(xié)議,如file,,還有的是虛擬協(xié)議,,比如about。 我們說過,針對接口編程是Mozilla的重要特色之一,,這里便是最好的例證:所有協(xié)議都要實(shí)現(xiàn)nsIProtocolHandler接口,,使用者由nsIProtocolHandler請求所需要的服務(wù),,而不關(guān)心具體的實(shí)現(xiàn)。通過URL中的Scheme自然的映射到具體協(xié)議的ContractID上,,然后由組件管理器創(chuàng)建協(xié)議的實(shí)例,。 nsIProtocolHandler的主要接口函數(shù)有: 1. GetScheme 得到協(xié)議的Scheme,這里的Scheme其實(shí)就是協(xié)議的名稱,,比如http,,https和ftp等等。 2. GetDefaultPort 得到協(xié)議的默認(rèn)端口,,比如http協(xié)議的默認(rèn)端口是80,,https協(xié)議的默認(rèn)端口是443。 3. NewURI 創(chuàng)建一個nsIURI接口的實(shí)例,。 4. NewChannel 根據(jù)提供的nsIURI創(chuàng)建一個Channel,,Channel是客戶端與服務(wù)器端之間連接的抽象,但不能直接從Channel中獲取數(shù)據(jù),。獲取數(shù)據(jù)的方式有兩種:其一是調(diào)用Open得到nsIInputStream對象,,再從nsIInputStream對象中讀取數(shù)據(jù)。其二是調(diào)用AsyncOpen注冊一個nsIStreamListener對象,,當(dāng)Channel中有數(shù)據(jù)可用時,,Channel會通知nsIStreamListener對象讀取數(shù)據(jù)。 在Mozilla中,,實(shí)現(xiàn)的協(xié)議主要有: 1. nsHttpHandler 實(shí)現(xiàn)HTTP(S)協(xié)議,,這是mozilla中最重要也是最復(fù)雜的協(xié)議,HTTP協(xié)議看似簡單,,不過要完整實(shí)現(xiàn)可不容易,。比如處理ResCode 100,重定向,,認(rèn)證和Chunked數(shù)據(jù)等等,,都是比較麻煩的。 2. nsFtpProtocolHandler 實(shí)現(xiàn)FTP協(xié)議,,mozilla能夠像瀏覽網(wǎng)頁一樣,,在瀏覽器中瀏覽FTP網(wǎng)站。FTP返回的結(jié)果是文本格式,,不能直接在瀏覽器中瀏覽,,要經(jīng)過nsFTPDirListingConv轉(zhuǎn)換之后才能顯示。 3. nsDataHandler 實(shí)現(xiàn)Data協(xié)議,,它用來解碼URL中的BASE64編碼,,感覺用處不大。 4. nsAboutProtocolHandler 實(shí)現(xiàn)About協(xié)議,。用來顯示瀏覽器本身的一些信息,,比如,,about:plugins用來顯示已經(jīng)安裝的插件,about:config用來顯示和修改配置信息,,about:buildconfig用來顯示編譯配置信息,,about:cache用來顯示cache信息等等。 5. nsFileProtocolHandler 實(shí)現(xiàn)file協(xié)議,,用來瀏覽本地文件,,可以當(dāng)簡單的文件管理器使用。 6. nsKeywordProtocolHandler 實(shí)現(xiàn)Keyword協(xié)議,,它只是對HTTP協(xié)議的包裝,,它到指定的URL上去查詢某個關(guān)鍵字,估計(jì)可以當(dāng)作搜索引擎使用,。 7. nsViewSourceHandler 實(shí)現(xiàn)ViewSource協(xié)議,,它是對其它協(xié)議的包裝,用來顯示HTML源代碼,。 8. nsChromeProtocolHandler 實(shí)現(xiàn)Chrome協(xié)議,Chrome是mozilla自己的協(xié)議,,它用來訪問自己的資源文件,,像locale、skin和XUL等等,。它通過配置文件把chrome URI映射到物理文件上,。 Mozilla還有其它一些協(xié)議的實(shí)現(xiàn),而且它還可以通過GNomeVFS來支持更多協(xié)議,,這里就不多說了,。 為了避免與框架的耦合,以上這些協(xié)議的實(shí)現(xiàn)都是通過Factory來創(chuàng)建的,。在build/nsNetModule.cpp和build2/nsNetModule.cpp定義了這些協(xié)議實(shí)現(xiàn)的ComponentInfo,,再通過一些宏和GenericFactory包裝生成自己的Factory。 所有這些協(xié)議都是作為服務(wù)提供的,,也就是說在整個系統(tǒng)中只有一份實(shí)例存在,。在第一次使用該協(xié)議時創(chuàng)建其實(shí)例,使用完后并不銷毀,,后來再使用時,,就取第一次創(chuàng)建的實(shí)例。 URL到協(xié)議實(shí)現(xiàn)的匹配過程是在nsIOService::GetProtocolHandler里完成的,。因?yàn)閰f(xié)議實(shí)現(xiàn)的mContractID都是以"@mozilla.org/network/protocol;1?name="開頭,,后面再附加協(xié)議的Scheme,所以很容易從URL對應(yīng)的協(xié)議實(shí)現(xiàn)上,。 ~~end~~ |
|