view js_body_filter.t @ 1788:78fe648d54a7

Tests: avoid send timeout in h2_ssl.t test with canceled streams. While being irrelevant to catching alerts, it slows down run time on systems with short socket buffers.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 30 Aug 2022 17:24:16 +0400
parents 759efa4abc76
children
line wrap: on
line source

#!/usr/bin/perl

# (C) Dmitry Volyntsev
# (C) Nginx, Inc.

# Tests for http njs module, body filter.

###############################################################################

use warnings;
use strict;

use Test::More;

BEGIN { use FindBin; chdir($FindBin::Bin); }

use lib 'lib';
use Test::Nginx;

###############################################################################

select STDERR; $| = 1;
select STDOUT; $| = 1;

my $t = Test::Nginx->new()->has(qw/http proxy/)
	->write_file_expand('nginx.conf', <<'EOF');

%%TEST_GLOBALS%%

daemon off;

events {
}

http {
    %%TEST_GLOBALS_HTTP%%

    js_import test.js;

    server {
        listen       127.0.0.1:8080;
        server_name  localhost;

        location /njs {
            js_content test.njs;
        }

        location /append {
            js_body_filter test.append;
            proxy_pass http://127.0.0.1:8081/source;
        }

        location /buffer_type {
            js_body_filter test.buffer_type buffer_type=buffer;
            proxy_pass http://127.0.0.1:8081/source;
        }

        location /forward {
            js_body_filter test.forward buffer_type=string;
            proxy_pass http://127.0.0.1:8081/source;
        }

        location /filter {
            proxy_buffering off;
            js_body_filter test.filter;
            proxy_pass http://127.0.0.1:8081/source;
        }

        location /prepend {
            js_body_filter test.prepend;
            proxy_pass http://127.0.0.1:8081/source;
        }
    }

    server {
        listen       127.0.0.1:8081;
        server_name  localhost;

        location /source {
            postpone_output 1;
            js_content test.source;
        }
    }
}

EOF

$t->write_file('test.js', <<EOF);
    function test_njs(r) {
        r.return(200, njs.version);
    }

    function append(r, data, flags) {
        r.sendBuffer(data, {last:false});

        if (flags.last) {
            r.sendBuffer("XXX", flags);
        }
    }

    var collect = Buffer.from([]);
    function buffer_type(r, data, flags) {
        collect = Buffer.concat([collect, data]);

        if (flags.last) {
            r.sendBuffer(collect, flags);
        }
    }

    function chain(chunks, i) {
        if (i < chunks.length) {
            chunks.r.send(chunks[i++]);
            setTimeout(chunks.chain, chunks.delay, chunks, i);

        } else {
            chunks.r.finish();
        }
    }

    function source(r) {
        var chunks = ['AAA', 'BB', 'C', 'DDDD'];
        chunks.delay = 5;
        chunks.r = r;
        chunks.chain = chain;

        r.status = 200;
        r.sendHeader();
        chain(chunks, 0);
    }

    function filter(r, data, flags) {
        if (flags.last || data.length >= Number(r.args.len)) {
            r.sendBuffer(`\${data}|`, flags);

            if (r.args.dup && !flags.last) {
                r.sendBuffer(data, flags);
            }
        }
    }

    function forward(r, data, flags) {
        r.sendBuffer(data, flags);
    }

    function prepend(r, data, flags) {
        r.sendBuffer("XXX");
        r.sendBuffer(data, flags);
        r.done();
    }

    export default {njs: test_njs, append, buffer_type, filter, forward,
                    prepend, source};

EOF

$t->try_run('no njs body filter')->plan(6);

###############################################################################

like(http_get('/append'), qr/AAABBCDDDDXXX/, 'append');
like(http_get('/buffer_type'), qr/AAABBCDDDD/, 'buffer type');
like(http_get('/forward'), qr/AAABBCDDDD/, 'forward');
like(http_get('/filter?len=3'), qr/AAA|DDDD|/, 'filter 3');
like(http_get('/filter?len=2&dup=1'), qr/AAA|AAABB|BBDDDD|DDDD/,
	'filter 2 dup');
like(http_get('/prepend'), qr/XXXAAABBCDDDD/, 'prepend');

###############################################################################