changeset 2178:cb431c861670

Added njs examples.
author Yaroslav Zhuravlev <yar@nginx.com>
date Tue, 05 Jun 2018 18:23:50 +0300
parents 79297494d291
children 962e1adfa032
files xml/en/docs/njs/njs_api.xml
diffstat 1 files changed, 227 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/xml/en/docs/njs/njs_api.xml
+++ b/xml/en/docs/njs/njs_api.xml
@@ -539,4 +539,231 @@ on the <literal>error</literal> level of
 </section>
 
 
+<section id="example" name="Examples">
+
+
+<section id="example_urldecode" name="URL Decoding">
+
+<para>
+<example>
+js_include urldecode.js;
+
+js_set $decoded_foo decoded_foo;
+</example>
+</para>
+
+<para>
+The <path>urldecode.js</path> file:
+<example>
+function decoded_foo(req, res) {
+    return decodeURIComponent(req.args.foo);
+}
+</example>
+</para>
+
+</section>
+
+
+<section id="example_urlencode" name="URL Encoding">
+
+<para>
+<example>
+js_include urlencode.js;
+
+js_set $encoded_foo encoded_foo;
+...
+
+location / {
+    proxy_pass http://example.com?foo=$encoded_foo;
+}
+</example>
+</para>
+
+<para>
+The <path>urlencode.js</path> file:
+<example>
+function encoded_foo(req, res) {
+    return encodeURIComponent('foo &amp; bar?');
+}
+</example>
+</para>
+
+</section>
+
+
+<section id="example_fast_response" name="Returning Fastest Response from Proxy">
+
+<para>
+<example>
+js_include fastresponse.js;
+
+location /start {
+    js_content content;
+}
+
+location /foo {
+    proxy_pass http://backend1;
+}
+
+location /bar {
+    proxy_pass http://backend2;
+}
+</example>
+</para>
+
+<para>
+The <path>fastresponse.js</path> file:
+<example>
+function content(req, res) {
+    var n = 0;
+
+    function done(reply) {
+        if (n++ == 0) {
+            res.return(reply.status, reply.body);
+        }
+    }
+
+    req.subrequest('/foo', req.variables.args, done);
+    req.subrequest('/bar', req.variables.args, done);
+}
+</example>
+</para>
+
+</section>
+
+
+<section id="example_jwt" name="Creating HS JWT">
+
+<para>
+<example>
+js_include hs_jwt.js;
+
+js_set $jwt jwt;
+</example>
+</para>
+
+<para>
+The <path>hs_jwt.js</path> file:
+<example>
+function create_hs256_jwt(claims, key, valid) {
+    var header = { "typ" : "JWT", "alg" : "HS256", "exp" : Date.now() + valid };
+
+    var s = JSON.stringify(header).toBytes().toString('base64url') + '.'
+            + JSON.stringify(claims).toBytes().toString('base64url');
+
+    var h = require('crypto').createHmac('sha256', key);
+
+    return s + '.' + h.update(s).digest().toString('base64url');
+}
+
+function jwt(req, res) {
+    var claims = {
+        "iss" : "nginx",
+        "sub" : "alice",
+        "foo" : 123,
+        "bar" : "qq",
+        "zyx" : false
+    };
+
+    return create_hs256_jwt(claims, 'foo', 600);
+}
+</example>
+</para>
+
+</section>
+
+
+<section id="example_subrequest" name="Accessing API from a Subrequest">
+
+<para>
+<example>
+js_include subrequest.js;
+
+keyval_zone zone=foo:10m;
+...
+
+location /keyval {
+    js_content set_keyval;
+}
+
+location /version {
+    js_content version;
+}
+
+location /api {
+    api write=on;
+}
+</example>
+</para>
+
+<para>
+The <path>subrequest.js</path> file:
+<example>
+function set_keyval(req, res) {
+    req.subrequest('/api/3/http/keyvals/foo',
+        { method: 'POST',
+          body: JSON.stringify({ foo: 789, bar: "ss dd 00" })},
+
+        function(reply) {
+            if (reply.status >= 300) {
+                res.return(reply.status, reply.body);
+                return;
+            }
+            res.return(500);
+        });
+}
+function version(req, res) {
+    req.subrequest('/api/3/nginx', { method: 'GET' }, function(reply) {
+        if (reply.status != 200) {
+            res.return(reply.status);
+            return;
+        }
+
+        var json = JSON.parse(reply.body);
+        res.return(200, json.version);
+    });
+}
+</example>
+</para>
+
+</section>
+
+
+<section id="example_secure_link" name="Creating secure_link Hash">
+
+<para>
+<example>
+js_include hash.js;
+
+js_set $new_foo create_secure_link;
+...
+
+location / {
+    secure_link $cookie_foo;
+    secure_link_md5 "$uri mykey";
+    ...
+}
+
+location @login {
+    add_header Set-Cookie "foo=$new_foo; Max-Age=60";
+    return 302 /;
+}
+</example>
+</para>
+
+<para>
+The <path>hash.js</path> file:
+<example>
+function create_secure_link(req, res) {
+    return require('crypto').createHash('md5')
+                            .update(req.uri).update(" mykey")
+                            .digest('base64url');
+}
+</example>
+</para>
+
+</section>
+
+</section>
+
 </article>