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
});
}
+ 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));
###############################################################################
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')
> 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('||', @_); }
+
+###############################################################################