annotate src/stream/ngx_stream_variables.c @ 7690:8253424d1aff

Added size check to ngx_http_alloc_large_header_buffer(). This ensures that copying won't write more than the buffer size even if the buffer comes from hc->free and it is smaller than the large client header buffer size in the virtual host configuration. This might happen if size of large client header buffers is different in name-based virtual hosts, similarly to the problem with number of buffers fixed in 6926:e662cbf1b932.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 06 Aug 2020 05:02:22 +0300
parents 89adf49fe76a
children cca4c8a715de
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
2 /*
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
4 * Copyright (C) Nginx, Inc.
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
5 */
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
6
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
7
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
8 #include <ngx_config.h>
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
9 #include <ngx_core.h>
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
10 #include <ngx_stream.h>
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
11 #include <nginx.h>
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
12
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
13 static ngx_stream_variable_t *ngx_stream_add_prefix_variable(ngx_conf_t *cf,
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
14 ngx_str_t *name, ngx_uint_t flags);
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
15
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
16 static ngx_int_t ngx_stream_variable_binary_remote_addr(
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
17 ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
18 static ngx_int_t ngx_stream_variable_remote_addr(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
19 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
20 static ngx_int_t ngx_stream_variable_remote_port(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
21 ngx_stream_variable_value_t *v, uintptr_t data);
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
22 static ngx_int_t ngx_stream_variable_proxy_protocol_addr(
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
23 ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data);
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
24 static ngx_int_t ngx_stream_variable_proxy_protocol_port(
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
25 ngx_stream_session_t *s, ngx_stream_variable_value_t *v, uintptr_t data);
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
26 static ngx_int_t ngx_stream_variable_server_addr(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
27 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
28 static ngx_int_t ngx_stream_variable_server_port(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
29 ngx_stream_variable_value_t *v, uintptr_t data);
6668
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
30 static ngx_int_t ngx_stream_variable_bytes(ngx_stream_session_t *s,
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
31 ngx_stream_variable_value_t *v, uintptr_t data);
6669
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
32 static ngx_int_t ngx_stream_variable_session_time(ngx_stream_session_t *s,
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
33 ngx_stream_variable_value_t *v, uintptr_t data);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
34 static ngx_int_t ngx_stream_variable_status(ngx_stream_session_t *s,
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
35 ngx_stream_variable_value_t *v, uintptr_t data);
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
36 static ngx_int_t ngx_stream_variable_connection(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
37 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
38
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
39 static ngx_int_t ngx_stream_variable_nginx_version(ngx_stream_session_t *s,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
40 ngx_stream_variable_value_t *v, uintptr_t data);
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
41 static ngx_int_t ngx_stream_variable_hostname(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
42 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
43 static ngx_int_t ngx_stream_variable_pid(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
44 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
45 static ngx_int_t ngx_stream_variable_msec(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
46 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
47 static ngx_int_t ngx_stream_variable_time_iso8601(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
48 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
49 static ngx_int_t ngx_stream_variable_time_local(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
50 ngx_stream_variable_value_t *v, uintptr_t data);
6670
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
51 static ngx_int_t ngx_stream_variable_protocol(ngx_stream_session_t *s,
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
52 ngx_stream_variable_value_t *v, uintptr_t data);
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
55 static ngx_stream_variable_t ngx_stream_core_variables[] = {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
56
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
57 { ngx_string("binary_remote_addr"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
58 ngx_stream_variable_binary_remote_addr, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
59
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
60 { ngx_string("remote_addr"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
61 ngx_stream_variable_remote_addr, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
62
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
63 { ngx_string("remote_port"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
64 ngx_stream_variable_remote_port, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
65
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
66 { ngx_string("proxy_protocol_addr"), NULL,
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
67 ngx_stream_variable_proxy_protocol_addr,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
68 offsetof(ngx_proxy_protocol_t, src_addr), 0, 0 },
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
69
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
70 { ngx_string("proxy_protocol_port"), NULL,
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
71 ngx_stream_variable_proxy_protocol_port,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
72 offsetof(ngx_proxy_protocol_t, src_port), 0, 0 },
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
73
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
74 { ngx_string("proxy_protocol_server_addr"), NULL,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
75 ngx_stream_variable_proxy_protocol_addr,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
76 offsetof(ngx_proxy_protocol_t, dst_addr), 0, 0 },
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
77
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
78 { ngx_string("proxy_protocol_server_port"), NULL,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
79 ngx_stream_variable_proxy_protocol_port,
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
80 offsetof(ngx_proxy_protocol_t, dst_port), 0, 0 },
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
81
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
82 { ngx_string("server_addr"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
83 ngx_stream_variable_server_addr, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
84
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
85 { ngx_string("server_port"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
86 ngx_stream_variable_server_port, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
87
6668
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
88 { ngx_string("bytes_sent"), NULL, ngx_stream_variable_bytes,
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
89 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
90
6668
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
91 { ngx_string("bytes_received"), NULL, ngx_stream_variable_bytes,
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
92 1, 0, 0 },
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
93
6669
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
94 { ngx_string("session_time"), NULL, ngx_stream_variable_session_time,
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
95 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
96
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
97 { ngx_string("status"), NULL, ngx_stream_variable_status,
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
98 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
99
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
100 { ngx_string("connection"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
101 ngx_stream_variable_connection, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
102
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
103 { ngx_string("nginx_version"), NULL, ngx_stream_variable_nginx_version,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
104 0, 0, 0 },
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
105
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
106 { ngx_string("hostname"), NULL, ngx_stream_variable_hostname,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
107 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
108
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
109 { ngx_string("pid"), NULL, ngx_stream_variable_pid,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
110 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
111
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
112 { ngx_string("msec"), NULL, ngx_stream_variable_msec,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
113 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
114
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
115 { ngx_string("time_iso8601"), NULL, ngx_stream_variable_time_iso8601,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
116 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
117
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
118 { ngx_string("time_local"), NULL, ngx_stream_variable_time_local,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
119 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
120
6670
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
121 { ngx_string("protocol"), NULL,
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
122 ngx_stream_variable_protocol, 0, 0, 0 },
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
123
7077
2a288909abc6 Variables: macros for null variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6899
diff changeset
124 ngx_stream_null_variable
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 };
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
127
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 ngx_stream_variable_value_t ngx_stream_variable_null_value =
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 ngx_stream_variable("");
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 ngx_stream_variable_value_t ngx_stream_variable_true_value =
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 ngx_stream_variable("1");
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
134 static ngx_uint_t ngx_stream_variable_depth = 100;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
135
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
136
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 ngx_stream_variable_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 ngx_stream_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
139 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
140 ngx_int_t rc;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
141 ngx_uint_t i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 ngx_hash_key_t *key;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 if (name->len == 0) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 "invalid variable name \"$\"");
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
152 if (flags & NGX_STREAM_VAR_PREFIX) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
153 return ngx_stream_add_prefix_variable(cf, name, flags);
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
154 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
155
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
157
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
158 key = cmcf->variables_keys->keys.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160 if (name->len != key[i].key.len
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161 || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 continue;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
164 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
165
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
166 v = key[i].value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 if (!(v->flags & NGX_STREAM_VAR_CHANGEABLE)) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 "the duplicate \"%V\" variable", name);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173
7226
0b1eb40de6da Improved code readablity.
Ruslan Ermilov <ru@nginx.com>
parents: 7121
diff changeset
174 if (!(flags & NGX_STREAM_VAR_WEAK)) {
0b1eb40de6da Improved code readablity.
Ruslan Ermilov <ru@nginx.com>
parents: 7121
diff changeset
175 v->flags &= ~NGX_STREAM_VAR_WEAK;
0b1eb40de6da Improved code readablity.
Ruslan Ermilov <ru@nginx.com>
parents: 7121
diff changeset
176 }
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
177
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 return v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
179 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
180
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
181 v = ngx_palloc(cf->pool, sizeof(ngx_stream_variable_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
183 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
184 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
185
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
186 v->name.len = name->len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 v->name.data = ngx_pnalloc(cf->pool, name->len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 if (v->name.data == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
189 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
190 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
191
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
192 ngx_strlow(v->name.data, name->data, name->len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
193
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
194 v->set_handler = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195 v->get_handler = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 v->data = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 v->flags = flags;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
198 v->index = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202 if (rc == NGX_ERROR) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 if (rc == NGX_BUSY) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208 "conflicting variable name \"%V\"", name);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
210 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212 return v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
216 static ngx_stream_variable_t *
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
217 ngx_stream_add_prefix_variable(ngx_conf_t *cf, ngx_str_t *name,
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
218 ngx_uint_t flags)
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
219 {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
220 ngx_uint_t i;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
221 ngx_stream_variable_t *v;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
222 ngx_stream_core_main_conf_t *cmcf;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
223
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
224 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
225
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
226 v = cmcf->prefix_variables.elts;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
227 for (i = 0; i < cmcf->prefix_variables.nelts; i++) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
228 if (name->len != v[i].name.len
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
229 || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0)
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
230 {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
231 continue;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
232 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
233
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
234 v = &v[i];
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
235
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
236 if (!(v->flags & NGX_STREAM_VAR_CHANGEABLE)) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
237 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
238 "the duplicate \"%V\" variable", name);
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
239 return NULL;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
240 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
241
7226
0b1eb40de6da Improved code readablity.
Ruslan Ermilov <ru@nginx.com>
parents: 7121
diff changeset
242 if (!(flags & NGX_STREAM_VAR_WEAK)) {
0b1eb40de6da Improved code readablity.
Ruslan Ermilov <ru@nginx.com>
parents: 7121
diff changeset
243 v->flags &= ~NGX_STREAM_VAR_WEAK;
0b1eb40de6da Improved code readablity.
Ruslan Ermilov <ru@nginx.com>
parents: 7121
diff changeset
244 }
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
245
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
246 return v;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
247 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
248
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
249 v = ngx_array_push(&cmcf->prefix_variables);
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
250 if (v == NULL) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
251 return NULL;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
252 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
253
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
254 v->name.len = name->len;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
255 v->name.data = ngx_pnalloc(cf->pool, name->len);
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
256 if (v->name.data == NULL) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
257 return NULL;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
258 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
259
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
260 ngx_strlow(v->name.data, name->data, name->len);
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
261
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
262 v->set_handler = NULL;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
263 v->get_handler = NULL;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
264 v->data = 0;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
265 v->flags = flags;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
266 v->index = 0;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
267
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
268 return v;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
269 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
270
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
271
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273 ngx_stream_get_variable_index(ngx_conf_t *cf, ngx_str_t *name)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275 ngx_uint_t i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
276 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
277 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
278
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
279 if (name->len == 0) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
280 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
281 "invalid variable name \"$\"");
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
282 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
283 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
284
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
286
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 v = cmcf->variables.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
288
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
289 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 if (ngx_array_init(&cmcf->variables, cf->pool, 4,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 sizeof(ngx_stream_variable_t))
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292 != NGX_OK)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
293 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
294 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
295 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
296
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
297 } else {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
298 for (i = 0; i < cmcf->variables.nelts; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299 if (name->len != v[i].name.len
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
301 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
302 continue;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
303 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
304
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
305 return i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
308
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 v = ngx_array_push(&cmcf->variables);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
312 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
313
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314 v->name.len = name->len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 v->name.data = ngx_pnalloc(cf->pool, name->len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 if (v->name.data == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 ngx_strlow(v->name.data, name->data, name->len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
321
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
322 v->set_handler = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 v->get_handler = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324 v->data = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325 v->flags = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 v->index = cmcf->variables.nelts - 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
328 return v->index;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
329 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
330
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 ngx_stream_variable_value_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333 ngx_stream_get_indexed_variable(ngx_stream_session_t *s, ngx_uint_t index)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
335 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
337
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 if (cmcf->variables.nelts <= index) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
341 ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342 "unknown variable index: %ui", index);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
343 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
344 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
345
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 if (s->variables[index].not_found || s->variables[index].valid) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 return &s->variables[index];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
348 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
349
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
350 v = cmcf->variables.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
351
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
352 if (ngx_stream_variable_depth == 0) {
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
353 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
354 "cycle while evaluating variable \"%V\"",
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
355 &v[index].name);
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
356 return NULL;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
357 }
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
358
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
359 ngx_stream_variable_depth--;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
360
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361 if (v[index].get_handler(s, &s->variables[index], v[index].data)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362 == NGX_OK)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 {
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
364 ngx_stream_variable_depth++;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
365
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366 if (v[index].flags & NGX_STREAM_VAR_NOCACHEABLE) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367 s->variables[index].no_cacheable = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
369
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
370 return &s->variables[index];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
371 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
372
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
373 ngx_stream_variable_depth++;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
374
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
375 s->variables[index].valid = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
376 s->variables[index].not_found = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
377
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
378 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
379 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
380
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
381
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
382 ngx_stream_variable_value_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
383 ngx_stream_get_flushed_variable(ngx_stream_session_t *s, ngx_uint_t index)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
384 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
385 ngx_stream_variable_value_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
386
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
387 v = &s->variables[index];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
388
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
389 if (v->valid || v->not_found) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
390 if (!v->no_cacheable) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
391 return v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
392 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
393
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
394 v->valid = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
395 v->not_found = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
396 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
397
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
398 return ngx_stream_get_indexed_variable(s, index);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
399 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
400
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
401
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
402 ngx_stream_variable_value_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
403 ngx_stream_get_variable(ngx_stream_session_t *s, ngx_str_t *name,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
404 ngx_uint_t key)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
405 {
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
406 size_t len;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
407 ngx_uint_t i, n;
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
408 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
409 ngx_stream_variable_value_t *vv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
410 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
411
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
412 cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
413
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
414 v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
415
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
416 if (v) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
417 if (v->flags & NGX_STREAM_VAR_INDEXED) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
418 return ngx_stream_get_flushed_variable(s, v->index);
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
419 }
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
420
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
421 if (ngx_stream_variable_depth == 0) {
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
422 ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
423 "cycle while evaluating variable \"%V\"", name);
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
424 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
425 }
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
426
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
427 ngx_stream_variable_depth--;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
428
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
429 vv = ngx_palloc(s->connection->pool,
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
430 sizeof(ngx_stream_variable_value_t));
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
431
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
432 if (vv && v->get_handler(s, vv, v->data) == NGX_OK) {
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
433 ngx_stream_variable_depth++;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
434 return vv;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
435 }
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
436
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
437 ngx_stream_variable_depth++;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
438 return NULL;
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
439 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
440
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
441 vv = ngx_palloc(s->connection->pool, sizeof(ngx_stream_variable_value_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
442 if (vv == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
443 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
444 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
445
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
446 len = 0;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
447
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
448 v = cmcf->prefix_variables.elts;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
449 n = cmcf->prefix_variables.nelts;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
450
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
451 for (i = 0; i < cmcf->prefix_variables.nelts; i++) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
452 if (name->len >= v[i].name.len && name->len > len
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
453 && ngx_strncmp(name->data, v[i].name.data, v[i].name.len) == 0)
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
454 {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
455 len = v[i].name.len;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
456 n = i;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
457 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
458 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
459
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
460 if (n != cmcf->prefix_variables.nelts) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
461 if (v[n].get_handler(s, vv, (uintptr_t) name) == NGX_OK) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
462 return vv;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
463 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
464
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
465 return NULL;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
466 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
467
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
468 vv->not_found = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
469
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
470 return vv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
471 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
472
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
473
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
474 static ngx_int_t
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
475 ngx_stream_variable_binary_remote_addr(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
476 ngx_stream_variable_value_t *v, uintptr_t data)
7111
Ruslan Ermilov <ru@nginx.com>
parents: 7077
diff changeset
477 {
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
478 struct sockaddr_in *sin;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
479 #if (NGX_HAVE_INET6)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
480 struct sockaddr_in6 *sin6;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
481 #endif
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
482
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
483 switch (s->connection->sockaddr->sa_family) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
484
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
485 #if (NGX_HAVE_INET6)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
486 case AF_INET6:
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
487 sin6 = (struct sockaddr_in6 *) s->connection->sockaddr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
488
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
489 v->len = sizeof(struct in6_addr);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
490 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
491 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
492 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
493 v->data = sin6->sin6_addr.s6_addr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
494
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
495 break;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
496 #endif
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
497
7121
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
498 #if (NGX_HAVE_UNIX_DOMAIN)
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
499 case AF_UNIX:
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
500
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
501 v->len = s->connection->addr_text.len;
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
502 v->valid = 1;
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
503 v->no_cacheable = 0;
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
504 v->not_found = 0;
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
505 v->data = s->connection->addr_text.data;
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
506
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
507 break;
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
508 #endif
924b6ef942bf Fixed handling of unix sockets in $binary_remote_addr.
Maxim Dounin <mdounin@mdounin.ru>
parents: 7111
diff changeset
509
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
510 default: /* AF_INET */
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
511 sin = (struct sockaddr_in *) s->connection->sockaddr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
512
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
513 v->len = sizeof(in_addr_t);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
514 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
515 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
516 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
517 v->data = (u_char *) &sin->sin_addr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
518
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
519 break;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
520 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
521
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
522 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
523 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
524
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
525
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
526 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
527 ngx_stream_variable_remote_addr(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
528 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
529 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
530 v->len = s->connection->addr_text.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
531 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
532 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
533 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
534 v->data = s->connection->addr_text.data;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
535
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
536 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
537 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
538
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
539
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
540 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
541 ngx_stream_variable_remote_port(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
542 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
543 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
544 ngx_uint_t port;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
545
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
546 v->len = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
547 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
548 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
549 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
550
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
551 v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
552 if (v->data == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
553 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
554 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
555
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
556 port = ngx_inet_get_port(s->connection->sockaddr);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
557
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
558 if (port > 0 && port < 65536) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
559 v->len = ngx_sprintf(v->data, "%ui", port) - v->data;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
560 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
561
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
562 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
563 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
564
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
565
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
566 static ngx_int_t
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
567 ngx_stream_variable_proxy_protocol_addr(ngx_stream_session_t *s,
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
568 ngx_stream_variable_value_t *v, uintptr_t data)
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
569 {
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
570 ngx_str_t *addr;
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
571 ngx_proxy_protocol_t *pp;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
572
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
573 pp = s->connection->proxy_protocol;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
574 if (pp == NULL) {
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
575 v->not_found = 1;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
576 return NGX_OK;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
577 }
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
578
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
579 addr = (ngx_str_t *) ((char *) pp + data);
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
580
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
581 v->len = addr->len;
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
582 v->valid = 1;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
583 v->no_cacheable = 0;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
584 v->not_found = 0;
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
585 v->data = addr->data;
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
586
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
587 return NGX_OK;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
588 }
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
589
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
590
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
591 static ngx_int_t
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
592 ngx_stream_variable_proxy_protocol_port(ngx_stream_session_t *s,
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
593 ngx_stream_variable_value_t *v, uintptr_t data)
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
594 {
7590
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
595 ngx_uint_t port;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
596 ngx_proxy_protocol_t *pp;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
597
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
598 pp = s->connection->proxy_protocol;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
599 if (pp == NULL) {
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
600 v->not_found = 1;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
601 return NGX_OK;
06b01840bd42 Core: moved PROXY protocol fields out of ngx_connection_t.
Roman Arutyunyan <arut@nginx.com>
parents: 7226
diff changeset
602 }
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
603
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
604 v->len = 0;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
605 v->valid = 1;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
606 v->no_cacheable = 0;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
607 v->not_found = 0;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
608
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
609 v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1);
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
610 if (v->data == NULL) {
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
611 return NGX_ERROR;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
612 }
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
613
7591
89adf49fe76a Parsing server PROXY protocol address and port (ticket #1206).
Roman Arutyunyan <arut@nginx.com>
parents: 7590
diff changeset
614 port = *(in_port_t *) ((char *) pp + data);
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
615
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
616 if (port > 0 && port < 65536) {
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
617 v->len = ngx_sprintf(v->data, "%ui", port) - v->data;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
618 }
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
619
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
620 return NGX_OK;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
621 }
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
622
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
623
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
624 static ngx_int_t
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
625 ngx_stream_variable_server_addr(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
626 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
627 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
628 ngx_str_t str;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
629 u_char addr[NGX_SOCKADDR_STRLEN];
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
630
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
631 str.len = NGX_SOCKADDR_STRLEN;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
632 str.data = addr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
633
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
634 if (ngx_connection_local_sockaddr(s->connection, &str, 0) != NGX_OK) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
635 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
636 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
637
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
638 str.data = ngx_pnalloc(s->connection->pool, str.len);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
639 if (str.data == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
640 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
641 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
642
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
643 ngx_memcpy(str.data, addr, str.len);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
644
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
645 v->len = str.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
646 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
647 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
648 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
649 v->data = str.data;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
650
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
651 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
652 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
653
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
654
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
655 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
656 ngx_stream_variable_server_port(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
657 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
658 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
659 ngx_uint_t port;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
660
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
661 v->len = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
662 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
663 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
664 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
665
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
666 if (ngx_connection_local_sockaddr(s->connection, NULL, 0) != NGX_OK) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
667 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
668 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
669
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
670 v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
671 if (v->data == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
672 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
673 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
674
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
675 port = ngx_inet_get_port(s->connection->local_sockaddr);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
676
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
677 if (port > 0 && port < 65536) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
678 v->len = ngx_sprintf(v->data, "%ui", port) - v->data;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
679 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
680
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
681 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
682 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
683
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
684
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
685 static ngx_int_t
6668
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
686 ngx_stream_variable_bytes(ngx_stream_session_t *s,
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
687 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
688 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
689 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
690
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
691 p = ngx_pnalloc(s->connection->pool, NGX_OFF_T_LEN);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
692 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
693 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
694 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
695
6668
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
696 if (data == 1) {
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
697 v->len = ngx_sprintf(p, "%O", s->received) - p;
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
698
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
699 } else {
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
700 v->len = ngx_sprintf(p, "%O", s->connection->sent) - p;
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
701 }
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
702
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
703 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
704 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
705 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
706 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
707
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
708 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
709 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
710
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
711
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
712 static ngx_int_t
6669
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
713 ngx_stream_variable_session_time(ngx_stream_session_t *s,
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
714 ngx_stream_variable_value_t *v, uintptr_t data)
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
715 {
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
716 u_char *p;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
717 ngx_time_t *tp;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
718 ngx_msec_int_t ms;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
719
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
720 p = ngx_pnalloc(s->connection->pool, NGX_TIME_T_LEN + 4);
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
721 if (p == NULL) {
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
722 return NGX_ERROR;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
723 }
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
724
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
725 tp = ngx_timeofday();
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
726
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
727 ms = (ngx_msec_int_t)
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
728 ((tp->sec - s->start_sec) * 1000 + (tp->msec - s->start_msec));
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
729 ms = ngx_max(ms, 0);
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
730
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
731 v->len = ngx_sprintf(p, "%T.%03M", (time_t) ms / 1000, ms % 1000) - p;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
732 v->valid = 1;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
733 v->no_cacheable = 0;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
734 v->not_found = 0;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
735 v->data = p;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
736
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
737 return NGX_OK;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
738 }
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
739
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
740
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
741 static ngx_int_t
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
742 ngx_stream_variable_status(ngx_stream_session_t *s,
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
743 ngx_stream_variable_value_t *v, uintptr_t data)
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
744 {
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
745 v->data = ngx_pnalloc(s->connection->pool, NGX_INT_T_LEN);
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
746 if (v->data == NULL) {
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
747 return NGX_ERROR;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
748 }
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
749
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
750 v->len = ngx_sprintf(v->data, "%03ui", s->status) - v->data;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
751 v->valid = 1;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
752 v->no_cacheable = 0;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
753 v->not_found = 0;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
754
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
755 return NGX_OK;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
756 }
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
757
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
758
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
759 static ngx_int_t
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
760 ngx_stream_variable_connection(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
761 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
762 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
763 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
764
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
765 p = ngx_pnalloc(s->connection->pool, NGX_ATOMIC_T_LEN);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
766 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
767 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
768 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
769
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
770 v->len = ngx_sprintf(p, "%uA", s->connection->number) - p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
771 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
772 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
773 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
774 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
775
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
776 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
777 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
778
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
779
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
780 static ngx_int_t
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
781 ngx_stream_variable_nginx_version(ngx_stream_session_t *s,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
782 ngx_stream_variable_value_t *v, uintptr_t data)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
783 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
784 v->len = sizeof(NGINX_VERSION) - 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
785 v->valid = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
786 v->no_cacheable = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
787 v->not_found = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
788 v->data = (u_char *) NGINX_VERSION;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
789
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
790 return NGX_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
791 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
792
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
793
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
794 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
795 ngx_stream_variable_hostname(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
796 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
797 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
798 v->len = ngx_cycle->hostname.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
799 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
800 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
801 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
802 v->data = ngx_cycle->hostname.data;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
803
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
804 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
805 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
806
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
807
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
808 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
809 ngx_stream_variable_pid(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
810 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
811 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
812 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
813
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
814 p = ngx_pnalloc(s->connection->pool, NGX_INT64_LEN);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
815 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
816 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
817 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
818
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
819 v->len = ngx_sprintf(p, "%P", ngx_pid) - p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
820 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
821 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
822 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
823 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
824
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
825 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
826 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
827
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
828
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
829 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
830 ngx_stream_variable_msec(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
831 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
832 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
833 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
834 ngx_time_t *tp;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
835
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
836 p = ngx_pnalloc(s->connection->pool, NGX_TIME_T_LEN + 4);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
837 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
838 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
839 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
840
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
841 tp = ngx_timeofday();
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
842
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
843 v->len = ngx_sprintf(p, "%T.%03M", tp->sec, tp->msec) - p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
844 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
845 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
846 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
847 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
848
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
849 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
850 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
851
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
852
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
853 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
854 ngx_stream_variable_time_iso8601(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
855 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
856 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
857 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
858
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
859 p = ngx_pnalloc(s->connection->pool, ngx_cached_http_log_iso8601.len);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
860 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
861 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
862 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
863
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
864 ngx_memcpy(p, ngx_cached_http_log_iso8601.data,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
865 ngx_cached_http_log_iso8601.len);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
866
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
867 v->len = ngx_cached_http_log_iso8601.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
868 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
869 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
870 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
871 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
872
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
873 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
874 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
875
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
876
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
877 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
878 ngx_stream_variable_time_local(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
879 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
880 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
881 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
882
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
883 p = ngx_pnalloc(s->connection->pool, ngx_cached_http_log_time.len);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
884 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
885 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
886 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
887
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
888 ngx_memcpy(p, ngx_cached_http_log_time.data, ngx_cached_http_log_time.len);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
889
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
890 v->len = ngx_cached_http_log_time.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
891 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
892 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
893 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
894 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
895
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
896 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
897 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
898
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
899
6670
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
900 static ngx_int_t
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
901 ngx_stream_variable_protocol(ngx_stream_session_t *s,
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
902 ngx_stream_variable_value_t *v, uintptr_t data)
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
903 {
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
904 v->len = 3;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
905 v->valid = 1;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
906 v->no_cacheable = 0;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
907 v->not_found = 0;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
908 v->data = (u_char *) (s->connection->type == SOCK_DGRAM ? "UDP" : "TCP");
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
909
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
910 return NGX_OK;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
911 }
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
912
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
913
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
914 void *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
915 ngx_stream_map_find(ngx_stream_session_t *s, ngx_stream_map_t *map,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
916 ngx_str_t *match)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
917 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
918 void *value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
919 u_char *low;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
920 size_t len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
921 ngx_uint_t key;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
922
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
923 len = match->len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
924
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
925 if (len) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
926 low = ngx_pnalloc(s->connection->pool, len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
927 if (low == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
928 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
929 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
930
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
931 } else {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
932 low = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
933 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
934
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
935 key = ngx_hash_strlow(low, match->data, len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
936
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
937 value = ngx_hash_find_combined(&map->hash, key, low, len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
938 if (value) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
939 return value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
940 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
941
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
942 #if (NGX_PCRE)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
943
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
944 if (len && map->nregex) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
945 ngx_int_t n;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
946 ngx_uint_t i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
947 ngx_stream_map_regex_t *reg;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
948
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
949 reg = map->regex;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
950
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
951 for (i = 0; i < map->nregex; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
952
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
953 n = ngx_stream_regex_exec(s, reg[i].regex, match);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
954
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
955 if (n == NGX_OK) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
956 return reg[i].value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
957 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
958
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
959 if (n == NGX_DECLINED) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
960 continue;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
961 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
962
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
963 /* NGX_ERROR */
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
964
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
965 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
966 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
967 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
968
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
969 #endif
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
970
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
971 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
972 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
973
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
974
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
975 #if (NGX_PCRE)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
976
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
977 static ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
978 ngx_stream_variable_not_found(ngx_stream_session_t *s,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
979 ngx_stream_variable_value_t *v, uintptr_t data)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
980 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
981 v->not_found = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
982 return NGX_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
983 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
984
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
985
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
986 ngx_stream_regex_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
987 ngx_stream_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
988 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
989 u_char *p;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
990 size_t size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
991 ngx_str_t name;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
992 ngx_uint_t i, n;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
993 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
994 ngx_stream_regex_t *re;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
995 ngx_stream_regex_variable_t *rv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
996 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
997
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
998 rc->pool = cf->pool;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
999
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1000 if (ngx_regex_compile(rc) != NGX_OK) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1001 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "%V", &rc->err);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1002 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1003 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1004
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1005 re = ngx_pcalloc(cf->pool, sizeof(ngx_stream_regex_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1006 if (re == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1007 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1008 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1009
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1010 re->regex = rc->regex;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1011 re->ncaptures = rc->captures;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1012 re->name = rc->pattern;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1013
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1014 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1015 cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1016
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1017 n = (ngx_uint_t) rc->named_captures;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1018
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1019 if (n == 0) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1020 return re;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1021 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1022
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1023 rv = ngx_palloc(rc->pool, n * sizeof(ngx_stream_regex_variable_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1024 if (rv == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1025 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1026 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1027
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1028 re->variables = rv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1029 re->nvariables = n;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1030
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1031 size = rc->name_size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1032 p = rc->names;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1033
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1034 for (i = 0; i < n; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1035 rv[i].capture = 2 * ((p[0] << 8) + p[1]);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1036
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1037 name.data = &p[2];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1038 name.len = ngx_strlen(name.data);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1039
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1040 v = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1041 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1042 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1043 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1044
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1045 rv[i].index = ngx_stream_get_variable_index(cf, &name);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1046 if (rv[i].index == NGX_ERROR) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1047 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1048 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1049
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1050 v->get_handler = ngx_stream_variable_not_found;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1051
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1052 p += size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1053 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1054
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1055 return re;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1056 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1057
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1058
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1059 ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1060 ngx_stream_regex_exec(ngx_stream_session_t *s, ngx_stream_regex_t *re,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1061 ngx_str_t *str)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1062 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1063 ngx_int_t rc, index;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1064 ngx_uint_t i, n, len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1065 ngx_stream_variable_value_t *vv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1066 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1067
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1068 cmcf = ngx_stream_get_module_main_conf(s, ngx_stream_core_module);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1069
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1070 if (re->ncaptures) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1071 len = cmcf->ncaptures;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1072
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1073 if (s->captures == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1074 s->captures = ngx_palloc(s->connection->pool, len * sizeof(int));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1075 if (s->captures == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1076 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1077 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1078 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1079
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1080 } else {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1081 len = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1082 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1083
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1084 rc = ngx_regex_exec(re->regex, str, s->captures, len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1085
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1086 if (rc == NGX_REGEX_NO_MATCHED) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1087 return NGX_DECLINED;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1088 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1089
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1090 if (rc < 0) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1091 ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1092 ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"",
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1093 rc, str, &re->name);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1094 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1095 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1096
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1097 for (i = 0; i < re->nvariables; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1098
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1099 n = re->variables[i].capture;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1100 index = re->variables[i].index;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1101 vv = &s->variables[index];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1102
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1103 vv->len = s->captures[n + 1] - s->captures[n];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1104 vv->valid = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1105 vv->no_cacheable = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1106 vv->not_found = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1107 vv->data = &str->data[s->captures[n]];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1108
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1109 #if (NGX_DEBUG)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1110 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1111 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1112
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1113 v = cmcf->variables.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1114
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1115 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1116 "stream regex set $%V to \"%v\"", &v[index].name, vv);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1117 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1118 #endif
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1119 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1120
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1121 s->ncaptures = rc * 2;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1122 s->captures_data = str->data;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1123
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1124 return NGX_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1125 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1126
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1127 #endif
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1128
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1129
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1130 ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1131 ngx_stream_variables_add_core_vars(ngx_conf_t *cf)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1132 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1133 ngx_stream_variable_t *cv, *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1134 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1135
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1136 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1137
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1138 cmcf->variables_keys = ngx_pcalloc(cf->temp_pool,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1139 sizeof(ngx_hash_keys_arrays_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1140 if (cmcf->variables_keys == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1141 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1142 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1143
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1144 cmcf->variables_keys->pool = cf->pool;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1145 cmcf->variables_keys->temp_pool = cf->pool;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1146
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1147 if (ngx_hash_keys_array_init(cmcf->variables_keys, NGX_HASH_SMALL)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1148 != NGX_OK)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1149 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1150 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1151 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1152
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1153 if (ngx_array_init(&cmcf->prefix_variables, cf->pool, 8,
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1154 sizeof(ngx_stream_variable_t))
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1155 != NGX_OK)
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1156 {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1157 return NGX_ERROR;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1158 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1159
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1160 for (cv = ngx_stream_core_variables; cv->name.len; cv++) {
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1161 v = ngx_stream_add_variable(cf, &cv->name, cv->flags);
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1162 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1163 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1164 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1165
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1166 *v = *cv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1167 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1168
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1169 return NGX_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1170 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1171
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1172
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1173 ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1174 ngx_stream_variables_init_vars(ngx_conf_t *cf)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1175 {
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1176 size_t len;
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1177 ngx_uint_t i, n;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1178 ngx_hash_key_t *key;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1179 ngx_hash_init_t hash;
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1180 ngx_stream_variable_t *v, *av, *pv;
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1181 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1182
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1183 /* set the handlers for the indexed stream variables */
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1184
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1185 cmcf = ngx_stream_conf_get_module_main_conf(cf, ngx_stream_core_module);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1186
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1187 v = cmcf->variables.elts;
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1188 pv = cmcf->prefix_variables.elts;
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1189 key = cmcf->variables_keys->keys.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1190
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1191 for (i = 0; i < cmcf->variables.nelts; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1192
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1193 for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1194
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1195 av = key[n].value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1196
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1197 if (v[i].name.len == key[n].key.len
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1198 && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1199 == 0)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1200 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1201 v[i].get_handler = av->get_handler;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1202 v[i].data = av->data;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1203
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1204 av->flags |= NGX_STREAM_VAR_INDEXED;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1205 v[i].flags = av->flags;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1206
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1207 av->index = i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1208
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1209 if (av->get_handler == NULL
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1210 || (av->flags & NGX_STREAM_VAR_WEAK))
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1211 {
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1212 break;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1213 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1214
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1215 goto next;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1216 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1217 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1218
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1219 len = 0;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1220 av = NULL;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1221
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1222 for (n = 0; n < cmcf->prefix_variables.nelts; n++) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1223 if (v[i].name.len >= pv[n].name.len && v[i].name.len > len
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1224 && ngx_strncmp(v[i].name.data, pv[n].name.data, pv[n].name.len)
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1225 == 0)
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1226 {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1227 av = &pv[n];
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1228 len = pv[n].name.len;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1229 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1230 }
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1231
6899
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1232 if (av) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1233 v[i].get_handler = av->get_handler;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1234 v[i].data = (uintptr_t) &v[i].name;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1235 v[i].flags = av->flags;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1236
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1237 goto next;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1238 }
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1239
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1240 if (v[i].get_handler == NULL) {
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1241 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1242 "unknown \"%V\" variable", &v[i].name);
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1243 return NGX_ERROR;
d2b2ff157da5 Variables: generic prefix variables.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6851
diff changeset
1244 }
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1245
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1246 next:
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1247 continue;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1248 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1249
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1250
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1251 for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1252 av = key[n].value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1253
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1254 if (av->flags & NGX_STREAM_VAR_NOHASH) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1255 key[n].key.data = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1256 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1257 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1258
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1259
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1260 hash.hash = &cmcf->variables_hash;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1261 hash.key = ngx_hash_key;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1262 hash.max_size = cmcf->variables_hash_max_size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1263 hash.bucket_size = cmcf->variables_hash_bucket_size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1264 hash.name = "variables_hash";
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1265 hash.pool = cf->pool;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1266 hash.temp_pool = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1267
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1268 if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1269 cmcf->variables_keys->keys.nelts)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1270 != NGX_OK)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1271 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1272 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1273 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1274
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1275 cmcf->variables_keys = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1276
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1277 return NGX_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1278 }