Mercurial > hg > nginx-site
comparison xml/en/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="Module ngx_stream_js_module" | 9 <module name="Module ngx_stream_js_module" |
10 link="/en/docs/stream/ngx_stream_js_module.html" | 10 link="/en/docs/stream/ngx_stream_js_module.html" |
11 lang="en" | 11 lang="en" |
12 rev="12"> | 12 rev="13"> |
13 | 13 |
14 <section id="summary"> | 14 <section id="summary"> |
15 | 15 |
16 <para> | 16 <para> |
17 The <literal>ngx_stream_js_module</literal> module is used to implement | 17 The <literal>ngx_stream_js_module</literal> module is used to implement |
29 | 29 |
30 | 30 |
31 <section id="example" name="Example Configuration"> | 31 <section id="example" name="Example Configuration"> |
32 | 32 |
33 <para> | 33 <para> |
34 <note> | |
35 This example is valid for | |
36 njs <link doc="../njs/njs_changes.xml" id="njs-0.2.4">0.2.4</link>. | |
37 For njs <link doc="../njs/njs_changes.xml" id="njs-0.2.3">0.2.3</link> | |
38 and earlier, use | |
39 <link doc="../njs/njs_api.xml" id="example_legacy">this</link> example. | |
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 The <path>stream.js</path> file: | 79 The <path>stream.js</path> file: |
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 // The filter processes one buffer per call. | 89 function preread(s) { |
98 // The buffer is available in s.buffer both for | 90 s.on('upload', function (data, flags) { |
99 // reading and writing. Called for both directions. | 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 // Read HTTP request line. | |
104 // Collect bytes in 'req' until | |
105 // request line is read. | |
106 // Injects HTTP header into a client's request | |
107 | |
108 var my_header = 'Foo: foo'; | |
109 function header_inject(s) { | |
110 var req = ''; | |
111 s.on('upload', function(data, flags) { | |
112 req += data; | |
113 var n = req.search('\n'); | |
114 if (n != -1) { | |
115 var rest = req.substr(n + 1); | |
116 req = req.substr(0, n + 1); | |
117 s.send(req + my_header + '\r\n' + rest, flags); | |
118 s.off('upload'); | |
119 } | |
120 }); | |
121 } | |
122 | |
123 function access(s) { | |
124 if (s.remoteAddress.match('^192.*')) { | |
125 s.abort(); | |
103 return; | 126 return; |
104 } | 127 } |
105 | 128 |
106 // Disable certain addresses. | 129 s.allow(); |
107 | |
108 if (s.remoteAddress.match('^192.*')) { | |
109 return s.ERROR; | |
110 } | |
111 | |
112 // Read HTTP request line. | |
113 // Collect bytes in 'req' until request | |
114 // line is read. Clear current buffer to | |
115 // disable output. | |
116 | |
117 req = req + s.buffer; | |
118 s.buffer = ''; | |
119 | |
120 var n = req.search('\n'); | |
121 | |
122 if (n != -1) { | |
123 // Inject a new HTTP header. | |
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 // Output the result and skip further | |
133 // processing. | |
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 } | 130 } |
145 </example> | 131 </example> |
146 </para> | 132 </para> |
147 | 133 |
148 </section> | 134 </section> |