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>