nginx資料結構(ngx str t)

2021-07-23 07:01:33 字數 2554 閱讀 3270

typedef struct  ngx_str_t;

/*通過乙個以』\0』結尾的普通字串str構造乙個nginx的字串,

鑑於其中採用sizeof操作符計算字串長度,因此引數必須是乙個常量字串。*/

#define ngx_string(str)

/*使用ngx_null_string初始化字串為空字串*/

#define ngx_null_string

/*設定字串str為text,text必須為常量字串*/

#define ngx_str_set(str, text) \

(str)->len = sizeof(text) - 1; (str)->data = (u_char *) text

/*設定str為空串*/

#define ngx_str_null(str) (str)->len = 0; (str)->data = null

/***ngx_str_t的賦值、初始化***/

ngx_str_t str = ngx_string("hello world"); //right

ngx_str_t str1 = ngx_null_string; //right

ngx_str_t str, str1;

str = ngx_string("hello world"); // 編譯出錯,在c中結構體中涉及到指標時,是不允許直接賦值的

str1 = ngx_null_string; // 編譯出錯

ngx_str_set(&str, "hello world"); //right

ngx_str_null(&str1); //right

str = (ngx_str_t) ngx_string("hello world");//c99標準允許編譯

str1 = (ngx_str_t) ngx_null_string; //c99標準允許編譯

/*由於ngx_str_set與ngx_str_null實際上是兩行語句,故在if/for/while等語句中單獨使用需要用花括號括起來,*/

ngx_str_t str;

if (cond)

ngx_str_set(&str, "true"); // 問題產生

else

ngx_str_set(&str, "false"); // 問題產生

void ngx_strlow(u_char *dst, u_char *src, size_t n);//將src的前n個字元轉換成小寫存放在dst字串中,呼叫者需要保證dst指向的空間大於等於n。

void ngx_strncmp(u_char *dst, u_char *src, size_t n);//區分大小寫的字串比較,只比較前n個字元。

void ngx_strcmp(u_char *dst, u_char *src);//區分大小寫的不帶長度的字串比較。

ngx_int_t ngx_strcasecmp(u_char *s1, u_char *s2);//不區分大小寫的不帶長度的字串比較。

ngx_int_t ngx_strncasecmp(u_char *s1, u_char *s2, size_t n);//不區分大小寫的帶長度的字串比較,只比較前n個字元。

/*下面這三個函式用於字串格式化,

ngx_snprintf的第二個引數max指明buf的空間大小,

ngx_slprintf則通過last來指明buf空間的大小。

推薦使用第二個或第三個函式來格式化字串,ngx_sprintf函式還是比較危險的,容易產生緩衝區溢位漏洞。

在這一系列函式中,nginx在相容glibc中格式化字串的形式之外,還新增了一些方便格式化nginx型別的一些轉義字元,

比如%v用於格式化ngx_str_t結構。

在nginx原始檔的ngx_string.c中有說明:*/

u_char * ngx_cdecl ngx_sprintf(u_char *buf, const char *fmt, ...);

u_char * ngx_cdecl ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...);

u_char * ngx_cdecl ngx_slprintf(u_char *buf, u_char *last, const char *fmt, ...);

//對src進行反編碼,type可以是0、ngx_unescape_uri、ngx_unescape_redirect這三個值。

void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);

uintptr_t ngx_escape_html(u_char *dst, u_char *src, size_t size);//對html標籤進行編碼。

nginx原始碼學習 資料結構 ngx str

nginx中關於字串的資料結構位於src core ngx string.c和src core ngx string.h中 先來看一下資料結構 1 typedef struct ngx str t data指標指向字串起始位址,len表示字串的有效長度。這裡面的data並不保證以 0 結尾,所以必須...

nginx資料結構 ngx array t

typedef struct ngx array s ngx array t struct ngx array s 建立乙個新的陣列物件,並返回這個物件。p 陣列分配記憶體使用的記憶體池。n 陣列的初始容量大小,即在不擴容的情況下最多可以容納的元素個數。size 單個元素的大小,單位是位元組。ngx...

nginx中ngx list的資料結構

今天沒事了,在檢視nginx源 中看到ngx list的結構,發現設計為鍊錶陣列的形式,不知道為什麼這樣設計 struct ngx list part s typedef struct ngx list t 只實現三個方法 ngx list t ngx list create ngx pool t ...