oversip 1.3.8 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -32,8 +32,10 @@ module OverSIP
32
32
  :sip_tls => false,
33
33
  :enable_ipv4 => true,
34
34
  :listen_ipv4 => nil,
35
+ :advertised_ipv4 => nil,
35
36
  :enable_ipv6 => true,
36
37
  :listen_ipv6 => nil,
38
+ :advertised_ipv6 => nil,
37
39
  :listen_port => 5060,
38
40
  :listen_port_tls => 5061,
39
41
  :use_tls_tunnel => false,
@@ -49,8 +51,10 @@ module OverSIP
49
51
  :sip_wss => false,
50
52
  :enable_ipv4 => true,
51
53
  :listen_ipv4 => nil,
54
+ :advertised_ipv4 => nil,
52
55
  :enable_ipv6 => true,
53
56
  :listen_ipv6 => nil,
57
+ :advertised_ipv6 => nil,
54
58
  :listen_port => 10080,
55
59
  :listen_port_tls => 10443,
56
60
  :use_tls_tunnel => false,
@@ -85,8 +89,10 @@ module OverSIP
85
89
  :sip_tls => :boolean,
86
90
  :enable_ipv4 => :boolean,
87
91
  :listen_ipv4 => :ipv4,
92
+ :advertised_ipv4 => :ipv4,
88
93
  :enable_ipv6 => :boolean,
89
94
  :listen_ipv6 => :ipv6,
95
+ :advertised_ipv6 => :ipv6,
90
96
  :listen_port => :port,
91
97
  :listen_port_tls => :port,
92
98
  :use_tls_tunnel => :boolean,
@@ -102,8 +108,10 @@ module OverSIP
102
108
  :sip_wss => :boolean,
103
109
  :enable_ipv4 => :boolean,
104
110
  :listen_ipv4 => :ipv4,
111
+ :advertised_ipv4 => :ipv4,
105
112
  :enable_ipv6 => :boolean,
106
113
  :listen_ipv6 => :ipv6,
114
+ :advertised_ipv6 => :ipv6,
107
115
  :listen_port => :port,
108
116
  :listen_port_tls => :port,
109
117
  :use_tls_tunnel => :boolean,
@@ -280,10 +288,14 @@ module OverSIP
280
288
 
281
289
  unless @configuration[:sip][:enable_ipv4]
282
290
  @configuration[:sip][:listen_ipv4] = nil
291
+ @configuration[:sip][:advertised_ipv4] = nil
292
+ @configuration[:sip][:record_route_hostname_tls_ipv4] = nil
283
293
  end
284
294
 
285
295
  unless @configuration[:sip][:enable_ipv6]
286
296
  @configuration[:sip][:listen_ipv6] = nil
297
+ @configuration[:sip][:advertised_ipv6] = nil
298
+ @configuration[:sip][:record_route_hostname_tls_ipv6] = nil
287
299
  end
288
300
 
289
301
  if @configuration[:websocket][:sip_ws]
@@ -307,10 +319,12 @@ module OverSIP
307
319
 
308
320
  unless @configuration[:websocket][:enable_ipv4]
309
321
  @configuration[:websocket][:listen_ipv4] = nil
322
+ @configuration[:websocket][:advertised_ipv4] = nil
310
323
  end
311
324
 
312
325
  unless @configuration[:websocket][:enable_ipv6]
313
326
  @configuration[:websocket][:listen_ipv6] = nil
327
+ @configuration[:websocket][:advertised_ipv6] = nil
314
328
  end
315
329
 
316
330
  if ( @use_sip_udp_or_tcp or @use_sip_tls ) and @configuration[:sip][:listen_ipv4] == nil and @configuration[:sip][:enable_ipv4]
@@ -1,7 +1,10 @@
1
1
  module OverSIP
2
2
 
3
3
  class Error < ::StandardError ; end
4
+
4
5
  class ConfigurationError < Error ; end
5
6
  class RuntimeError < Error ; end
6
7
 
8
+ class ParsingError < RuntimeError ; end
9
+
7
10
  end
@@ -6,15 +6,27 @@ module OverSIP::Modules
6
6
 
7
7
  @log_id = "OutboundMangling module"
8
8
 
9
- def self.add_outbound_to_contact request
10
- if request.contact and request.connection_outbound_flow_token
11
- log_system_debug "performing Contact mangling (adding ;ov-ob Outbound param) for #{request.log_id}" if $oversip_debug
9
+ def self.add_outbound_to_contact proxy
10
+ unless proxy.is_a? ::OverSIP::SIP::Proxy
11
+ raise ::OverSIP::RuntimeError, "proxy must be a OverSIP::SIP::Proxy instance"
12
+ end
12
13
 
