-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathngx_http_array_var_util.c
118 lines (86 loc) · 2.38 KB
/
ngx_http_array_var_util.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* Copyright (C) Yichun Zhang (agentzh)
*/
#ifndef DDEBUG
#define DDEBUG 0
#endif
#include "ddebug.h"
#include "ngx_http_array_var_util.h"
static ngx_int_t ngx_http_array_var_variable_not_found(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data);
/* Modified from the ngx_strlcasestrn function in ngx_string.h
* Copyright (C) by Igor Sysoev */
u_char *
ngx_http_array_var_strlstrn(u_char *s1, u_char *last, u_char *s2, size_t n)
{
ngx_uint_t c1, c2;
c2 = (ngx_uint_t) *s2++;
last -= n;
do {
do {
if (s1 >= last) {
return NULL;
}
c1 = (ngx_uint_t) *s1++;
} while (c1 != c2);
} while (ngx_strncmp(s1, s2, n) != 0);
return --s1;
}
ndk_set_var_value_pt
ngx_http_array_var_get_func_from_cmd(u_char *name, size_t name_len)
{
ndk_set_var_t *filter;
ngx_uint_t i;
ngx_module_t **modules;
ngx_module_t *module;
ngx_command_t *cmd;
#if defined(nginx_version) && nginx_version >= 1009011
modules = ngx_cycle->modules;
#else
modules = ngx_modules;
#endif
for (i = 0; modules[i]; i++) {
module = modules[i];
if (module->type != NGX_HTTP_MODULE) {
continue;
}
cmd = modules[i]->commands;
if (cmd == NULL) {
continue;
}
for ( /* void */ ; cmd->name.len; cmd++) {
if (cmd->set != ndk_set_var_value) {
continue;
}
filter = cmd->post;
if (filter == NULL) {
continue;
}
if (cmd->name.len != name_len
|| ngx_strncmp(cmd->name.data, name, name_len) != 0)
{
continue;
}
return (ndk_set_var_value_pt) filter->func;
}
}
return NULL;
}
ngx_int_t
ngx_http_array_var_add_variable(ngx_conf_t *cf, ngx_str_t *name)
{
ngx_http_variable_t *v;
v = ngx_http_add_variable(cf, name, NGX_HTTP_VAR_CHANGEABLE);
if (v == NULL) {
return NGX_ERROR;
}
v->get_handler = ngx_http_array_var_variable_not_found;
return ngx_http_get_variable_index(cf, name);
}
static ngx_int_t
ngx_http_array_var_variable_not_found(ngx_http_request_t *r,
ngx_http_variable_value_t *v, uintptr_t data)
{
v->not_found = 1;
return NGX_OK;
}