Mercurial > hg > nginx-site
comparison xml/ru/docs/stream/ngx_stream_js_module.xml @ 2237:5268c13196f2
Documented njs changes triggered by njs-0.2.4.
author | Yaroslav Zhuravlev <yar@nginx.com> |
---|---|
date | Thu, 13 Sep 2018 21:10:42 +0300 |
parents | dfc49994218c |
children | 467aef18bf12 |
comparison
equal
deleted
inserted
replaced
2236:9f0f4f5c1a30 | 2237:5268c13196f2 |
---|---|
7 <!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> | 7 <!DOCTYPE module SYSTEM "../../../../dtd/module.dtd"> |
8 | 8 |
9 <module name="Модуль ngx_stream_js_module" | 9 <module name="Модуль ngx_stream_js_module" |
10 link="/ru/docs/stream/ngx_stream_js_module.html" | 10 link="/ru/docs/stream/ngx_stream_js_module.html" |
11 lang="ru" | 11 lang="ru" |
12 rev="12"> | 12 rev="13"> |
13 | 13 |
14 <section id="summary"> | 14 <section id="summary"> |
15 | 15 |
16 <para> | 16 <para> |
17 Модуль <literal>ngx_stream_js_module</literal> позволяет задавать | 17 Модуль <literal>ngx_stream_js_module</literal> позволяет задавать |
29 | 29 |
30 | 30 |
31 <section id="example" name="Пример конфигурации"> | 31 <section id="example" name="Пример конфигурации"> |
32 | 32 |
33 <para> | 33 <para> |
34 <note> | |
35 Данный пример необходимо использовать с | |
36 версией njs <link doc="../njs_changes.xml" id="njs-0.2.4">0.2.4</link>. | |
37 Для версий njs <link doc="../njs_changes.xml" id="njs-0.2.3">0.2.3</link> | |
38 и ранее необходимо использовать | |
39 <link doc="../njs_api.xml" id="example_legacy">этот</link> пример. | |
40 </note> | |
34 <example> | 41 <example> |
35 load_module modules/ngx_stream_js_module.so; | 42 load_module modules/ngx_stream_js_module.so; |
36 ... | 43 ... |
37 | 44 |
38 stream { | 45 stream { |
39 js_include stream.js; | 46 js_include stream.js; |
40 | 47 |
41 js_set $foo foo; | |
42 js_set $bar bar; | 48 js_set $bar bar; |
49 js_set $req_line req_line; | |
43 | 50 |
44 server { | 51 server { |
45 listen 12345; | 52 listen 12345; |
46 | 53 |
47 js_preread qux; | 54 js_preread preread; |
48 return $foo; | 55 return $req_line; |
49 } | 56 } |
50 | 57 |
51 server { | 58 server { |
52 listen 12346; | 59 listen 12346; |
53 | 60 |
54 js_access xyz; | 61 js_access access; |
55 proxy_pass 127.0.0.1:8000; | 62 proxy_pass 127.0.0.1:8000; |
56 js_filter baz; | 63 js_filter header_inject; |
57 } | 64 } |
58 } | 65 } |
59 | 66 |
60 http { | 67 http { |
61 server { | 68 server { |
69 </para> | 76 </para> |
70 | 77 |
71 <para> | 78 <para> |
72 Файл <path>stream.js</path>: | 79 Файл <path>stream.js</path>: |
73 <example> | 80 <example> |
74 var req = ''; | |
75 var matched = 0; | |
76 var line = ''; | 81 var line = ''; |
77 | |
78 function qux(s) { | |
79 var n = s.buffer.indexOf('\n'); | |
80 if (n == -1) { | |
81 return s.AGAIN; | |
82 } | |
83 | |
84 line = s.buffer.substr(0, n); | |
85 } | |
86 | |
87 function foo(s) { | |
88 return line; | |
89 } | |
90 | 82 |
91 function bar(s) { | 83 function bar(s) { |
92 var v = s.variables; | 84 var v = s.variables; |
93 s.log("hello from bar() handler!"); | 85 s.log("hello from bar() handler!"); |
94 return "foo-var" + v.remote_port + "; pid=" + v.pid; | 86 return "bar-var" + v.remote_port + "; pid=" + v.pid; |
95 } | 87 } |
96 | 88 |
97 // Фильтр обрабатывает один буфер за вызов. | 89 function preread(s) { |
98 // Буфер недоступен в s.buffer для | 90 s.on('upload', function (data, flags) { |
99 // чтения и записи. Вызывается в обоих направлениях. | 91 var n = data.indexOf('\n'); |
100 | 92 if (n != -1) { |
101 function baz(s) { | 93 line = data.substr(0, n); |
102 if (s.fromUpstream || matched) { | 94 s.done(); |
95 } | |
96 }); | |
97 } | |
98 | |
99 function req_line(s) { | |
100 return line; | |
101 } | |
102 | |
103 // Чтение строки HTTP-запроса. | |
104 // Получение байт в 'req' до того как | |
105 // будет прочитана строка запроса. | |
106 // Добавление HTTP-заголовка в запрос клиента | |
107 | |
108 function access(s) { | |
109 if (s.remoteAddress.match('^192.*')) { | |
110 s.abort(); | |
103 return; | 111 return; |
104 } | 112 } |
105 | 113 |
106 // Отключение определённых адресов. | 114 s.allow(); |
107 | |
108 if (s.remoteAddress.match('^192.*')) { | |
109 return s.ERROR; | |
110 } | |
111 | |
112 // Чтение строки HTTP-запроса. | |
113 // Получение байт в 'req' до того как | |
114 // будет прочитана строка запроса. Очистка текущего буфера | |
115 // для отключения вывода. | |
116 | |
117 req = req + s.buffer; | |
118 s.buffer = ''; | |
119 | |
120 var n = req.search('\n'); | |
121 | |
122 if (n != -1) { | |
123 // Вставка нового HTTP-заголовка. | |
124 var rest = req.substr(n + 1); | |
125 req = req.substr(0, n + 1); | |
126 | |
127 var addr = s.remoteAddress; | |
128 | |
129 s.log('req:' + req); | |
130 s.log('rest:' + rest); | |
131 | |
132 // Вывод результата и пропуск дальнейшей | |
133 // обработки. | |
134 | |
135 s.buffer = req + 'Foo: addr_' + addr + '\r\n' + rest; | |
136 matched = 1; | |
137 } | |
138 } | |
139 | |
140 function xyz(s) { | |
141 if (s.remoteAddress.match('^192.*')) { | |
142 return s.ABORT; | |
143 } | |
144 } | 115 } |
145 </example> | 116 </example> |
146 </para> | 117 </para> |
147 | 118 |
148 </section> | 119 </section> |