Examples

March 26, 2020 Contributors

The following Lua example temp fails all the MM7 response with StatusCode not equal to 1000, and re-route the message submission:

local mod = {};
require("msys.core");
require("msys.extended.message_routing");
require("msys.mms");  -- required module defines return value of msys.mms.MM7_TEMP_FAIL

function mod:mm7_handle_submitRsp(msg)
  local statusCode = msys.core.ec_message_context_get(msg, msys.core.ECMESS_CTX_MESS,
    "MM7_Response_Status");
  print ("MM7 Response status is ", statusCode);
  if (statusCode != 2000) then
    print("rerouting message to example.org");
    msys.core.ec_message_context_set(msg, msys.core.ECMESS_CTX_MESS,
      "MM7_Response_Status_Detail", "Hook force tempfail to re-route the message");
    msg:routing_domain("example.org");              -- reroute to destinate domain example.org
    msg:rcptto("[email protected]");                -- reroute to recipient [email protected]
    return msys.mms.MM7_TEMP_FAIL;
  else
    return msys.mms.MM7_CONTINUE;
  end
end

msys.registerModule("mm7_response_hooks_tests", mod);

The following C hook does the same as the Lua implementation above:

#include "module.h"
#include "modules/mobility/mms/hooks/mm7_message_hooks.h"
#include "modules/mobility/mms/mm7.h"

static int sample_mm7_handle_submitRsp_hook(void *gself, ec_message* m)
{
  const char* status = ec_message_context_get(m, ECMESS_CTX_MESS, VCTX_KEY_MM7_RESPONSE_STATUS);
  if (strcmp(status, "1000")) {
    ec_mod_debug(gself, DDEBUG, "MM7 HOOK TEST: received response status code %s.
      Reroute the message!\n", status);
    ec_message_context_set(m, ECMESS_CTX_MESS, VCTX_KEY_MM7_RESPONSE_STATUS_DETAIL,
      "Hook force tempfail to re-route the message");
    ec_message_assign_domain_by_name(m, "example.org");
    ec_message_set_rcptto(m, "[email protected]", sizeof("[email protected]"), 0);
    return MM7_TEMP_FAIL;
  } else
    return MM7_CONTINUE;
}

static int init (generic_module_infrastructure *gself) {
  /* register the hook during module initialization */
  register_mm7_handle_submitRsp_hook_first (sample_mm7_handle_submitRsp_hook, gself);
  return 0;
}

EC_MODULE_EXPORT
generic_module_infrastructure mm7_hook_test = {
  {
    EC_MODULE_INIT(EC_MODULE_TYPE_GENERIC, 0),
    "mm7_hook_test.c",
    "Sample MM7 Hook",
    NULL,
    NULL,
    NULL,
    init,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL
  }
};