iRules LX Sideband Connection

Problem this snippet solves:

Sideband connections in traditional TCL iRules can be large, complex and difficult to support. Additionally doing something with the information retrieved (such as JSON) may require the use of regular expressions to parse the content before it can be used, something to be avoided if at all possible due to the performance overhead.

Using the inbuilt capabilities of Node.js, sideband calls in iRules LX are much easier to implement and with a range of inbuilt as well as NPM packages, the possibilities are endless.

To make the external request, the example uses 'https' package from the standard library, however many more are available via NPM such as 'request' which is much simpler to use and doesn't need to chuck the response. The advantage of using the standard library in this instance is this can be done 'out of the box' and doesn't require the use of NPM.

In this simple example, a traditional iRule requests the object 'title', which is a JSON object from a publicly available API (https://jsonplaceholder.typicode.com/).

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

iRules LX will, make the call using the standard 'https' library, parse the JSON data and return the value for 'title' to the calling iRule, which will be then returned to the user as an HTTP response

How to use this snippet:

Add the following iRule to yout iRules LX Workspace. This will make an RPC call to iRules LX, using the plugin 'ilx_pl' and the extension 'ilx_ext' You can however call this what you like providing your update the ILX::init command to reflect this.

when HTTP_REQUEST  {
    # pass argument to ILX in form of a requested JSON object:
    # {"userId": 1,"id": 1,"title": "delectus aut autem","completed": false}
    set arg title
    set ilx_handle [ILX::init "ilx_pl" "ilx_ext"]
    if {[catch {ILX::call $ilx_handle "httpRequest" $arg} result]} {
        log local0.error "Client - [IP::client_addr], ILX failure: $result"
        HTTP::respond 400 content "<html>There has been an error.</html>"
        return
    }
    HTTP::respond 200 content $result
    log local0. "retrieved parsed JSON value for $arg: $result"
}

Use the iRules LX code below for the index.js file, within your workspace

Code :

var https = require("https");
var f5 = require("f5-nodejs");
var ilx = new f5.ILXServer();

function httpRequest (req, res) {
    https.get('https://jsonplaceholder.typicode.com/todos/1', function (resp) {
    var data = '';

    // A chunk of data has been recieved.
    resp.on('data', function (chunk) {
      data += chunk;
    });

    // The whole response has been received. Parse JSON
    resp.on('end', function () {
        res.reply(JSON.parse(data).title);
    });

    }).on("error", function (err) {
      console.log("Error: " + err.message);
    });
}

ilx.addMethod('httpRequest', httpRequest);
ilx.listen();

Tested this on version:

12.1
Updated Jun 06, 2023
Version 2.0