comparison js_body_filter.t @ 1656:759efa4abc76

Tests: added tests for js_body_filter directive.
author Dmitry Volyntsev <xeioex@nginx.com>
date Fri, 19 Feb 2021 12:20:57 +0000
parents
children
comparison
equal deleted inserted replaced
1655:666d54ab5036 1656:759efa4abc76
1 #!/usr/bin/perl
2
3 # (C) Dmitry Volyntsev
4 # (C) Nginx, Inc.
5
6 # Tests for http njs module, body filter.
7
8 ###############################################################################
9
10 use warnings;
11 use strict;
12
13 use Test::More;
14
15 BEGIN { use FindBin; chdir($FindBin::Bin); }
16
17 use lib 'lib';
18 use Test::Nginx;
19
20 ###############################################################################
21
22 select STDERR; $| = 1;
23 select STDOUT; $| = 1;
24
25 my $t = Test::Nginx->new()->has(qw/http proxy/)
26 ->write_file_expand('nginx.conf', <<'EOF');
27
28 %%TEST_GLOBALS%%
29
30 daemon off;
31
32 events {
33 }
34
35 http {
36 %%TEST_GLOBALS_HTTP%%
37
38 js_import test.js;
39
40 server {
41 listen 127.0.0.1:8080;
42 server_name localhost;
43
44 location /njs {
45 js_content test.njs;
46 }
47
48 location /append {
49 js_body_filter test.append;
50 proxy_pass http://127.0.0.1:8081/source;
51 }
52
53 location /buffer_type {
54 js_body_filter test.buffer_type buffer_type=buffer;
55 proxy_pass http://127.0.0.1:8081/source;
56 }
57
58 location /forward {
59 js_body_filter test.forward buffer_type=string;
60 proxy_pass http://127.0.0.1:8081/source;
61 }
62
63 location /filter {
64 proxy_buffering off;
65 js_body_filter test.filter;
66 proxy_pass http://127.0.0.1:8081/source;
67 }
68
69 location /prepend {
70 js_body_filter test.prepend;
71 proxy_pass http://127.0.0.1:8081/source;
72 }
73 }
74
75 server {
76 listen 127.0.0.1:8081;
77 server_name localhost;
78
79 location /source {
80 postpone_output 1;
81 js_content test.source;
82 }
83 }
84 }
85
86 EOF
87
88 $t->write_file('test.js', <<EOF);
89 function test_njs(r) {
90 r.return(200, njs.version);
91 }
92
93 function append(r, data, flags) {
94 r.sendBuffer(data, {last:false});
95
96 if (flags.last) {
97 r.sendBuffer("XXX", flags);
98 }
99 }
100
101 var collect = Buffer.from([]);
102 function buffer_type(r, data, flags) {
103 collect = Buffer.concat([collect, data]);
104
105 if (flags.last) {
106 r.sendBuffer(collect, flags);
107 }
108 }
109
110 function chain(chunks, i) {
111 if (i < chunks.length) {
112 chunks.r.send(chunks[i++]);
113 setTimeout(chunks.chain, chunks.delay, chunks, i);
114
115 } else {
116 chunks.r.finish();
117 }
118 }
119
120 function source(r) {
121 var chunks = ['AAA', 'BB', 'C', 'DDDD'];
122 chunks.delay = 5;
123 chunks.r = r;
124 chunks.chain = chain;
125
126 r.status = 200;
127 r.sendHeader();
128 chain(chunks, 0);
129 }
130
131 function filter(r, data, flags) {
132 if (flags.last || data.length >= Number(r.args.len)) {
133 r.sendBuffer(`\${data}|`, flags);
134
135 if (r.args.dup && !flags.last) {
136 r.sendBuffer(data, flags);
137 }
138 }
139 }
140
141 function forward(r, data, flags) {
142 r.sendBuffer(data, flags);
143 }
144
145 function prepend(r, data, flags) {
146 r.sendBuffer("XXX");
147 r.sendBuffer(data, flags);
148 r.done();
149 }
150
151 export default {njs: test_njs, append, buffer_type, filter, forward,
152 prepend, source};
153
154 EOF
155
156 $t->try_run('no njs body filter')->plan(6);
157
158 ###############################################################################
159
160 like(http_get('/append'), qr/AAABBCDDDDXXX/, 'append');
161 like(http_get('/buffer_type'), qr/AAABBCDDDD/, 'buffer type');
162 like(http_get('/forward'), qr/AAABBCDDDD/, 'forward');
163 like(http_get('/filter?len=3'), qr/AAA|DDDD|/, 'filter 3');
164 like(http_get('/filter?len=2&dup=1'), qr/AAA|AAABB|BBDDDD|DDDD/,
165 'filter 2 dup');
166 like(http_get('/prepend'), qr/XXXAAABBCDDDD/, 'prepend');
167
168 ###############################################################################