Forum Discussion

EM's avatar
EM
Icon for Nimbostratus rankNimbostratus
Feb 02, 2018

HTTP Response from ILXPlugin

Hi DevCentral community!

 

I am currently trying to develop an iRule ILXPlugin, which checks a client HTTP request for certain properties. If some condiditions don't match I would like to send an HTTP response error message from the ILXPlugin to the client (without further forwarding to the backend). If everything is valid I want to forward it to the respective backend pool member.

 

Unfortunately, the ILXTransaction does not provide any real examples (other than the description) on how to use the methods respond and replaceBody to achieve this use case.

 

You can find my current code below, whereas I am trying to send a response with a custom html body and HTTP status code 404:

 

'use strict';

var f5 = require('f5-nodejs');
var plugin = new f5.ILXPlugin();
var options = new f5.ILXPluginOptions();
options.handleServerData = false;
options.handleServerResponse = false;
options.handleClientData = false;
options.handleClientOpen = true;


plugin.on('initialized', function () {
    console.log('INITIALIZED');
});


plugin.on('connect', function(flow) {
    var tmmID = flow.tmmId();
    var clientSourceAddress = flow.client.remoteAddress;

    flow.client.on('requestComplete', function(request) {
        var destinationHost = request.params.headers.host;
        var requestMethod = request.params.method;

        // Example
        if(requestMethod === 'POST') {
            request.replaceBody();
            request.respond();

            // Send response with body: 'ERROR RESPONSE!' and Status Code '404'

            flow.client.end();
        }

        var options = new f5.ILXLbOptions();
        options.pool = '/Common/api_pool';
        flow.lbSelect(options);

        flow.client.allow();
        request.complete();
    });

    flow.client.on('error', function(errorText) {
        console.error('client error event: ' + errorText);
    });
    flow.server.on('error', function(errorText) {
        console.error('server error event: ' + errorText);
    });
    flow.on('error', function(errorText) {
        console.error('flow error event: ' + errorText);
    });
});


plugin.start(options);

I would appreciate any suggestions.

 

Thank you in advance.

 

  • Hi Niels!

     

    Thanks a lot for your working example code.

     

    Is there also an option to send a custom response (e.g. 404 Not Found) back to the client, instead of replying with 200 OK?

     

    • gkor_nova's avatar
      gkor_nova
      Icon for Nimbostratus rankNimbostratus

      +1
      I have the same question.
      Is there any feture request for that?

  • +2.5
    It's the same problem for me too. flow.client.end or flow.client.write both send back HTTP result code 200 and I don't see a way to change this. Docs do mention that the response object has response.params.status but the scenario here is not to send the request to the backend but to reply directly from the LBA.