Mozilla研究—传输协议

来源:百度文库 编辑:神马文学网 时间:2024/04/30 00:04:27
mozilla是一个以浏览器为中心的软件平台,它在我们平台中占有重要地位。我们用它来实现WEB浏览器、WAP浏览器、邮件系统、电子书和帮助阅读器等应用程序。为此,我最近花了不少时间去阅读mozilla的代码和文档,我将写一系列的BLOG作为笔记,供有需要的朋友参考。本文介绍一下传输协议。
Mozilla浏览器作为HTTP协议的客户端,它与HTTP服务器(如Apache和IIS等)通信,进行数据下载和上传,自然要用到HTTP协议了。不过HTTP协议只是Mozilla所支持的众多协议的一种,这些协议有的是网络协议,比如HTTP,有的是本地协议,如file,还有的是虚拟协议,比如about。
我们说过,针对接口编程是Mozilla的重要特色之一,这里便是最好的例证:所有协议都要实现nsIProtocolHandler接口,使用者由nsIProtocolHandler请求所需要的服务,而不关心具体的实现。通过URL中的Scheme自然的映射到具体协议的ContractID上,然后由组件管理器创建协议的实例。
nsIProtocolHandler的主要接口函数有:
1.         GetScheme 得到协议的Scheme,这里的Scheme其实就是协议的名称,比如http,https和ftp等等。
2.         GetDefaultPort 得到协议的默认端口,比如http协议的默认端口是80,https协议的默认端口是443。
3.         NewURI 创建一个nsIURI接口的实例。
4.         NewChannel 根据提供的nsIURI创建一个Channel,Channel是客户端与服务器端之间连接的抽象,但不能直接从Channel中获取数据。获取数据的方式有两种:其一是调用Open得到nsIInputStream对象,再从nsIInputStream对象中读取数据。其二是调用AsyncOpen注册一个nsIStreamListener对象,当Channel中有数据可用时,Channel会通知nsIStreamListener对象读取数据。
在Mozilla中,实现的协议主要有:
1.         nsHttpHandler 实现HTTP(S)协议,这是mozilla中最重要也是最复杂的协议,HTTP协议看似简单,不过要完整实现可不容易。比如处理ResCode 100,重定向,认证和Chunked数据等等,都是比较麻烦的。
2.         nsFtpProtocolHandler 实现FTP协议,mozilla能够像浏览网页一样,在浏览器中浏览FTP网站。FTP返回的结果是文本格式,不能直接在浏览器中浏览,要经过nsFTPDirListingConv转换之后才能显示。
3.         nsDataHandler 实现Data协议,它用来解码URL中的BASE64编码,感觉用处不大。
4.         nsAboutProtocolHandler 实现About协议。用来显示浏览器本身的一些信息,比如,about:plugins用来显示已经安装的插件,about:config用来显示和修改配置信息,about:buildconfig用来显示编译配置信息,about:cache用来显示cache信息等等。
5.         nsFileProtocolHandler 实现file协议,用来浏览本地文件,可以当简单的文件管理器使用。
6.         nsKeywordProtocolHandler 实现Keyword协议,它只是对HTTP协议的包装,它到指定的URL上去查询某个关键字,估计可以当作搜索引擎使用。
7.         nsViewSourceHandler 实现ViewSource协议,它是对其它协议的包装,用来显示HTML源代码。
8.         nsChromeProtocolHandler 实现Chrome协议,Chrome是mozilla自己的协议,它用来访问自己的资源文件,像locale、skin和XUL等等。它通过配置文件把chrome URI映射到物理文件上。
Mozilla还有其它一些协议的实现,而且它还可以通过GNomeVFS来支持更多协议,这里就不多说了。
为了避免与框架的耦合,以上这些协议的实现都是通过Factory来创建的。在build/nsNetModule.cpp和build2/nsNetModule.cpp定义了这些协议实现的ComponentInfo,再通过一些宏和GenericFactory包装生成自己的Factory。
所有这些协议都是作为服务提供的,也就是说在整个系统中只有一份实例存在。在第一次使用该协议时创建其实例,使用完后并不销毁,后来再使用时,就取第一次创建的实例。
URL到协议实现的匹配过程是在nsIOService::GetProtocolHandler里完成的。因为协议实现的mContractID都是以"@mozilla.org/network/protocol;1?name="开头,后面再附加协议的Scheme,所以很容易从URL对应的协议实现上。
~~end~~