Skip to content

Commit

Permalink
ngx_http_variables.c
Browse files Browse the repository at this point in the history
  • Loading branch information
chronolaw committed Jan 18, 2024
1 parent 4f44583 commit b1861b9
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions nginx/src/http/ngx_http_variables.c
Original file line number Diff line number Diff line change
Expand Up @@ -898,10 +898,13 @@ ngx_http_variable_request_get_size(ngx_http_request_t *r,
}


// 在1.23.0之前,ngx_http_variable_header()只获取第一个header的值
// 获取多个值调用的是ngx_http_variable_headers()
static ngx_int_t
ngx_http_variable_header(ngx_http_request_t *r, ngx_http_variable_value_t *v,
uintptr_t data)
{
// 使用逗号分隔多个值,但如果值里有逗号,则无法区分
return ngx_http_variable_headers_internal(r, v, data, ',');
}

Expand All @@ -914,6 +917,7 @@ ngx_http_variable_cookies(ngx_http_request_t *r,
}


// 获取header的真正实现函数
static ngx_int_t
ngx_http_variable_headers_internal(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data, u_char sep)
Expand All @@ -926,12 +930,14 @@ ngx_http_variable_headers_internal(ngx_http_request_t *r,

len = 0;

// 遍历链表
for (th = h; th; th = th->next) {

if (th->hash == 0) {
continue;
}

// 加2是因为要用", "分隔
len += th->value.len + 2;
}

Expand All @@ -940,19 +946,22 @@ ngx_http_variable_headers_internal(ngx_http_request_t *r,
return NGX_OK;
}

// 减2,因为末尾不需要逗号
len -= 2;

v->valid = 1;
v->no_cacheable = 0;
v->not_found = 0;

// 链表只有一个元素,直接返回值
if (h->next == NULL) {
v->len = h->value.len;
v->data = h->value.data;

return NGX_OK;
}

// 分配内存
p = ngx_pnalloc(r->pool, len);
if (p == NULL) {
return NGX_ERROR;
Expand All @@ -963,6 +972,7 @@ ngx_http_variable_headers_internal(ngx_http_request_t *r,

end = p + len;

// 逐个拷贝header值输出
for (th = h; th; th = th->next) {

if (th->hash == 0) {
Expand All @@ -975,13 +985,15 @@ ngx_http_variable_headers_internal(ngx_http_request_t *r,
break;
}

// 添加分隔符
*p++ = sep; *p++ = ' ';
}

return NGX_OK;
}


// 处理http_*/sent_http_*等头
static ngx_int_t
ngx_http_variable_unknown_header_in(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data)
Expand Down Expand Up @@ -1027,6 +1039,7 @@ ngx_http_variable_unknown_header(ngx_http_request_t *r,
len = 0;
#endif

// 遍历链表
header = part->elts;

for (i = 0; /* void */ ; i++) {
Expand All @@ -1045,10 +1058,12 @@ ngx_http_variable_unknown_header(ngx_http_request_t *r,
continue;
}

// 长度不对直接跳过
if (header[i].key.len != var->len - prefix) {
continue;
}

// 小写化比较
for (n = 0; n < var->len - prefix; n++) {
ch = header[i].key.data[n];

Expand All @@ -1064,10 +1079,12 @@ ngx_http_variable_unknown_header(ngx_http_request_t *r,
}
}

// 比较不对则跳过
if (n != var->len - prefix) {
continue;
}

// 找到一个header,加上2个字节的分隔符长度
len += header[i].value.len + 2;

*ph = &header[i];
Expand All @@ -1094,6 +1111,7 @@ ngx_http_variable_unknown_header(ngx_http_request_t *r,
return NGX_OK;
}

// 分配内存准备输出
p = ngx_pnalloc(r->pool, len);
if (p == NULL) {
return NGX_ERROR;
Expand Down

0 comments on commit b1861b9

Please sign in to comment.