changeset 2605:a9ec849a6c8c

Tests: added TypedArray test for js_filter in stream.
author Dmitry Volyntsev <xeioex@nginx.com>
date Tue, 19 Aug 2025 17:16:22 -0700
parents 1f9b9265d79a
children caf716d4e693
files nginx/t/stream_js_buffer.t
diffstat 1 files changed, 75 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/nginx/t/stream_js_buffer.t	Mon Aug 25 16:47:43 2025 -0700
+++ b/nginx/t/stream_js_buffer.t	Tue Aug 19 17:16:22 2025 -0700
@@ -91,6 +91,12 @@
         js_filter   test.header_inject;
         proxy_pass  127.0.0.1:8080;
     }
+
+    server {
+        listen      127.0.0.1:8086;
+        js_filter   test.typed_array_send;
+        proxy_pass  127.0.0.1:8090;
+    }
 }
 
 EOF
@@ -150,12 +156,26 @@
         });
     }
 
+    function typed_array_send(s) {
+        s.on('upstream', function (data, flags) {
+            var buf = new Uint8Array([72, 101, 108, 108, 111]);
+            var view1 = buf.subarray(1, 4);
+            var view2 = buf.subarray(2);
+
+            s.sendUpstream(view1);
+            s.sendUpstream(view2);
+            s.off('upstream');
+        });
+    }
+
     export default {njs: test_njs, type, binary_var, cb_mismatch, cb_mismatch2,
-                    header_inject};
+                    header_inject, typed_array_send};
 
 EOF
 
-$t->try_run('no njs ngx')->plan(5);
+$t->run_daemon(\&stream_daemon, port(8090));
+$t->try_run('no njs ngx')->plan(6);
+$t->waitforsocket('127.0.0.1:' . port(8090));
 
 ###############################################################################
 
@@ -167,6 +187,9 @@
 
 like(http_get('/p/return'), qr/RETURN:foo/, 'injected header');
 
+is(stream('127.0.0.1:' . port(8086))->io('x', length => 6), 'ellllo',
+	'typed array send');
+
 $t->stop();
 
 ok(index($t->read_file('error.log'), 'cb_mismatch:mixing string and buffer')
@@ -175,3 +198,53 @@
    > 0, 'cb mismatch');
 
 ###############################################################################
+
+sub stream_daemon {
+	my $server = IO::Socket::INET->new(
+		Proto => 'tcp',
+		LocalAddr => '127.0.0.1:' . port(8090),
+		Listen => 5,
+		Reuse => 1
+	)
+		or die "Can't create listening socket: $!\n";
+
+	local $SIG{PIPE} = 'IGNORE';
+
+	while (my $client = $server->accept()) {
+		$client->autoflush(1);
+
+		log2c("(new connection $client)");
+
+		while (1) {
+			my $bytes_read = $client->sysread(my $buffer, 65536);
+
+			if (!defined $bytes_read) {
+				log2c("Read error from $client: $!");
+				last;
+
+			} elsif ($bytes_read == 0) {
+				log2c("Client $client disconnected");
+				last;
+			}
+
+			log2i("$client $buffer");
+
+			my $bytes_written = $client->syswrite($buffer);
+
+			if (!defined $bytes_written || $bytes_written != length($buffer)) {
+				log2c("Write error to $client: $!");
+				last;
+			}
+
+			log2o("$client $buffer");
+		}
+
+		close $client;
+	}
+}
+
+sub log2i { Test::Nginx::log_core('|| <<', @_); }
+sub log2o { Test::Nginx::log_core('|| >>', @_); }
+sub log2c { Test::Nginx::log_core('||', @_); }
+
+###############################################################################