日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习《apache源代码全景分析》之过滤器部分摘录

發布時間:2024/1/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习《apache源代码全景分析》之过滤器部分摘录 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.過濾器分為輸入過濾器和輸出過濾器,輸入過濾器用于修改從網絡讀取的數據;而輸出過濾器則用于修改生成并寫入網絡的數據。

2.對比

? ?

? ?

3.輸入過濾器主要是對接收到的請求進行處理,它與我們正常思維一致的地方:

? ?(1) 客戶端和CORE_IN過濾器之間的數據流方向與輸出過濾器的數據方向相反。CORE向網絡寫入數據,而CORE_IN則是從網絡讀取數據。

? ?(2) 數據響應的方向也與我們想象的一致。客戶端的數據被CORE_IN讀取后依次經過各個過濾器最終到達核心。

? ?唯一不同的是請求報文的方向。請求報文的讀取由“Request Processing”處發起,內容生成器僅創建一個空的緩沖區,然后將其傳遞到前一個過濾器,要求將其填滿。由于此時緩沖區中空無一物,因此它將繼續要求前一個過濾器填滿。這種過程直到CORE_IN過濾器位置為止。CORE_IN向網絡讀取數據后,填滿該緩沖區,而后依次沿過濾器鏈表返回。各個過濾器依次處理。

4.對一個給定的HTTP請求,該請求在各個過濾器之間的傳遞過程如下圖:

??

5.在Apache中我們使用ap_filter_rec_t數據結構來描述一個過濾器。

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; //指向下一個過濾器結構ap_filter_provider_t *provider; //2.2.6版本中提供provider概念int debug;unsigned int proto_flags; //標記當前過濾器使用的對應的協議 };

在Apache中,ap_filter_t是主要的對外展現的過濾器數據結構:

?

?過濾器結構的最后一個成員是ctx,用來保存過濾器的上下文信息。

6.Apache中使用過濾器包括兩種:靜態過濾器使用和動態過濾器使用。

7.

?

8.filter_trie_node節點分配示意圖

? ?

9.過濾器注冊

? ?

? ?由于過濾器分為輸入和輸出過濾器兩種,因此最終結果江永兩棵過濾樹保存。分別是registered_input_filters和registered_output_filters表示,它們都是全局變量。

10.“face”過濾器注冊流程

? ??

? ? 實際真正的過濾器數據保存在“e”結點的frec結構中。

11.“facd”及“fd”過濾器注冊后的結構

? ??

12.最終的過濾器結構

? ??

? ?所有的過濾器注冊完畢,形成一個典型的過濾器樹,如下圖:

? ? ??

13.每個請求都會關聯4個過濾器,兩個輸入過濾器和兩個輸出過濾器。

struct request_rec {......struct ap_filter_t *output_filters;struct ap_filter_t *input_filters;struct ap_filter_t *proto_output_filters;struct ap_filter_t *proto_input_filters;...... };

? ?同時在連接記錄結構conn_rec中也會看到下面的代碼:

struct conn_rec {......struct ap_filter_t *input_filters;struct ap_filter_t *output_filters;...... }

? ?每個連接會關聯一個輸入過濾器和一個輸出過濾器。在請求創建的時候(ap_read_request函數中),請求的過濾器鏈表直接繼承連接過濾器鏈表。

? ? ?

14.任何一個過濾器,最終它都要插入到山中過濾器鏈表中的其中之一:內容過濾器鏈表、協議過濾器鏈表、連接過濾器鏈表。

? ?(1) 內容過濾器將被天際到內容過濾器鏈表中,即outf = r_filters;

? ?(2) 協議過濾器將被添加到協議過濾器鏈表中,即outf=p_filters;

? ?(3) 內容和協議之外的過濾器將被添加到連接過濾器鏈表中,即outf=c_filters.

15.ap_add_input_filter_handle()函數可以直接按照過濾器句柄進行添加。函數內部僅僅是調用了add_any_filter而已。

16.當一個過濾器不再需要的時候,它就可以從請求或連接中被刪除。Apache中通過ap_remove_input_filter和ap_remove_output_filter函數實現移除的效果.

17.過濾器提供者

struct ap_filter_provider_t {/*How to match this provider to filter dispatch criterion */enum {STRING_MATCH,STRING_CONTAINS,REGEX_MATCH,INT_EQ,INT_LT,INT_LE,INT_GT,INT_GE,DEFINED} match_type;/* negation on match_type */int not;union {const char *string;ap_regex_t *regex;int number;} match;/* The filter that implements this provider */ap_filter_rec_t *frec;/* The next provider in the list */ap_filter_provider_t *next;/* Dispatch criteria for filter providers */enum {HANDLER,REQUEST_HEADERS,RESPONSE_HEADERS,SUBPROCESS_ENV,CONTENT_TYPE} dispatch;/* Match vluae for filter providers */const char *value; };

18.過濾器束和請求提供者之間的關系如下圖:

? ?

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的学习《apache源代码全景分析》之过滤器部分摘录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。