|  | #!/usr/bin/perl | 
|  |  | 
|  | # (C) Dmitry Volyntsev | 
|  | # (C) Nginx, Inc. | 
|  |  | 
|  | # Tests for http njs module, request object. | 
|  |  | 
|  | ############################################################################### | 
|  |  | 
|  | use warnings; | 
|  | use strict; | 
|  |  | 
|  | use Test::More; | 
|  | use Socket qw/ CRLF /; | 
|  |  | 
|  | 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/) | 
|  | ->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 /to_string { | 
|  | js_content test.to_string; | 
|  | } | 
|  |  | 
|  | location /define_prop { | 
|  | js_content test.define_prop; | 
|  | } | 
|  |  | 
|  | location /in_operator { | 
|  | js_content test.in_operator; | 
|  | } | 
|  |  | 
|  | location /redefine_bind { | 
|  | js_content test.redefine_bind; | 
|  | } | 
|  |  | 
|  | location /redefine_proxy { | 
|  | js_content test.redefine_proxy; | 
|  | } | 
|  |  | 
|  | location /redefine_proto { | 
|  | js_content test.redefine_proto; | 
|  | } | 
|  |  | 
|  | location /get_own_prop_descs { | 
|  | js_content test.get_own_prop_descs; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | EOF | 
|  |  | 
|  | $t->write_file('test.js', <<EOF); | 
|  | function to_string(r) { | 
|  | r.return(200, r.toString()); | 
|  | } | 
|  |  | 
|  | function define_prop(r) { | 
|  | Object.defineProperty(r.headersOut, 'Foo', {value:'bar'}); | 
|  | r.return(200); | 
|  | } | 
|  |  | 
|  | function in_operator(r) { | 
|  | r.return(200, ['Foo', 'Bar'].map(v=>v in r.headersIn) | 
|  | .toString() === 'true,false'); | 
|  | } | 
|  |  | 
|  | function redefine_bind(r) { | 
|  | r.return = r.return.bind(r, 200); | 
|  | r.return('redefine_bind'); | 
|  | } | 
|  |  | 
|  | function redefine_proxy(r) { | 
|  | r.return_orig = r.return; | 
|  | r.return = function (body) { this.return_orig(200, body);} | 
|  | r.return('redefine_proxy'); | 
|  | } | 
|  |  | 
|  | function redefine_proto(r) { | 
|  | r[0] = 'a'; | 
|  | r[1] = 'b'; | 
|  | r.length = 2; | 
|  | Object.setPrototypeOf(r, Array.prototype); | 
|  | r.return(200, r.join('|')); | 
|  | } | 
|  |  | 
|  | function get_own_prop_descs(r) { | 
|  | r.return(200, | 
|  | Object.getOwnPropertyDescriptors(r)['log'].value === r.log); | 
|  | } | 
|  |  | 
|  | export default {to_string, define_prop, in_operator, redefine_bind, | 
|  | redefine_proxy, redefine_proto, get_own_prop_descs}; | 
|  |  | 
|  | EOF | 
|  |  | 
|  | $t->try_run('no njs request object')->plan(7); | 
|  |  | 
|  | ############################################################################### | 
|  |  | 
|  | like(http_get('/to_string'), qr/\[object Request\]/, 'toString'); | 
|  | like(http_get('/define_prop'), qr/Foo: bar/, 'define_prop'); | 
|  | like(http( | 
|  | 'GET /in_operator HTTP/1.0' . CRLF | 
|  | . 'Foo: foo' . CRLF | 
|  | . 'Host: localhost' . CRLF . CRLF | 
|  | ), qr/true/, 'in_operator'); | 
|  | like(http_get('/redefine_bind'), qr/redefine_bind/, 'redefine_bind'); | 
|  | like(http_get('/redefine_proxy'), qr/redefine_proxy/, 'redefine_proxy'); | 
|  | like(http_get('/redefine_proto'), qr/a|b/, 'redefine_proto'); | 
|  | like(http_get('/get_own_prop_descs'), qr/true/, 'get_own_prop_descs'); | 
|  |  | 
|  | ############################################################################### |