13
- # Add the ;ov-ob param to the Contact URI.
14
- request.contact.set_param "ov-ob", request.connection_outbound_flow_token
15
- return true
16
- else
17
- return false
14
+ proxy.on_target do |target|
15
+ request = proxy.request
16
+ # Just act in case the request has a single Contact, its connection uses Outbound
17
+ # and no ;ov-ob param exists in Contact URI.
18
+ if request.contact and request.connection_outbound_flow_token and not request.contact.has_param? "ov-ob"
19
+ log_system_debug "performing Contact mangling (adding ;ov-ob Outbound param) for #{request.log_id}" if $oversip_debug
20
+
21
+ request.contact.set_param "ov-ob", request.connection_outbound_flow_token
22
+
23
+ proxy.on_success_response do |response|
24
+ if (contacts = response.headers["Contact"])
25
+ log_system_debug "reverting original Contact value (removing ;ov-ob Outbound param) from response" if $oversip_debug
26
+ contacts.each { |contact| contact.gsub! /;ov-ob=[_\-0-9A-Za-z]+/, "" }
27
+ end
28
+ end
29
+ end
18
30
  end
19
31
  end
20
32
 
@@ -39,22 +51,6 @@ module OverSIP::Modules
39
51
  end
40
52
  end
41
53
 
42
- def self.remove_outbound_from_contact message
43
- unless message.is_a? ::OverSIP::SIP::Message
44
- raise ::OverSIP::RuntimeError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
45
- end
46
-
47
- if (contacts = message.headers["Contact"])
48
- log_system_debug "reverting original Contact value (removing ;ov-ob Outbound param) for response" if $oversip_debug
49
- contacts.each do |contact|
50
- contact.gsub! /;ov-ob=[_\-0-9A-Za-z]+/, ""
51
- end
52
- return true
53
- else
54
- return false
55
- end
56
- end
57
-
58
54
  end # module OutboundMangling
59
55
 
60
56
  end
@@ -4,40 +4,86 @@ module OverSIP::SIP
4
4
 
5
5
  include ::OverSIP::Logger
6
6
 
7
- attr_reader :current_target
7
+ attr_reader :request, :current_target
8
8
 
9
9
  def initialize proxy_profile=:default_proxy
10
10
  unless (@conf = ::OverSIP.proxies[proxy_profile.to_sym])
11
11
  raise ::OverSIP::RuntimeError, "proxy profile '#{proxy_profile}' is not defined"
12
12
  end
13
+
14
+ @on_provisional_response_cbs = []
15
+ @on_success_response_cbs = []
16
+ @on_failure_response_cbs = []
17
+ @on_canceled_cbs = []
18
+ @on_invite_timeout_cbs = []
19
+ @on_error_cbs = []
20
+ @on_target_cbs = []
13
21
  end
14
22
 
15
23
  def on_provisional_response &block
16
- @on_provisional_response_block = block
24
+ @on_provisional_response_cbs << block
17
25
  end
18
26
 
19
27
  def on_success_response &block
20
- @on_success_response_block = block
28
+ @on_success_response_cbs << block
21
29
  end
22
30
 
23
31
  def on_failure_response &block
24
- @on_failure_response_block = block
32
+ @on_failure_response_cbs << block
25
33
  end
26
34
 
27
35
  def on_canceled &block
28
- @on_canceled_block = block
36
+ @on_canceled_cbs << block
29
37
  end
30
38
 
31
39
  def on_invite_timeout &block
32
- @on_invite_timeout_block = block
40
+ @on_invite_timeout_cbs << block
33
41
  end
34
42
 
35
43
  def on_error &block
36
- @on_error_block = block
44
+ @on_error_cbs << block
37
45
  end
38
46
 
39
47
  def on_target &block
