Fwd: [njs] Updated README to reflect changes in HTTP and Stream modules.

Maxim Konovalov maxim at nginx.com
Thu Jul 21 07:26:42 UTC 2016


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 <arut at nginx.com>
Reply-To: nginx-devel at nginx.org
To: nginx-devel at nginx.org

details:   http://hg.nginx.org/njs/rev/3f8f801e2f53
branches:  changeset: 125:3f8f801e2f53
user:      Roman Arutyunyan <arut at nginx.com>
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
 nginx-devel at nginx.org
(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
nginx-devel at nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


-- 
Maxim Konovalov



More information about the nginx mailing list