[njs] Tests: fixed js_body_filter.t.
noreply at nginx.com
noreply at nginx.com
Fri May 2 01:33:02 UTC 2025
details: https://github.com/nginx/njs/commit/4fbe8a6511949c6137397f98fad9342e0e0bc76c
branches: master
commit: 4fbe8a6511949c6137397f98fad9342e0e0bc76c
user: Dmitry Volyntsev <xeioex at nginx.com>
date: Thu, 1 May 2025 09:06:25 -0700
description:
Tests: fixed js_body_filter.t.
The 1496ed3f commit made visible a problem with the fragile filter tests
which depend on the exact sequence of data chunks. The fix is to use
perl http server to ensure the order.
---
nginx/t/js_body_filter.t | 132 +++++++++++++++++++++++++++++------------------
1 file changed, 83 insertions(+), 49 deletions(-)
diff --git a/nginx/t/js_body_filter.t b/nginx/t/js_body_filter.t
index 5fc8292a..6bd6bddb 100644
--- a/nginx/t/js_body_filter.t
+++ b/nginx/t/js_body_filter.t
@@ -12,6 +12,8 @@ use strict;
use Test::More;
+use Socket qw/ CRLF IPPROTO_TCP TCP_NODELAY /;
+
BEGIN { use FindBin; chdir($FindBin::Bin); }
use lib 'lib';
@@ -79,21 +81,6 @@ http {
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;
- }
-
- location /nonutf8_source {
- postpone_output 1;
- js_content test.nonutf8_source;
- }
- }
}
EOF
@@ -124,39 +111,6 @@ $t->write_file('test.js', <<EOF);
}
}
- 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.headersOut['Content-Length'] = chunks.reduce((a, b) => a + b.length, 0);
- r.sendHeader();
- chain(chunks, 0);
- }
-
- function nonutf8_source(r) {
- var chunks = ['aaaa', 'bb', 'cc', 'dddd'].map(v=>Buffer.from(v, 'hex'));
- 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);
@@ -178,12 +132,15 @@ $t->write_file('test.js', <<EOF);
}
export default {njs: test_njs, append, buffer_type, filter, forward,
- prepend, source, nonutf8_source, clear_content_length};
+ prepend, clear_content_length};
EOF
$t->try_run('no njs body filter')->plan(8);
+$t->run_daemon(\&http_daemon, port(8081));
+$t->waitforsocket('127.0.0.1:' . port(8081));
+
###############################################################################
like(http_get('/append'), qr/AAABBCDDDDXXX$/, 'append');
@@ -198,3 +155,80 @@ like(http_get('/filter?len=2&dup=1'), qr/AAA#AAABB#BBDDDD#DDDD#$/,
like(http_get('/prepend'), qr/XXXAAABBCDDDD$/, 'prepend');
###############################################################################
+
+sub http_daemon {
+ my $port = shift;
+ my $delay = shift || 0.05;
+
+ my $server = IO::Socket::INET->new(
+ Proto => 'tcp',
+ LocalAddr => '127.0.0.1:' . $port,
+ Listen => 5,
+ Reuse => 1
+ ) or die "Can't create listening socket: $!\n";
+
+ local $SIG{PIPE} = 'IGNORE';
+
+ while (my $client = $server->accept()) {
+ $client->autoflush(1);
+
+ setsockopt($client, IPPROTO_TCP, TCP_NODELAY, 1)
+ or die "Can't set TCP_NODELAY: $!\n";
+
+ my $headers = '';
+ my $uri = '';
+
+ while (<$client>) {
+ $headers .= $_;
+ last if (/^\x0d?\x0a?$/);
+ }
+
+ $uri = $1 if $headers =~ /^\S+\s+([^ ]+)\s+HTTP/i;
+ $uri =~ s/\?.*//;
+
+ log2c("(new connection $client $uri)");
+
+ if ($uri eq '/source') {
+ print $client
+ "HTTP/1.1 200 OK" . CRLF .
+ "Content-Length: 10" . CRLF .
+ "Connection: close" . CRLF .
+ CRLF;
+
+ print $client "AAA";
+ select undef, undef, undef, $delay;
+ print $client "BB";
+ select undef, undef, undef, $delay;
+ print $client "C";
+ select undef, undef, undef, $delay;
+ print $client "DDDD";
+
+ } elsif ($uri eq '/nonutf8_source') {
+ print $client
+ "HTTP/1.1 200 OK" . CRLF .
+ "Content-Length: 6" . CRLF .
+ "Connection: close" . CRLF .
+ CRLF;
+
+ print $client "\xaa\xaa";
+ select undef, undef, undef, $delay;
+ print $client "\xbb";
+ select undef, undef, undef, $delay;
+ print $client "\xcc";
+ select undef, undef, undef, $delay;
+ print $client "\xdd\xdd";
+
+ } else {
+ print $client
+ "HTTP/1.1 404 Not Found" . CRLF .
+ "Connection: close" . CRLF .
+ CRLF;
+ }
+
+ $client->close();
+ }
+}
+
+sub log2c { Test::Nginx::log_core('||', @_); }
+
+###############################################################################
More information about the nginx-devel
mailing list