40
- @on_target_block = block
48
+ @on_target_cbs << block
49
+ end
50
+
51
+ def clear_on_provisional_response
52
+ @on_provisional_response_cbs.clear
53
+ end
54
+
55
+ def clear_on_success_response
56
+ @on_success_response_cbs.clear
57
+ end
58
+
59
+ def clear_on_failure_response
60
+ @on_failure_response_cbs.clear
61
+ end
62
+
63
+ def clear_on_canceled
64
+ @on_canceled_cbs.clear
65
+ end
66
+
67
+ def clear_on_invite_timeout
68
+ @on_invite_timeout_cbs.clear
69
+ end
70
+
71
+ def clear_on_error
72
+ @on_error_cbs.clear
73
+ end
74
+
75
+ def clear_on_target
76
+ @on_target_cbs.clear
77
+ end
78
+
79
+ def clear_callbacks
80
+ @on_provisional_response_cbs.clear
81
+ @on_success_response_cbs.clear
82
+ @on_failure_response_cbs.clear
83
+ @on_canceled_cbs.clear
84
+ @on_invite_timeout_cbs.clear
85
+ @on_error_cbs.clear
86
+ @on_target_cbs.clear
41
87
  end
42
88
 
43
89
  # By calling this method the request routing is aborted, no more DNS targets are tryed,
@@ -104,7 +150,7 @@ module OverSIP::SIP
104
150
 
105
151
  # Timer C for INVITE.
106
152
  def invite_timeout
107
- @on_invite_timeout_block && @on_invite_timeout_block.call
153
+ run_on_invite_timeout_cbs
108
154
  end
109
155
 
110
156
 
@@ -112,6 +158,84 @@ module OverSIP::SIP
112
158
  private
113
159
 
114
160
 
161
+ def run_on_provisional_response_cbs response
162
+ @on_provisional_response_cbs.each do |cb|
163
+ begin
164
+ cb.call response
165
+ rescue => e
166
+ log_system_error "error executing on_provisional_response callback:"
167
+ log_system_error e
168
+ end
169
+ end
170
+ end
171
+
172
+ def run_on_success_response_cbs response
173
+ @on_success_response_cbs.each do |cb|
174
+ begin
175
+ cb.call response
176
+ rescue => e
177
+ log_system_error "error executing on_success_response callback:"
178
+ log_system_error e
179
+ end
180
+ end
181
+ end
182
+
183
+ def run_on_failure_response_cbs response
184
+ @on_failure_response_cbs.each do |cb|
185
+ begin
186
+ cb.call response
187
+ rescue => e
188
+ log_system_error "error executing on_failure_response callback:"
189
+ log_system_error e
190
+ end
191
+ end
192
+ end
193
+
194
+ def run_on_canceled_cbs
195
+ @on_canceled_cbs.each do |cb|
196
+ begin
197
+ cb.call
198
+ rescue => e
199
+ log_system_error "error executing on_canceled callback:"
200
+ log_system_error e
201
+ end
202
+ end
203
+ end
204
+
205
+ def run_on_invite_timeout_cbs
206
+ @on_invite_timeout_cbs.each do |cb|
207
+ begin
208
+ cb.call
209
+ rescue => e
210
+ log_system_error "error executing on_invite_timeout callback:"
211
+ log_system_error e
212
+ end
213
+ end
214
+ end
215
+
216
+ def run_on_error_cbs status, reason, code
217
+ @on_error_cbs.each do |cb|
218
+ begin
219
+ cb.call status, reason, code
220
+ rescue => e
221
+ log_system_error "error executing on_error callback:"
222
+ log_system_error e
223
+ end
224
+ end
225
+ end
226
+
227
+ def run_on_target_cbs target
228
+ @on_target_cbs.each do |cb|
229
+ begin
230
+ cb.call target
231
+ rescue => e
232
+ log_system_error "error executing on_target callback:"
233
+ log_system_error e
234
+ end
235
+ end
236
+ end
237
+
238
+
115
239
  def add_routing_headers
116
240
  end
117
241
 
@@ -236,7 +360,7 @@ module OverSIP::SIP
236
360
  end
237
361
 
238
362
  # Call the on_target() callback if set by the user.
239
- @on_target_block && @on_target_block.call(target)
363
+ run_on_target_cbs target
240
364
 
241
365
  # If the user has called to proxy.abort_routing() then stop next targets
242
366
  # and call to on_error() callback.
@@ -296,7 +420,7 @@ module OverSIP::SIP
296
420
 
297
421
 
298
422
  def do_dns_fail status, reason, code
299
- @on_error_block && @on_error_block.call(status, reason, code)
423
+ run_on_error_cbs status, reason, code
300
424
  end
301
425
 
302
426
  end # class Client
@@ -54,10 +54,15 @@ module OverSIP::SIP
54
54
  case
55
55
 
56
56
  when klass == ::OverSIP::SIP::IPv4UdpServer
