- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Apach中过滤器实现机制分析
Apache中过滤器实现机制的分析
内容提要
Apache中的过滤器形成了链表结构,当响应请求输出的时候,请求将依次流经整个过滤器链,直到到达最后一个过滤器,直接将其发送到网络中去。
在过滤器的最顶端,代码生成客户端请求的内容,通常称之为“内容生成器”,内容生成器产生的内容使用Apache的标准输入机制ap_rputs(),ap_rprintf()或者ap_rwrite()输入过滤器顶端。每一个过滤器都被定义为一个回调,该回调从前一个过滤器接受输出(如果是第一个过滤器的话,没有前一个过滤器,那么此时从内容生成器中接受输入),对其进行操作,同时将处理结果传递给下链表中的下一个过滤器。传递可以使用ap_fc_*函数,比如ap_fc_puts(),ap_fc_printf()以及ap_fc_write()等等。
当内容生成器生成内容之后,Apache系统将传递一个“结束流”标记给过滤器链表,过滤器将使用这个“结束流”来刷新所有的内部状态以及决定那些不完整的语法。
过滤器函数
过滤器函数通常用于执行回调,它将传递一个指针给对应的过滤器以及一个存储段,其中包含需要过滤得内容。在过滤器的ctx中,回调将查找它的上下文,上下文就是通过ctx提供。过滤器可能安装很多次,每次都接受自己的安装上下文指针。回调总是与过滤器关联在一起的,通常通过指定的名字描述。在ap_register_input_filter()和ap_register_output_filter()中会将指定的关联函数与指定的过滤器关联在一起。
如果传递给注册函数的初始化参数不为NULL,
在Apache1.3版本,当Apache为特定请求生成内容,返回客户之前,
frec是Apache过滤器结点,其是ap_filter_rec_t结构,该结构用来定义一个Apache过滤器,其定义如下:
struct ap_filter_rec_t {
const char *name;
ap_filter_func filter_func;
ap_init_filter_func filter_init_func;
ap_filter_type ftype;
struct ap_filter_rec_t *next;
};
该结构定义了作为一个过滤器必须具备的各个特性。name是过滤器的名称;filter_func是过滤器对应的函数,当过滤器被激活的时候,其将调用该函数对请求进行过滤处理。filter_init_func用于在过滤处理句柄被激活之前调用。需要注意的是,该过滤器仅能用于HTTP协议。其余协议的初始化由协议本身实现。
yype则是过滤器的类型。next则是指向下一个过滤器结构。
ctx通常用来保存过滤器frec可能需要的额外的信息,由于需要的信息的千差万别,因此只能将其类型定义为void,待真正需要的时候再做强制转换。
Apache的各个过滤器之间通过next形成链表结构。
R则是与当前过滤器关联的请求信息。C则是与当前过滤器关联的连接信息。
//////////////////////////////////////////////////////////////////////////////////////////////////////
Apache中对过滤器的保存是根据过滤器名称进行的,保存结果形成一棵过滤树。由于过滤器分为输入过滤器和输出过滤器两种,因此最终结果将用两棵过滤树保存。这两颗树的树根在Apache中分别用registered_input_filters和registered_output_filters表示。它们是全局变量,类型为filter_trie_node结构,其定义如下:
struct filter_trie_node {
ap_filter_rec_t *frec;
filter_trie_child_ptr *children;
int nchildren;
int size;
};
frec是该结点中实际保存的过滤器结构;children用来记录该结点的所有子结点,Apache中对子结点的分配总是以4为单位进行的,不过即使一次分配了四个单元,但也不一定所有的单元都被使用,其中有一些空闲的单元。因此nchildren用来记录当前结点的子结点中所有的已经被使用的结点的个数,而size则用来记录实际分配的结点的个数,其值总是大于或者等于nchildren。size-nchildren则就是子结点中尚未使用的结点的个数。
现在我们来看一下Apache中是如何进行过滤器注册的,由于过滤器的注册的唯一根据就是过滤器名称,因此我们假设存在下面四个过滤器
您可能关注的文档
最近下载
- 定向钻施工方案.docx VIP
- 内燃机车钳工(高级)技能鉴定理论考试题库(含答案).pdf VIP
- GP-12 早期生产遏制必威体育精装版版全解课程.pptx VIP
- 三小区地下车库人防工程施工组织设计.doc VIP
- 《HAF003-1991及HAD003汇编(核电厂质量保证法规和导则)》.doc VIP
- 《企业内部控制》第1章 基本规范.pptx VIP
- 2025年初高中语文衔接知识:现代汉语语法及练习(Word版,含答案).docx VIP
- Photoshop CC图像处理项目教程(第2版)全套PPT课件.pptx VIP
- 统计学第六版课后习题答案.pdf
- 2024卫生院党风廉政建设和反腐败工作方案.docx VIP
文档评论(0)