Thank you for quick response! But when I leave suspending enabled ($http_req(suspend) = 1, default) the call logic does not work, when after receiving a register (with id_index and id_label) from party B, the call should continue. I built this functionality based on your presentation https://www.voztovoice.org/sites/default/files/KamilioWorld2015%20-Federico..... I’ll give you my routes so that the picture is complete: request_route { ... if (is_method("INVITE")) { #Push notification route(SUSPEND); } ... }
# Handle SIP registrations route[REGISTRAR] { if (!is_method("REGISTER")) return; ... if (!save("location")) { sl_reply_error(); } ... #Push notification if ( (is_method("REGISTER")) && (($hdr(Expires) != "0") || !(($hdr(Contact) =~ "expires=0"))) && ($hdr(id_index) != "" && $hdr(id_label) != "") ) { xlog("L_INFO", "New $rm ru=$ru tu=$tu \n"); route(JOIN); }
exit; }
#Push notification route[SUSPEND] { if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE"); send_reply("100", "Suspending"); if ( !t_suspend() ) { xlog("L_ERROR","[SUSPEND] failed suspending trasaction [$T(id_index):$T(id_label)]\n"); send_reply("501", "Suspending error"); exit; } xlog("L_INFO","[SUSPEND] suspended transaction [$T(id_index):$T(id_label)] $fU=> $rU\n"); $sht(vtp=>join::$rU) = "" + $T(id_index) + ":" + $T(id_label); route(SENDPUSH); exit;
}
route[SENDPUSH] { sl_send_reply("100", "Pushing"); $http_req(suspend) = 0; $http_req(body) = '{ "caller": "' + $fU + '", "phone": "' + $rU + '", "id_index": "' + $T(id_index) + '", "id_label": "' + $T(id_label)+ '", "call_type": "'+ $var(calltype) +'" }'; #for apple sandbox test. if (is_user_in("Request-URI", "test")) { http_async_query("http://127.0.0.1:9996/notification/", "HTTP_REPLY"); } http_async_query("http://127.0.0.1:9999/notification/", "HTTP_REPLY"); }
#Resuming transaction. route[JOIN] { xlog("L_INFO","[JOIN] from REGISTER key value [$hdr(id_index) -- $hdr(id_label)]\n"); $var(hjoin) = 0; lock("$tU"); $var(hjoin) = $sht(vtp=>join::$tU); $var(hstored) = $sht(vtp=>stored::$tU); $sht(vtp=>join::$tU) = $null; $var(id_index) = $(var(hjoin){s.select,0,:}{s.int}); $var(id_label) = $(var(hjoin){s.select,1,:}{s.int}); unlock("$tU"); if($var(id_index)!=$null){ if ($var(hjoin)==0) { xlog("L_INFO","do ts_append_to() for $tu and hstored = $var(hstored)\n"); if ($var(hstored)) { ts_append_to("$(hdr(id_index){s.int})", "$(hdr(id_label){s.int})", "location"); xlog("L_INFO","do ts_append_to() for $tu end \n"); } return; } xlog("L_INFO","resuming trasaction [$(hdr(id_index){s.int}):$(hdr(id_label){s.int})] $tU ($var(hjoin))\n"); if ( !t_continue("$(hdr(id_index){s.int})", "$(hdr(id_label){s.int})", "LOCATION") ){ send_reply("404", "CALL NOT FOUND"); } } }
#processing HTTP responses route[HTTP_REPLY] { if ($http_ok && $http_rs == 200) { xlog("L_INFO", "route[HTTP_REPLY]: status $http_rs\n"); xlog("L_INFO", "route[HTTP_REPLY]: body $http_rb\n"); } else if($http_rs == 415 || $http_rs == "415") { xlog("L_ERR", "route[HTTP_REPLY]: caller: $fU phone: $ru error: $http_err)\n"); sl_send_reply("415", "The other party does not support video calling!"); } else { xlog("L_ALERT", "route[HTTP_REPLY]: error $http_err)\n"); } #exit; }