57
- klass.via_core = "SIP/2.0/UDP #{uri_ip}:#{port}"
58
- klass.record_route = "<sip:#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
59
- klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
60
- klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
57
+ if ::OverSIP.configuration[:sip][:advertised_ipv4]
58
+ used_uri_host = ::OverSIP.configuration[:sip][:advertised_ipv4]
59
+ else
60
+ used_uri_host = uri_ip
61
+ end
62
+ klass.via_core = "SIP/2.0/UDP #{used_uri_host}:#{port}"
63
+ klass.record_route = "<sip:#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
64
+ klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
65
+ klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
61
66
 
62
67
  if enabled
63
68
  ::EM::open_datagram_socket(ip, port, klass) do |conn|
@@ -66,10 +71,15 @@ module OverSIP::SIP
66
71
  end
67
72
 
68
73
  when klass == ::OverSIP::SIP::IPv6UdpServer
69
- klass.via_core = "SIP/2.0/UDP #{uri_ip}:#{port}"
70
- klass.record_route = "<sip:#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
71
- klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
72
- klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
74
+ if ::OverSIP.configuration[:sip][:advertised_ipv6]
75
+ used_uri_host = "[#{::OverSIP.configuration[:sip][:advertised_ipv6]}]"
76
+ else
77
+ used_uri_host = uri_ip
78
+ end
79
+ klass.via_core = "SIP/2.0/UDP #{used_uri_host}:#{port}"
80
+ klass.record_route = "<sip:#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
81
+ klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
82
+ klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
73
83
 
74
84
  if enabled
75
85
  ::EM::open_datagram_socket(ip, port, klass) do |conn|
@@ -78,10 +88,15 @@ module OverSIP::SIP
78
88
  end
79
89
 
80
90
  when klass == ::OverSIP::SIP::IPv4TcpServer
81
- klass.via_core = "SIP/2.0/TCP #{uri_ip}:#{port}"
82
- klass.record_route = "<sip:#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
83
- klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
84
- klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
91
+ if ::OverSIP.configuration[:sip][:advertised_ipv4]
92
+ used_uri_host = ::OverSIP.configuration[:sip][:advertised_ipv4]
93
+ else
94
+ used_uri_host = uri_ip
95
+ end
96
+ klass.via_core = "SIP/2.0/TCP #{used_uri_host}:#{port}"
97
+ klass.record_route = "<sip:#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
98
+ klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
99
+ klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
85
100
 
86
101
  if enabled
87
102
  ::EM.start_server(ip, port, klass) do |conn|
@@ -91,10 +106,15 @@ module OverSIP::SIP
91
106
  end
92
107
 
93
108
  when klass == ::OverSIP::SIP::IPv6TcpServer
94
- klass.via_core = "SIP/2.0/TCP #{uri_ip}:#{port}"
95
- klass.record_route = "<sip:#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
96
- klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
97
- klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
109
+ if ::OverSIP.configuration[:sip][:advertised_ipv6]
110
+ used_uri_host = "[#{::OverSIP.configuration[:sip][:advertised_ipv6]}]"
111
+ else
112
+ used_uri_host = uri_ip
113
+ end
114
+ klass.via_core = "SIP/2.0/TCP #{used_uri_host}:#{port}"
115
+ klass.record_route = "<sip:#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
116
+ klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
117
+ klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
98
118
 
99
119
  if enabled
100
120
  ::EM.start_server(ip, port, klass) do |conn|
@@ -104,11 +124,17 @@ module OverSIP::SIP
104
124
  end
105
125
 
106
126
  when klass == ::OverSIP::SIP::IPv4TlsServer
107
- klass.via_core = "SIP/2.0/TLS #{uri_ip}:#{port}"
108
- rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4] || uri_ip
109
- klass.record_route = "<sip:#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
110
- klass.outbound_record_route_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
111
- klass.outbound_path_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
127
+ if ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4]
128
+ used_uri_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4]
129
+ elsif ::OverSIP.configuration[:sip][:advertised_ipv4]
130
+ used_uri_host = ::OverSIP.configuration[:sip][:advertised_ipv4]
131
+ else
132
+ used_uri_host = uri_ip
133
+ end
134
+ klass.via_core = "SIP/2.0/TLS #{used_uri_host}:#{port}"
135
+ klass.record_route = "<sip:#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
136
+ klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
137
+ klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
112
138
 
113
139
  if enabled
114
140
  ::EM.start_server(ip, port, klass) do |conn|
