lib/oversip/sip/client.rb in oversip-1.3.8 vs lib/oversip/sip/client.rb in oversip-1.4.0

- old
+ new

@@ -2,46 +2,92 @@ class Client include ::OverSIP::Logger - attr_reader :current_target + attr_reader :request, :current_target def initialize proxy_profile=:default_proxy unless (@conf = ::OverSIP.proxies[proxy_profile.to_sym]) raise ::OverSIP::RuntimeError, "proxy profile '#{proxy_profile}' is not defined" end + + @on_provisional_response_cbs = [] + @on_success_response_cbs = [] + @on_failure_response_cbs = [] + @on_canceled_cbs = [] + @on_invite_timeout_cbs = [] + @on_error_cbs = [] + @on_target_cbs = [] end def on_provisional_response &block - @on_provisional_response_block = block + @on_provisional_response_cbs << block end def on_success_response &block - @on_success_response_block = block + @on_success_response_cbs << block end def on_failure_response &block - @on_failure_response_block = block + @on_failure_response_cbs << block end def on_canceled &block - @on_canceled_block = block + @on_canceled_cbs << block end def on_invite_timeout &block - @on_invite_timeout_block = block + @on_invite_timeout_cbs << block end def on_error &block - @on_error_block = block + @on_error_cbs << block end def on_target &block - @on_target_block = block + @on_target_cbs << block end + def clear_on_provisional_response + @on_provisional_response_cbs.clear + end + + def clear_on_success_response + @on_success_response_cbs.clear + end + + def clear_on_failure_response + @on_failure_response_cbs.clear + end + + def clear_on_canceled + @on_canceled_cbs.clear + end + + def clear_on_invite_timeout + @on_invite_timeout_cbs.clear + end + + def clear_on_error + @on_error_cbs.clear + end + + def clear_on_target + @on_target_cbs.clear + end + + def clear_callbacks + @on_provisional_response_cbs.clear + @on_success_response_cbs.clear + @on_failure_response_cbs.clear + @on_canceled_cbs.clear + @on_invite_timeout_cbs.clear + @on_error_cbs.clear + @on_target_cbs.clear + end + # By calling this method the request routing is aborted, no more DNS targets are tryed, # a local 403 response is generated and on_error() callback is called with status 403. def abort_routing @aborted = true end @@ -102,18 +148,96 @@ try_next_target 500, "TLS Validation Failed", nil, :tls_validation_failed end # Timer C for INVITE. def invite_timeout - @on_invite_timeout_block && @on_invite_timeout_block.call + run_on_invite_timeout_cbs end private + def run_on_provisional_response_cbs response + @on_provisional_response_cbs.each do |cb| + begin + cb.call response + rescue => e + log_system_error "error executing on_provisional_response callback:" + log_system_error e + end + end + end + + def run_on_success_response_cbs response + @on_success_response_cbs.each do |cb| + begin + cb.call response + rescue => e + log_system_error "error executing on_success_response callback:" + log_system_error e + end + end + end + + def run_on_failure_response_cbs response + @on_failure_response_cbs.each do |cb| + begin + cb.call response + rescue => e + log_system_error "error executing on_failure_response callback:" + log_system_error e + end + end + end + + def run_on_canceled_cbs + @on_canceled_cbs.each do |cb| + begin + cb.call + rescue => e + log_system_error "error executing on_canceled callback:" + log_system_error e + end + end + end + + def run_on_invite_timeout_cbs + @on_invite_timeout_cbs.each do |cb| + begin + cb.call + rescue => e + log_system_error "error executing on_invite_timeout callback:" + log_system_error e + end + end + end + + def run_on_error_cbs status, reason, code + @on_error_cbs.each do |cb| + begin + cb.call status, reason, code + rescue => e + log_system_error "error executing on_error callback:" + log_system_error e + end + end + end + + def run_on_target_cbs target + @on_target_cbs.each do |cb| + begin + cb.call target + rescue => e + log_system_error "error executing on_target callback:" + log_system_error e + end + end + end + + def add_routing_headers end # Check the given URI into the DNS cache. @@ -234,11 +358,11 @@ try_next_target blacklist_entry[0], blacklist_entry[1], blacklist_entry[2], blacklist_entry[3] return end # Call the on_target() callback if set by the user. - @on_target_block && @on_target_block.call(target) + run_on_target_cbs target # If the user has called to proxy.abort_routing() then stop next targets # and call to on_error() callback. if @aborted log_system_notice "routing aborted for target #{target}" @@ -294,10 +418,10 @@ do_dns_fail status, reason, code end # def rfc3263_failed def do_dns_fail status, reason, code - @on_error_block && @on_error_block.call(status, reason, code) + run_on_error_cbs status, reason, code end end # class Client end \ No newline at end of file