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