@@ -118,11 +144,17 @@ module OverSIP::SIP
118
144
  end
119
145
 
120
146
  when klass == ::OverSIP::SIP::IPv6TlsServer
121
- klass.via_core = "SIP/2.0/TLS #{uri_ip}:#{port}"
122
- rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6] || uri_ip
123
- klass.record_route = "<sip:#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
124
- klass.outbound_record_route_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
125
- klass.outbound_path_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
147
+ if ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6]
148
+ used_uri_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6]
149
+ elsif ::OverSIP.configuration[:sip][:advertised_ipv6]
150
+ used_uri_host = "[#{::OverSIP.configuration[:sip][:advertised_ipv6]}]"
151
+ else
152
+ used_uri_host = uri_ip
153
+ end
154
+ klass.via_core = "SIP/2.0/TLS #{used_uri_host}:#{port}"
155
+ klass.record_route = "<sip:#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
156
+ klass.outbound_record_route_fragment = "@#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
157
+ klass.outbound_path_fragment = "@#{used_uri_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
126
158
 
127
159
  if enabled
128
160
  ::EM.start_server(ip, port, klass) do |conn|
@@ -132,12 +164,18 @@ module OverSIP::SIP
132
164
  end
133
165
 
134
166
  when klass == ::OverSIP::SIP::IPv4TlsTunnelServer
135
- klass.via_core = "SIP/2.0/TLS #{uri_virtual_ip}:#{virtual_port}"
136
- rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4] || uri_virtual_ip
137
- klass.record_route = "<sip:#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
138
- klass.outbound_record_route_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
139
- klass.outbound_path_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
140
-
167
+ if ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4]
168
+ used_uri_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4]
169
+ elsif ::OverSIP.configuration[:sip][:advertised_ipv4]
170
+ used_uri_host = ::OverSIP.configuration[:sip][:advertised_ipv4]
171
+ else
172
+ used_uri_host = uri_virtual_ip
173
+ end
174
+ klass.via_core = "SIP/2.0/TLS #{used_uri_host}:#{virtual_port}"
175
+ klass.record_route = "<sip:#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
176
+ klass.outbound_record_route_fragment = "@#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
177
+ klass.outbound_path_fragment = "@#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
178
+
141
179
  if enabled
142
180
  ::EM.start_server(ip, port, klass) do |conn|
143
181
  conn.post_connection
@@ -146,12 +184,18 @@ module OverSIP::SIP
146
184
  end
147
185
 
148
186
  when klass == ::OverSIP::SIP::IPv6TlsTunnelServer
149
- klass.via_core = "SIP/2.0/TLS #{uri_virtual_ip}:#{virtual_port}"
150
- rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6] || uri_virtual_ip
151
- klass.record_route = "<sip:#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
152
- klass.outbound_record_route_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
153
- klass.outbound_path_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
154
-
187
+ if ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6]
188
+ used_uri_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6]
189
+ elsif ::OverSIP.configuration[:sip][:advertised_ipv6]
190
+ used_uri_host = "[#{::OverSIP.configuration[:sip][:advertised_ipv6]}]"
191
+ else
192
+ used_uri_host = uri_virtual_ip
193
+ end
194
+ klass.via_core = "SIP/2.0/TLS #{used_uri_host}:#{virtual_port}"
195
+ klass.record_route = "<sip:#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
196
+ klass.outbound_record_route_fragment = "@#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
197
+ klass.outbound_path_fragment = "@#{used_uri_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
198
+
155
199
  if enabled
156
200
  ::EM.start_server(ip, port, klass) do |conn|
157
201
  conn.post_connection
@@ -4,6 +4,14 @@ module OverSIP::SIP
4
4
 
5
5
  attr_reader :display_name
6
6
 
7
+
8
+ def self.parse value
9
+ name_addr = ::OverSIP::SIP::MessageParser.parse_uri value, true
10
+ raise ::OverSIP::ParsingError, "invalid NameAddr #{value.inspect}" unless name_addr.is_a? (::OverSIP::SIP::NameAddr)
11
+ name_addr
12
+ end
13
+
14
+
7
15
  def initialize display_name=nil, scheme=:sip, user=nil, host=nil, port=nil
8
16
  @display_name = display_name
9
17
  @scheme = scheme.to_sym
@@ -2,9 +2,18 @@ module OverSIP::SIP
2
2
 
3
3
  class Proxy < Client
4
4
 
