annotate src/stream/ngx_stream_variables.c @ 6874:7cc2d3a96ea3

Fixed trailer construction with limit on FreeBSD and macOS. The ngx_chain_coalesce_file() function may produce more bytes to send then requested in the limit passed, as it aligns the last file position to send to memory page boundary. As a result, (limit - send) may become negative. This resulted in big positive number when converted to size_t while calling ngx_output_chain_to_iovec(). Another part of the problem is in ngx_chain_coalesce_file(): it changes cl to the next chain link even if the current buffer is only partially sent due to limit. Therefore, if a file buffer was not expected to be fully sent due to limit, and was followed by a memory buffer, nginx called sendfile() with a part of the file buffer, and the memory buffer in trailer. If there were enough room in the socket buffer, this resulted in a part of the file buffer being skipped, and corresponding part of the memory buffer sent instead. The bug was introduced in 8e903522c17a (1.7.8). Configurations affected are ones using limits, that is, limit_rate and/or sendfile_max_chunk, and memory buffers after file ones (may happen when using subrequests or with proxying with disk buffering). Fix is to explicitly check if (send < limit) before constructing trailer with ngx_output_chain_to_iovec(). Additionally, ngx_chain_coalesce_file() was modified to preserve unfinished file buffers in cl.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 20 Jan 2017 21:12:48 +0300
parents 8cd97c14b0e2
children d2b2ff157da5
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
13
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
14 static ngx_int_t ngx_stream_variable_binary_remote_addr(
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
15 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
16 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
17 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_port(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);
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
20 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
21 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
22 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
23 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
24 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
25 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
26 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
27 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
28 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
29 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
30 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
31 ngx_stream_variable_value_t *v, uintptr_t data);
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
32 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
33 ngx_stream_variable_value_t *v, uintptr_t data);
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
34 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
35 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
36
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
37 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
38 ngx_stream_variable_value_t *v, uintptr_t data);
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
39 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
40 ngx_stream_variable_value_t *v, uintptr_t data);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
41 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
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_msec(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_time_iso8601(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_local(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);
6670
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
49 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
50 ngx_stream_variable_value_t *v, uintptr_t data);
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
51
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
52
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
53 static ngx_stream_variable_t ngx_stream_core_variables[] = {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
54
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
55 { ngx_string("binary_remote_addr"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
56 ngx_stream_variable_binary_remote_addr, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
57
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
58 { ngx_string("remote_addr"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
59 ngx_stream_variable_remote_addr, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
60
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
61 { ngx_string("remote_port"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
62 ngx_stream_variable_remote_port, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
63
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
64 { ngx_string("proxy_protocol_addr"), NULL,
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
65 ngx_stream_variable_proxy_protocol_addr, 0, 0, 0 },
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
66
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
67 { ngx_string("proxy_protocol_port"), NULL,
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
68 ngx_stream_variable_proxy_protocol_port, 0, 0, 0 },
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
69
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
70 { ngx_string("server_addr"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
71 ngx_stream_variable_server_addr, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
72
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
73 { ngx_string("server_port"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
74 ngx_stream_variable_server_port, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
75
6668
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
76 { ngx_string("bytes_sent"), NULL, ngx_stream_variable_bytes,
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
77 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
78
6668
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
79 { ngx_string("bytes_received"), NULL, ngx_stream_variable_bytes,
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
80 1, 0, 0 },
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
81
6669
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
82 { 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
83 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
84
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
85 { ngx_string("status"), NULL, ngx_stream_variable_status,
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
86 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
87
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
88 { ngx_string("connection"), NULL,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
89 ngx_stream_variable_connection, 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
90
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
91 { ngx_string("nginx_version"), NULL, ngx_stream_variable_nginx_version,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
92 0, 0, 0 },
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
93
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
94 { ngx_string("hostname"), NULL, ngx_stream_variable_hostname,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
95 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
96
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
97 { ngx_string("pid"), NULL, ngx_stream_variable_pid,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
98 0, 0, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
99
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
100 { ngx_string("msec"), NULL, ngx_stream_variable_msec,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
101 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
102
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
103 { ngx_string("time_iso8601"), NULL, ngx_stream_variable_time_iso8601,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
104 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
105
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
106 { ngx_string("time_local"), NULL, ngx_stream_variable_time_local,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
107 0, NGX_STREAM_VAR_NOCACHEABLE, 0 },
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
108
6670
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
109 { ngx_string("protocol"), NULL,
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
110 ngx_stream_variable_protocol, 0, 0, 0 },
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
111
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
112 { ngx_null_string, NULL, NULL, 0, 0, 0 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
113 };
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
114
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
115
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
116 ngx_stream_variable_value_t ngx_stream_variable_null_value =
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
117 ngx_stream_variable("");
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
118 ngx_stream_variable_value_t ngx_stream_variable_true_value =
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
119 ngx_stream_variable("1");
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
120
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
121
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
122 static ngx_uint_t ngx_stream_variable_depth = 100;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
123
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
124
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
125 ngx_stream_variable_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
126 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
127 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
128 ngx_int_t rc;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
129 ngx_uint_t i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
130 ngx_hash_key_t *key;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
131 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
132 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
133
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
134 if (name->len == 0) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
135 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
136 "invalid variable name \"$\"");
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
137 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
138 }
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 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
141
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
142 key = cmcf->variables_keys->keys.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
143 for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
144 if (name->len != key[i].key.len
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
145 || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
146 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
147 continue;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
148 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
149
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
150 v = key[i].value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
151
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
152 if (!(v->flags & NGX_STREAM_VAR_CHANGEABLE)) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
153 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
154 "the duplicate \"%V\" variable", name);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
155 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
156 }
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 return v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
159 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
160
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
161 v = ngx_palloc(cf->pool, sizeof(ngx_stream_variable_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
162 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
163 return NULL;
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->name.len = name->len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
167 v->name.data = ngx_pnalloc(cf->pool, name->len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
168 if (v->name.data == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
169 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
170 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
171
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
172 ngx_strlow(v->name.data, name->data, name->len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
173
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
174 v->set_handler = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
175 v->get_handler = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
176 v->data = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
177 v->flags = flags;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
178 v->index = 0;
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 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
181
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
182 if (rc == NGX_ERROR) {
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 if (rc == NGX_BUSY) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
187 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
188 "conflicting variable name \"%V\"", name);
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 return v;
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
195
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
196 ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
197 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
198 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
199 ngx_uint_t i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
200 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
201 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
202
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
203 if (name->len == 0) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
204 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
205 "invalid variable name \"$\"");
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
206 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
207 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
208
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
209 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
210
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
211 v = cmcf->variables.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
212
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
213 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
214 if (ngx_array_init(&cmcf->variables, cf->pool, 4,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
215 sizeof(ngx_stream_variable_t))
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
216 != NGX_OK)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
217 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
218 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
219 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
220
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
221 } else {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
222 for (i = 0; i < cmcf->variables.nelts; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
223 if (name->len != v[i].name.len
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
224 || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
225 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
226 continue;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
227 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
228
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
229 return i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
230 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
231 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
232
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
233 v = ngx_array_push(&cmcf->variables);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
234 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
235 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
236 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
237
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
238 v->name.len = name->len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
239 v->name.data = ngx_pnalloc(cf->pool, name->len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
240 if (v->name.data == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
241 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
242 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
243
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
244 ngx_strlow(v->name.data, name->data, name->len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
245
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
246 v->set_handler = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
247 v->get_handler = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
248 v->data = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
249 v->flags = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
250 v->index = cmcf->variables.nelts - 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
251
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
252 return v->index;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
253 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
254
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
255
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
256 ngx_stream_variable_value_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
257 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
258 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
259 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
260 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
261
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
262 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
263
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
264 if (cmcf->variables.nelts <= index) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
265 ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
266 "unknown variable index: %ui", index);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
267 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
268 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
269
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
270 if (s->variables[index].not_found || s->variables[index].valid) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
271 return &s->variables[index];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
272 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
273
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
274 v = cmcf->variables.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
275
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
276 if (ngx_stream_variable_depth == 0) {
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
277 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
278 "cycle while evaluating variable \"%V\"",
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
279 &v[index].name);
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
280 return NULL;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
281 }
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
282
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
283 ngx_stream_variable_depth--;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
284
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
285 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
286 == NGX_OK)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
287 {
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
288 ngx_stream_variable_depth++;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
289
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
290 if (v[index].flags & NGX_STREAM_VAR_NOCACHEABLE) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
291 s->variables[index].no_cacheable = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
292 }
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 &s->variables[index];
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
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
297 ngx_stream_variable_depth++;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
298
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
299 s->variables[index].valid = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
300 s->variables[index].not_found = 1;
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 return NULL;
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
306 ngx_stream_variable_value_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
307 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
308 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
309 ngx_stream_variable_value_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
310
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
311 v = &s->variables[index];
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 if (v->valid || v->not_found) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
314 if (!v->no_cacheable) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
315 return v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
316 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
317
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
318 v->valid = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
319 v->not_found = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
320 }
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 return ngx_stream_get_indexed_variable(s, index);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
323 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
324
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
325
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
326 ngx_stream_variable_value_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
327 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
328 ngx_uint_t key)
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 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
331 ngx_stream_variable_value_t *vv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
332 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
333
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
334 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
335
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
336 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
337
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
338 if (v) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
339 if (v->flags & NGX_STREAM_VAR_INDEXED) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
340 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
341 }
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
342
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
343 if (ngx_stream_variable_depth == 0) {
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
344 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
345 "cycle while evaluating variable \"%V\"", name);
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
346 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
347 }
6851
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
348
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
349 ngx_stream_variable_depth--;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
350
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
351 vv = ngx_palloc(s->connection->pool,
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
352 sizeof(ngx_stream_variable_value_t));
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
353
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
354 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
355 ngx_stream_variable_depth++;
8cd97c14b0e2 Limited recursion when evaluating variables.
Ruslan Ermilov <ru@nginx.com>
parents: 6681
diff changeset
356 return vv;
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 return NULL;
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
361 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
362
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
363 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
364 if (vv == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
365 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
366 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
367
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
368 vv->not_found = 1;
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 vv;
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
373
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
374 static ngx_int_t
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
375 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
376 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
377 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
378 struct sockaddr_in *sin;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
379 #if (NGX_HAVE_INET6)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
380 struct sockaddr_in6 *sin6;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
381 #endif
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
382
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
383 switch (s->connection->sockaddr->sa_family) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
384
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
385 #if (NGX_HAVE_INET6)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
386 case AF_INET6:
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
387 sin6 = (struct sockaddr_in6 *) s->connection->sockaddr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
388
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
389 v->len = sizeof(struct in6_addr);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
390 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
391 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
392 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
393 v->data = sin6->sin6_addr.s6_addr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
394
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
395 break;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
396 #endif
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
397
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
398 default: /* AF_INET */
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
399 sin = (struct sockaddr_in *) s->connection->sockaddr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
400
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
401 v->len = sizeof(in_addr_t);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
402 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
403 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
404 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
405 v->data = (u_char *) &sin->sin_addr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
406
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
407 break;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
408 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
409
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
410 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
411 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
412
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
413
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
414 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
415 ngx_stream_variable_remote_addr(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
416 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
417 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
418 v->len = s->connection->addr_text.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
419 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
420 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
421 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
422 v->data = s->connection->addr_text.data;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
423
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
424 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
425 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
426
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
427
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
428 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
429 ngx_stream_variable_remote_port(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
430 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
431 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
432 ngx_uint_t port;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
433
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
434 v->len = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
435 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
436 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
437 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
438
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
439 v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
440 if (v->data == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
441 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
442 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
443
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
444 port = ngx_inet_get_port(s->connection->sockaddr);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
445
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
446 if (port > 0 && port < 65536) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
447 v->len = ngx_sprintf(v->data, "%ui", port) - v->data;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
448 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
449
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
450 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
451 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
452
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
453
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
454 static ngx_int_t
6681
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
455 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
456 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
457 {
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
458 v->len = s->connection->proxy_protocol_addr.len;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
459 v->valid = 1;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
460 v->no_cacheable = 0;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
461 v->not_found = 0;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
462 v->data = s->connection->proxy_protocol_addr.data;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
463
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
464 return NGX_OK;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
465 }
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
466
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
467
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
468 static ngx_int_t
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
469 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
470 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
471 {
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
472 ngx_uint_t port;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
473
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
474 v->len = 0;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
475 v->valid = 1;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
476 v->no_cacheable = 0;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
477 v->not_found = 0;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
478
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
479 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
480 if (v->data == NULL) {
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
481 return NGX_ERROR;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
482 }
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
483
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
484 port = s->connection->proxy_protocol_port;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
485
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
486 if (port > 0 && port < 65536) {
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
487 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
488 }
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
489
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
490 return NGX_OK;
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
491 }
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
492
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
493
b9f78a4e3597 Stream: $proxy_protocol_addr and $proxy_protocol_port.
Dmitry Volyntsev <xeioex@nginx.com>
parents: 6674
diff changeset
494 static ngx_int_t
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
495 ngx_stream_variable_server_addr(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
496 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
497 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
498 ngx_str_t str;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
499 u_char addr[NGX_SOCKADDR_STRLEN];
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
500
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
501 str.len = NGX_SOCKADDR_STRLEN;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
502 str.data = addr;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
503
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
504 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
505 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
506 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
507
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
508 str.data = ngx_pnalloc(s->connection->pool, str.len);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
509 if (str.data == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
510 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
511 }
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 ngx_memcpy(str.data, addr, str.len);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
514
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
515 v->len = str.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
516 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
517 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
518 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
519 v->data = str.data;
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 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
522 }
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 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
526 ngx_stream_variable_server_port(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
527 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
528 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
529 ngx_uint_t port;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
530
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
531 v->len = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
532 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
533 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
534 v->not_found = 0;
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 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
537 return NGX_ERROR;
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 v->data = ngx_pnalloc(s->connection->pool, sizeof("65535") - 1);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
541 if (v->data == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
542 return NGX_ERROR;
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
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
545 port = ngx_inet_get_port(s->connection->local_sockaddr);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
546
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
547 if (port > 0 && port < 65536) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
548 v->len = ngx_sprintf(v->data, "%ui", port) - v->data;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
549 }
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 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
552 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
553
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 static ngx_int_t
6668
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
556 ngx_stream_variable_bytes(ngx_stream_session_t *s,
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
557 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
558 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
559 u_char *p;
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 p = ngx_pnalloc(s->connection->pool, NGX_OFF_T_LEN);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
562 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
563 return NGX_ERROR;
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
6668
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
566 if (data == 1) {
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
567 v->len = ngx_sprintf(p, "%O", s->received) - p;
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
568
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
569 } else {
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
570 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
571 }
5e2821c2de46 Stream: the $bytes_received variable.
Vladimir Homutov <vl@nginx.com>
parents: 6608
diff changeset
572
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
573 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
574 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
575 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
576 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
577
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
578 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
579 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
580
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
581
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
582 static ngx_int_t
6669
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
583 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
584 ngx_stream_variable_value_t *v, uintptr_t data)
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
585 {
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
586 u_char *p;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
587 ngx_time_t *tp;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
588 ngx_msec_int_t ms;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
589
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
590 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
591 if (p == NULL) {
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
592 return NGX_ERROR;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
593 }
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
594
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
595 tp = ngx_timeofday();
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
596
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
597 ms = (ngx_msec_int_t)
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
598 ((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
599 ms = ngx_max(ms, 0);
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
600
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
601 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
602 v->valid = 1;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
603 v->no_cacheable = 0;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
604 v->not_found = 0;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
605 v->data = p;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
606
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
607 return NGX_OK;
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
608 }
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
609
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
610
164a0824ce20 Stream: the $session_time variable.
Vladimir Homutov <vl@nginx.com>
parents: 6668
diff changeset
611 static ngx_int_t
6674
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
612 ngx_stream_variable_status(ngx_stream_session_t *s,
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
613 ngx_stream_variable_value_t *v, uintptr_t data)
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
614 {
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
615 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
616 if (v->data == NULL) {
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
617 return NGX_ERROR;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
618 }
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
619
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
620 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
621 v->valid = 1;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
622 v->no_cacheable = 0;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
623 v->not_found = 0;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
624
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
625 return NGX_OK;
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
626 }
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
627
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
628
38143d1abdec Stream: the $status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 6670
diff changeset
629 static ngx_int_t
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
630 ngx_stream_variable_connection(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
631 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
632 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
633 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
634
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
635 p = ngx_pnalloc(s->connection->pool, NGX_ATOMIC_T_LEN);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
636 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
637 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
638 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
639
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
640 v->len = ngx_sprintf(p, "%uA", s->connection->number) - p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
641 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
642 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
643 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
644 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
645
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
646 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
647 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
648
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
649
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
650 static ngx_int_t
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
651 ngx_stream_variable_nginx_version(ngx_stream_session_t *s,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
652 ngx_stream_variable_value_t *v, uintptr_t data)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
653 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
654 v->len = sizeof(NGINX_VERSION) - 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
655 v->valid = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
656 v->no_cacheable = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
657 v->not_found = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
658 v->data = (u_char *) NGINX_VERSION;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
659
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
660 return NGX_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
661 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
662
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
663
6608
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
664 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
665 ngx_stream_variable_hostname(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
666 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
667 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
668 v->len = ngx_cycle->hostname.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
669 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
670 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
671 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
672 v->data = ngx_cycle->hostname.data;
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 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
675 }
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
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
678 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
679 ngx_stream_variable_pid(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
680 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
681 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
682 u_char *p;
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 p = ngx_pnalloc(s->connection->pool, NGX_INT64_LEN);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
685 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
686 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
687 }
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 v->len = ngx_sprintf(p, "%P", ngx_pid) - p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
690 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
691 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
692 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
693 v->data = p;
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 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
696 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
697
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
698
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
699 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
700 ngx_stream_variable_msec(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
701 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
702 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
703 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
704 ngx_time_t *tp;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
705
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
706 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
707 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
708 return NGX_ERROR;
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 tp = ngx_timeofday();
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
712
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
713 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
714 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
715 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
716 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
717 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
718
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
719 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
720 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
721
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
722
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
723 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
724 ngx_stream_variable_time_iso8601(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
725 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
726 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
727 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
728
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
729 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
730 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
731 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
732 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
733
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
734 ngx_memcpy(p, ngx_cached_http_log_iso8601.data,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
735 ngx_cached_http_log_iso8601.len);
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
736
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
737 v->len = ngx_cached_http_log_iso8601.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
738 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
739 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
740 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
741 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
742
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
743 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
744 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
745
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
746
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
747 static ngx_int_t
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
748 ngx_stream_variable_time_local(ngx_stream_session_t *s,
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
749 ngx_stream_variable_value_t *v, uintptr_t data)
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
750 {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
751 u_char *p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
752
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
753 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
754 if (p == NULL) {
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
755 return NGX_ERROR;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
756 }
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
757
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
758 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
759
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
760 v->len = ngx_cached_http_log_time.len;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
761 v->valid = 1;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
762 v->no_cacheable = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
763 v->not_found = 0;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
764 v->data = p;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
765
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
766 return NGX_OK;
eb4293155e87 Stream: core module variables.
Vladimir Homutov <vl@nginx.com>
parents: 6607
diff changeset
767 }
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
6670
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
770 static ngx_int_t
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
771 ngx_stream_variable_protocol(ngx_stream_session_t *s,
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
772 ngx_stream_variable_value_t *v, uintptr_t data)
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
773 {
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
774 v->len = 3;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
775 v->valid = 1;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
776 v->no_cacheable = 0;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
777 v->not_found = 0;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
778 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
779
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
780 return NGX_OK;
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
781 }
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
782
c6372a40c2a7 Stream: the $protocol variable.
Vladimir Homutov <vl@nginx.com>
parents: 6669
diff changeset
783
6607
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
784 void *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
785 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
786 ngx_str_t *match)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
787 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
788 void *value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
789 u_char *low;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
790 size_t len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
791 ngx_uint_t key;
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 len = match->len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
794
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
795 if (len) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
796 low = ngx_pnalloc(s->connection->pool, len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
797 if (low == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
798 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
799 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
800
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
801 } else {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
802 low = NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
803 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
804
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
805 key = ngx_hash_strlow(low, match->data, len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
806
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
807 value = ngx_hash_find_combined(&map->hash, key, low, len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
808 if (value) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
809 return value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
810 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
811
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
812 #if (NGX_PCRE)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
813
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
814 if (len && map->nregex) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
815 ngx_int_t n;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
816 ngx_uint_t i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
817 ngx_stream_map_regex_t *reg;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
818
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
819 reg = map->regex;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
820
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
821 for (i = 0; i < map->nregex; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
822
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
823 n = ngx_stream_regex_exec(s, reg[i].regex, match);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
824
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
825 if (n == NGX_OK) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
826 return reg[i].value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
827 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
828
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
829 if (n == NGX_DECLINED) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
830 continue;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
831 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
832
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
833 /* NGX_ERROR */
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
834
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
835 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
836 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
837 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
838
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
839 #endif
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
840
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
841 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
842 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
843
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
844
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
845 #if (NGX_PCRE)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
846
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
847 static ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
848 ngx_stream_variable_not_found(ngx_stream_session_t *s,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
849 ngx_stream_variable_value_t *v, uintptr_t data)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
850 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
851 v->not_found = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
852 return NGX_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
853 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
854
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
855
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
856 ngx_stream_regex_t *
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
857 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
858 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
859 u_char *p;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
860 size_t size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
861 ngx_str_t name;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
862 ngx_uint_t i, n;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
863 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
864 ngx_stream_regex_t *re;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
865 ngx_stream_regex_variable_t *rv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
866 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
867
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
868 rc->pool = cf->pool;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
869
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
870 if (ngx_regex_compile(rc) != NGX_OK) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
871 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
872 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
873 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
874
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
875 re = ngx_pcalloc(cf->pool, sizeof(ngx_stream_regex_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
876 if (re == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
877 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
878 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
879
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
880 re->regex = rc->regex;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
881 re->ncaptures = rc->captures;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
882 re->name = rc->pattern;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
883
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
884 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
885 cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
886
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
887 n = (ngx_uint_t) rc->named_captures;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
888
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
889 if (n == 0) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
890 return re;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
891 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
892
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
893 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
894 if (rv == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
895 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
896 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
897
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
898 re->variables = rv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
899 re->nvariables = n;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
900
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
901 size = rc->name_size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
902 p = rc->names;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
903
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
904 for (i = 0; i < n; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
905 rv[i].capture = 2 * ((p[0] << 8) + p[1]);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
906
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
907 name.data = &p[2];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
908 name.len = ngx_strlen(name.data);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
909
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
910 v = ngx_stream_add_variable(cf, &name, NGX_STREAM_VAR_CHANGEABLE);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
911 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
912 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
913 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
914
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
915 rv[i].index = ngx_stream_get_variable_index(cf, &name);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
916 if (rv[i].index == NGX_ERROR) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
917 return NULL;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
918 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
919
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
920 v->get_handler = ngx_stream_variable_not_found;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
921
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
922 p += size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
923 }
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 return re;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
926 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
927
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
928
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
929 ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
930 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
931 ngx_str_t *str)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
932 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
933 ngx_int_t rc, index;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
934 ngx_uint_t i, n, len;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
935 ngx_stream_variable_value_t *vv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
936 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
937
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
938 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
939
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
940 if (re->ncaptures) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
941 len = cmcf->ncaptures;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
942
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
943 if (s->captures == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
944 s->captures = ngx_palloc(s->connection->pool, len * sizeof(int));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
945 if (s->captures == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
946 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
947 }
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
950 } else {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
951 len = 0;
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
954 rc = ngx_regex_exec(re->regex, str, s->captures, len);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
955
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
956 if (rc == NGX_REGEX_NO_MATCHED) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
957 return NGX_DECLINED;
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
960 if (rc < 0) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
961 ngx_log_error(NGX_LOG_ALERT, s->connection->log, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
962 ngx_regex_exec_n " failed: %i on \"%V\" using \"%V\"",
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
963 rc, str, &re->name);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
964 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
965 }
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 for (i = 0; i < re->nvariables; i++) {
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 n = re->variables[i].capture;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
970 index = re->variables[i].index;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
971 vv = &s->variables[index];
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 vv->len = s->captures[n + 1] - s->captures[n];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
974 vv->valid = 1;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
975 vv->no_cacheable = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
976 vv->not_found = 0;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
977 vv->data = &str->data[s->captures[n]];
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
978
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
979 #if (NGX_DEBUG)
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 ngx_stream_variable_t *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
982
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
983 v = cmcf->variables.elts;
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 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
986 "stream regex set $%V to \"%v\"", &v[index].name, vv);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
987 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
988 #endif
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
989 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
990
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
991 s->ncaptures = rc * 2;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
992 s->captures_data = str->data;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
993
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
994 return NGX_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
995 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
996
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
997 #endif
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
998
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 ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1001 ngx_stream_variables_add_core_vars(ngx_conf_t *cf)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1002 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1003 ngx_int_t rc;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1004 ngx_stream_variable_t *cv, *v;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1005 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1006
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1007 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
1008
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1009 cmcf->variables_keys = ngx_pcalloc(cf->temp_pool,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1010 sizeof(ngx_hash_keys_arrays_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1011 if (cmcf->variables_keys == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1012 return NGX_ERROR;
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1015 cmcf->variables_keys->pool = cf->pool;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1016 cmcf->variables_keys->temp_pool = cf->pool;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1017
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1018 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
1019 != NGX_OK)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1020 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1021 return NGX_ERROR;
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1024 for (cv = ngx_stream_core_variables; cv->name.len; cv++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1025 v = ngx_palloc(cf->pool, sizeof(ngx_stream_variable_t));
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1026 if (v == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1027 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1028 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1029
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1030 *v = *cv;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1031
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1032 rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1033 NGX_HASH_READONLY_KEY);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1034
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1035 if (rc == NGX_OK) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1036 continue;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1037 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1038
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1039 if (rc == NGX_BUSY) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1040 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1041 "conflicting variable name \"%V\"", &v->name);
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1042 }
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 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1045 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1046
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1047 return NGX_OK;
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1051 ngx_int_t
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1052 ngx_stream_variables_init_vars(ngx_conf_t *cf)
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 ngx_uint_t i, n;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1055 ngx_hash_key_t *key;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1056 ngx_hash_init_t hash;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1057 ngx_stream_variable_t *v, *av;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1058 ngx_stream_core_main_conf_t *cmcf;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1059
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1060 /* set the handlers for the indexed stream variables */
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1061
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1062 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
1063
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1064 v = cmcf->variables.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1065 key = cmcf->variables_keys->keys.elts;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1066
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1067 for (i = 0; i < cmcf->variables.nelts; i++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1068
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1069 for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1070
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1071 av = key[n].value;
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 (v[i].name.len == key[n].key.len
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1074 && 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
1075 == 0)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1076 {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1077 v[i].get_handler = av->get_handler;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1078 v[i].data = av->data;
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 av->flags |= NGX_STREAM_VAR_INDEXED;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1081 v[i].flags = av->flags;
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 av->index = i;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1084
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1085 if (av->get_handler == NULL) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1086 break;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1087 }
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 goto next;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1090 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1091 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1092
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1093 ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1094 "unknown \"%V\" variable", &v[i].name);
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 return NGX_ERROR;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1097
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1098 next:
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1099 continue;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1100 }
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1101
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 for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1104 av = key[n].value;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1105
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1106 if (av->flags & NGX_STREAM_VAR_NOHASH) {
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1107 key[n].key.data = NULL;
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 }
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
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1112 hash.hash = &cmcf->variables_hash;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1113 hash.key = ngx_hash_key;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1114 hash.max_size = cmcf->variables_hash_max_size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1115 hash.bucket_size = cmcf->variables_hash_bucket_size;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1116 hash.name = "variables_hash";
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1117 hash.pool = cf->pool;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1118 hash.temp_pool = NULL;
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 if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts,
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1121 cmcf->variables_keys->keys.nelts)
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1122 != NGX_OK)
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_ERROR;
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 cmcf->variables_keys = NULL;
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 return NGX_OK;
c70b7f4537e1 Stream: variables and script.
Vladimir Homutov <vl@nginx.com>
parents:
diff changeset
1130 }