幻想小说网 酷文学 深夜书屋 叮当小说网 找小说网 无限小说网 红尘小说网

Mozilla研究—传输协议

Mozilla研究—传输协议

 

转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

作者联系方式:Li XianJing <xianjimli at hotmail dot com>

更新时间:2007-3-8

 

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其实就是协议的名称,比如httphttpsftp等等。

2.         GetDefaultPort 得到协议的默认端口,比如http协议的默认端口是80https协议的默认端口是443

3.         NewURI 创建一个nsIURI接口的实例。

4.         NewChannel 根据提供的nsIURI创建一个ChannelChannel是客户端与服务器端之间连接的抽象,但不能直接从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协议,Chromemozilla自己的协议,它用来访问自己的资源文件,像localeskinXUL等等。它通过配置文件把chrome URI映射到物理文件上。

 

Mozilla还有其它一些协议的实现,而且它还可以通过GNomeVFS来支持更多协议,这里就不多说了。

 

为了避免与框架的耦合,以上这些协议的实现都是通过Factory来创建的。在build/nsNetModule.cppbuild2/nsNetModule.cpp定义了这些协议实现的ComponentInfo,再通过一些宏和GenericFactory包装生成自己的Factory

 

所有这些协议都是作为服务提供的,也就是说在整个系统中只有一份实例存在。在第一次使用该协议时创建其实例,使用完后并不销毁,后来再使用时,就取第一次创建的实例。

 

URL到协议实现的匹配过程是在nsIOService::GetProtocolHandler里完成的。因为协议实现的mContractID都是以"@mozilla.org/network/protocol;1?name="开头,后面再附加协议的Scheme,所以很容易从URL对应的协议实现上。

 

~~end~~

 

 

posted on 2007-03-12 21:37  张云临  阅读(124)  评论(0编辑  收藏  举报

导航