5
- # If called, current response within the called callback won't be forwarded.
6
- def drop_response
5
+ # If a SIP response is given then this method may offer other features such as replying 199.
6
+ def drop_response response=nil
7
7
  @drop_response = true
8
+
9
+ # RFC 6228 (199 response).
10
+ # http://tools.ietf.org/html/rfc6228#section-6
11
+ if response and response.status_code >= 300 and
12
+ @request.sip_method == :INVITE and
13
+ @request.supported and @request.supported.include?("199")
14
+
15
+ @request.send :reply_199, response
16
+ end
8
17
  end
9
18
 
10
19
 
@@ -45,7 +54,7 @@ module OverSIP::SIP
45
54
  unless @request.sip_method == :ACK
46
55
  log_system_debug "flow failed" if $oversip_debug
47
56
 
48
- @on_error_block && @on_error_block.call(430, "Flow Failed", :flow_failed)
57
+ run_on_error_cbs 430, "Flow Failed", :flow_failed
49
58
  unless @drop_response
50
59
  @request.reply 430, "Flow Failed"
51
60
  else
@@ -116,9 +125,9 @@ module OverSIP::SIP
116
125
 
117
126
  if @request.server_transaction.valid_response? response.status_code
118
127
  if response.status_code < 200 && ! @canceled
119
- @on_provisional_response_block && @on_provisional_response_block.call(response)
128
+ run_on_provisional_response_cbs response
120
129
  elsif response.status_code >= 200 && response.status_code <= 299
121
- @on_success_response_block && @on_success_response_block.call(response)
130
+ run_on_success_response_cbs response
122
131
  elsif response.status_code >= 300 && ! @canceled
123
132
  if response.status_code == 503
124
133
  if @conf[:dns_failover_on_503]
@@ -127,10 +136,10 @@ module OverSIP::SIP
127
136
  else
128
137
  # If the response is 503 convert it into 500 (RFC 3261 16.7).
129
138
  response.status_code = 500
130
- @on_failure_response_block && @on_failure_response_block.call(response)
139
+ run_on_failure_response_cbs response
131
140
  end
132
141
  else
133
- @on_failure_response_block && @on_failure_response_block.call(response)
142
+ run_on_failure_response_cbs response
134
143
  end
135
144
  end
136
145
  end
@@ -148,7 +157,7 @@ module OverSIP::SIP
148
157
  log_system_debug "server transaction canceled, cancelling pending client transaction" if $oversip_debug
149
158
 
150
159
  @canceled = true
151
- @on_canceled_block && @on_canceled_block.call
160
+ run_on_canceled_cbs
152
161
 
153
162
  @client_transaction.do_cancel cancel
154
163
  end
@@ -156,7 +165,7 @@ module OverSIP::SIP
156
165
 
157
166
  # Timer C for INVITE (method called by the client transaction).
158
167
  def invite_timeout
159
- @on_invite_timeout_block && @on_invite_timeout_block.call
168
+ run_on_invite_timeout_cbs
160
169
 
161
170
  unless @drop_response
162
171
  @request.reply 408, "INVITE Timeout"
@@ -275,9 +284,9 @@ module OverSIP::SIP
275
284
 
276
285
 
277
286
  def no_more_targets status, reason, full_response, code
278
- # If we have received a [3456]XX response from downstream then run @on_failure_block.
287
+ # If we have received a [3456]XX response from downstream then run @on_failure_response_cbs.
279
288
  if full_response
280
- @on_failure_response_block && @on_failure_response_block.call(full_response)
289
+ run_on_failure_response_cbs full_response
281
290
  unless @drop_response
282
291
  # If the response is 503 convert it into 500 (RFC 3261 16.7).
283
292
  full_response.status_code = 500 if full_response.status_code == 503
@@ -288,7 +297,7 @@ module OverSIP::SIP
288
297
 
289
298
  # If not, generate the response according to the given status and reason.
290
299
  else
291
- @on_error_block && @on_error_block.call(status, reason, code)
300
+ run_on_error_cbs status, reason, code
292
301
  unless @drop_response
293
302
  @request.reply status, reason
294
303
  else
@@ -300,7 +309,7 @@ module OverSIP::SIP
300
309
 
301
310
 
302
311
  def do_dns_fail status, reason, code
303
- @on_error_block && @on_error_block.call(status, reason, code)
312
+ run_on_error_cbs status, reason, code
304
313
 
305
314
  unless @drop_response
306
315
  @request.reply status, reason unless @request.sip_method == :ACK