Hello, For those who doesn't follow njs project closely: Roman and Igor just added njs support to the stream module and moved js scripting to separate files.
More details in the project README file you can find here: http://hg.nginx.org/njs/file/tip/README -------- Forwarded Message -------- Subject: [njs] Updated README to reflect changes in HTTP and Stream modules. Date: Wed, 20 Jul 2016 16:39:30 +0000 From: Roman Arutyunyan <[email protected]> Reply-To: [email protected] To: [email protected] details: http://hg.nginx.org/njs/rev/3f8f801e2f53 branches: changeset: 125:3f8f801e2f53 user: Roman Arutyunyan <[email protected]> date: Wed Jul 20 19:38:00 2016 +0300 description: Updated README to reflect changes in HTTP and Stream modules. diffstat: README | 225 +++++++++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 144 insertions(+), 81 deletions(-) diffs (264 lines): diff -r 740defed7584 -r 3f8f801e2f53 README --- a/README Wed Jul 20 18:20:17 2016 +0300 +++ b/README Wed Jul 20 19:38:00 2016 +0300 @@ -1,5 +1,6 @@ -Configure nginx with HTTP JavaScript module using the --add-module option: +Configure nginx with HTTP and Stream JavaScript modules using the --add-module +option: ./configure --add-module=<path-to-njs>/nginx @@ -14,30 +15,39 @@ and add the following line to nginx.conf Please report your experiences to the NGINX development mailing list [email protected] (http://mailman.nginx.org/mailman/listinfo/nginx-devel). -JavaScript objects ------------------- -$r -|- uri -|- method -|- httpVersion -|- remoteAddress -|- headers{} -|- args{} -|- response - |- status - |- headers{} - |- contentType - |- contentLength - |- sendHeader() - |- send(data) - |- finish() +HTTP JavaScript module +---------------------- + +Each HTTP JavaScript handler receives two arguments - request and response. + + function foo(req, res) { + .. + } + +The following properties are available: + +req + - uri + - method + - httpVersion + - remoteAddress + - headers{} + - args{} + - variables{} + - log() + +res + - status + - headers{} + - contentType + - contentLength + - sendHeader() + - send() + - finish() -Example -------- - -Create nginx.conf: +Example nginx.conf: worker_processes 1; pid logs/nginx.pid; @@ -47,79 +57,132 @@ Create nginx.conf: } http { - js_set $summary " - var a, s, h; - - s = 'JS summary\n\n'; - - s += 'Method: ' + $r.method + '\n'; - s += 'HTTP version: ' + $r.httpVersion + '\n'; - s += 'Host: ' + $r.headers.host + '\n'; - s += 'Remote Address: ' + $r.remoteAddress + '\n'; - s += 'URI: ' + $r.uri + '\n'; - - s += 'Headers:\n'; - for (h in $r.headers) { - s += ' header \"' + h + '\" is \"' + $r.headers[h] + '\"\n'; - } - - s += 'Args:\n'; - for (a in $r.args) { - s += ' arg \"' + a + '\" is \"' + $r.args[a] + '\"\n'; - } - - s; - "; + # include JavaScript file + js_include js-http.js; server { listen 8000; location / { - js_run " - var res; - res = $r.response; - res.headers.foo = 1234; - res.status = 302; - res.contentType = 'text/plain; charset=utf-8'; - res.contentLength = 15; - res.sendHeader(); - res.send('nginx'); - res.send('java'); - res.send('script'); - res.finish(); - "; + # create $foo variable and set JavaScript function foo() + # from the included JavaScript file as its handler + js_set $foo foo; + + add_header X-Foo $foo; + + # register JavaScript function bar() as content handler + js_content baz; } location /summary { + js_set $summary summary; + return 200 $summary; } } } -Run nginx & test the output: - -$ curl 127.0.0.1:8000 - -nginxjavascript - -$ curl -H "Foo: 1099" '127.0.0.1:8000/summary?a=1&fooo=bar&zyx=xyz' - -JS summary -Method: GET -HTTP version: 1.1 -Host: 127.0.0.1:8000 -Remote Address: 127.0.0.1 -URI: /summary -Headers: - header "Host" is "127.0.0.1:8000" - header "User-Agent" is "curl/7.43.0" - header "Accept" is "*/*" - header "Foo" is "1099" -Args: - arg "a" is "1" - arg "fooo" is "bar" - arg "zyx" is "xyz" +js-http.js: + + function foo(req, res) { + req.log("hello from foo() handler"); + return "foo"; + } + + function summary(req, res) { + var a, s, h; + + s = "JS summary\n\n"; + + s += "Method: " + req.method + "\n"; + s += "HTTP version: " + req.httpVersion + "\n"; + s += "Host: " + req.headers.host + "\n"; + s += "Remote Address: " + req.remoteAddress + "\n"; + s += "URI: " + req.uri + "\n"; + + s += "Headers:\n"; + for (h in req.headers) { + s += " header '" + h + "' is '" + req.headers[h] + "'\n"; + } + + s += "Args:\n"; + for (a in req.args) { + s += " arg '" + a + "' is '" + req.args[a] + "'\n"; + } + + return s; + } + + function baz(req, res) { + res.headers.foo = 1234; + res.status = 200; + res.contentType = "text/plain; charset=utf-8"; + res.contentLength = 15; + res.sendHeader(); + res.send("nginx"); + res.send("java"); + res.send("script"); + + res.finish(); + } + + +Stream JavaScript module +------------------------ + +Each Stream JavaScript handler receives one argument - stream session object. + + function foo(s) { + .. + } + +The following properties are available in the session object: + + - remoteAddress + - variables{} + - log() + + +Example nginx.conf: + + worker_processes 1; + pid logs/nginx.pid; + + events { + worker_connections 256; + } + + stream { + # include JavaScript file + js_include js-stream.js; + + server { + listen 8000; + + # create $foo and $bar variables and set JavaScript + # functions foo() and bar() from the included JavaScript + # file as their handlers + js_set $foo foo; + js_set $bar bar; + + return $foo-$bar; + } + } + + +js-stream.js: + + function foo(s) { + s.log("hello from foo() handler!"); + return s.remoteAddress; + } + + function bar(s) { + var v = s.variables; + s.log("hello from bar() handler!"); + return "foo-var" + v.remote_port + "; pid=" + v.pid; + } -- _______________________________________________ nginx-devel mailing list [email protected] http://mailman.nginx.org/mailman/listinfo/nginx-devel -- Maxim Konovalov _______________________________________________ nginx mailing list [email protected] http://mailman.nginx.org/mailman/listinfo/nginx
