Module ngx_stream_js_module

Example Configuration
Directives
     js_access
     js_filter
     js_include
     js_preread
     js_set
Session Object Properties

The ngx_stream_js_module module is used to implement handlers in njs — a subset of the JavaScript language.

This module is not built by default. Download and install instructions are available here.

Example Configuration

This example is valid for njs 0.2.4 and later. For njs 0.2.3 and earlier, use this example.

load_module modules/ngx_stream_js_module.so;
...

stream {
    js_include stream.js;

    js_set $bar bar;
    js_set $req_line req_line;

    server {
        listen 12345;

        js_preread preread;
        return     $req_line;
    }

    server {
        listen 12346;

        js_access  access;
        proxy_pass 127.0.0.1:8000;
        js_filter  header_inject;
    }
}

http {
    server {
        listen 8000;
        location / {
            return 200 $http_foo\n;
        }
    }
}

The stream.js file:

var line = '';

function bar(s) {
    var v = s.variables;
    s.log("hello from bar() handler!");
    return "bar-var" + v.remote_port + "; pid=" + v.pid;
}

function preread(s) {
    s.on('upload', function (data, flags) {
        var n = data.indexOf('\n');
        if (n != -1) {
            line = data.substr(0, n);
            s.done();
        }
    });
}

function req_line(s) {
    return line;
}

// Read HTTP request line.
// Collect bytes in 'req' until
// request line is read.
// Injects HTTP header into a client's request

var my_header =  'Foo: foo';
function header_inject(s) {
    var req = '';
    s.on('upload', function(data, flags) {
        req += data;
        var n = req.search('\n');
        if (n != -1) {
            var rest = req.substr(n + 1);
            req = req.substr(0, n + 1);
            s.send(req + my_header + '\r\n' + rest, flags);
            s.off('upload');
        }
    });
}

function access(s) {
    if (s.remoteAddress.match('^192.*')) {
        s.abort();
        return;
    }

    s.allow();
}

Directives

Syntax: js_access function;
Default:
Context: stream, server

Sets an njs function which will be called at the access phase.

Syntax: js_filter function;
Default:
Context: stream, server

Sets a data filter.

Syntax: js_include file;
Default:
Context: stream

Specifies a file that implements server and variable handlers in njs.

Syntax: js_preread function;
Default:
Context: stream, server

Sets an njs function which will be called at the preread phase.

Syntax: js_set $variable function;
Default:
Context: stream

Sets an njs function for the specified variable.

Session Object Properties

Each stream njs handler receives one argument, a stream session object.