(java栈的底层实现)(java栈怎么写)

gitweb是git自带的一个网页浏览器,通过它可以在网页上查看代码库的各种信息。

因为我想在它基础上加个BUG跟踪功能,所以这几天研究了一下它的代码。

它是用perl语言写的一个CGI程序,具体怎么部署在前一篇文章里已经说过了,这里再说一下它的代码架构

(java栈的底层实现)(java栈怎么写)

gitweb的主函数run()

1,gitweb的主函数是run()函数

如上图,所有的网页请求都在run()函数里处理。

run()函数的结构非常简单,先调用evaluate_argv()去处理输入的各个参数,然后循环调用run_request()去处理网页请求(直到处理完成)。

它的主要代码,就在run_request()函数里。

(java栈的底层实现)(java栈怎么写)

run_request()函数

2,run_request()函数

run_request()函数会首先运行一大堆的前置代码,例如:解析网页请求的uri,分析网页请求的各个参数,确定要运行的CGI脚本的路径,等等。

最后调用dispatch()函数,把这个网页请求分发下去(继续处理)。

dispatch在英语里一般用来表示消息的分派,暗含着往下传递

deliver一般用来表示消息的往上传递,例如数据包从IP层传递到TCP层,就叫diliver。

在网络协议的分层里,IP协议更接近硬件网卡,而TCP协议更接近应用程序

这里是从程序的主脉络传递到具体的消息处理函数,所以叫dispatch()。

3,dispatch()函数

如下图,dispatch()函数首先会进行一系列的检测,以保证网页访问的合法性

它的大部分内容都是一些if else语句,最后是一个函数指针的调用。

(java栈的底层实现)(java栈怎么写)

dispatch()函数

这个函数指针是指针数组里的某一项,它的索引就是网页请求的参数。

当然指针数组是C语言的说法,perl语言里叫哈希数组(散列表)。

哈希数组是由一个个的键值对构成的,“键”表示网页请求的类型,“值"表示对应的处理函数。

所以,gitweb支持的所有网页请求,就在这个actions哈希数组里。

接下来,我们看看它的内容。

4,actions哈希数组

如下图,前面的字符串是网页请求的类型,后面的是对应的处理函数。

所以要是查看某个代码库的日志,第3节的dispatch()函数实际调用的就是git_log()。

(java栈的底层实现)(java栈怎么写)

actions哈希数组

git_log()的实现如下图,它只是以"log"字符串为第一个参数,调用了通用的日志函数git_log_generic()

(java栈的底层实现)(java栈怎么写)

git_log()函数

5,git_log_generic()函数

git_log_generic()的代码比较长,但前面也是一些if else的检查,它的关键代码也只有最后两行

(java栈的底层实现)(java栈怎么写)

git_log_generic(),第一张图

如下图,红框里的就是关键代码,它调用了一个函数指针用来生成html的主体部分。

(java栈的底层实现)(java栈怎么写)

git_log_generic(),第二张图

如果是生成简短的日志,那么这里调用的函数就是git_shortlog_body()。

6,git_shortlog_body()函数

它的代码如下,实际上就是生成了一个html的表格,用来显示git日志

其他请求的处理跟查看日志的处理差不多,也是通过调用不同的函数指针实现的。

gitweb返回的是一个html文件,经过浏览器的渲染之后,就是我们看到的网页了。

(java栈的底层实现)(java栈怎么写)

git_shortlog_body()函数

声明:我要去上班所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者底层技术栈所有,原文出处。若您的权利被侵害,请联系删除。

本文标题:(java栈的底层实现)(java栈怎么写)
本文链接:https://www.51qsb.cn/article/dvjma4.html

(0)
打赏微信扫一扫微信扫一扫QQ扫一扫QQ扫一扫
上一篇2023-08-02
下一篇2023-08-02

你可能还想知道

发表回复

登录后才能评论