Mozilla研究-传输协议

时间:2022-08-30 14:52:03

Mozilla研究-传输协议

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对应的协议实现上。