oversip_p 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +22 -0
  3. data/LICENSE +25 -0
  4. data/README.md +43 -0
  5. data/Rakefile +54 -0
  6. data/bin/oversip +184 -0
  7. data/etc/oversip.conf +274 -0
  8. data/etc/proxies.conf +145 -0
  9. data/etc/server.rb +315 -0
  10. data/etc/tls/ca/cacert.pem +3894 -0
  11. data/etc/tls/demo-tls.oversip.net.crt +17 -0
  12. data/etc/tls/demo-tls.oversip.net.key +15 -0
  13. data/etc/tls/upgrade-cacert.sh +12 -0
  14. data/etc/tls/utils/create-cert.rb +162 -0
  15. data/etc/tls/utils/get-sip-identities.rb +95 -0
  16. data/ext/common/c_util.h +74 -0
  17. data/ext/common/ruby_c_util.h +88 -0
  18. data/ext/sip_parser/common_headers.h +210 -0
  19. data/ext/sip_parser/ext_help.h +18 -0
  20. data/ext/sip_parser/extconf.rb +3 -0
  21. data/ext/sip_parser/sip_message_parser.c +29741 -0
  22. data/ext/sip_parser/sip_parser.h +250 -0
  23. data/ext/sip_parser/sip_parser_ruby.c +1370 -0
  24. data/ext/sip_parser/sip_uri_parser.c +39699 -0
  25. data/ext/stud/extconf.rb +43 -0
  26. data/ext/stun/ext_help.h +16 -0
  27. data/ext/stun/extconf.rb +3 -0
  28. data/ext/stun/stun_ruby.c +394 -0
  29. data/ext/utils/ext_help.h +14 -0
  30. data/ext/utils/extconf.rb +3 -0
  31. data/ext/utils/haproxy_protocol.c +6163 -0
  32. data/ext/utils/haproxy_protocol.h +27 -0
  33. data/ext/utils/ip_utils.c +5952 -0
  34. data/ext/utils/ip_utils.h +64 -0
  35. data/ext/utils/outbound_utils.c +3227 -0
  36. data/ext/utils/outbound_utils.h +27 -0
  37. data/ext/utils/utils_ruby.c +392 -0
  38. data/ext/utils/utils_ruby.h +76 -0
  39. data/ext/websocket_framing_utils/ext_help.h +18 -0
  40. data/ext/websocket_framing_utils/extconf.rb +3 -0
  41. data/ext/websocket_framing_utils/ws_framing_utils.h +47 -0
  42. data/ext/websocket_framing_utils/ws_framing_utils_ruby.c +135 -0
  43. data/ext/websocket_http_parser/ext_help.h +18 -0
  44. data/ext/websocket_http_parser/extconf.rb +3 -0
  45. data/ext/websocket_http_parser/ws_http_parser.c +1635 -0
  46. data/ext/websocket_http_parser/ws_http_parser.h +87 -0
  47. data/ext/websocket_http_parser/ws_http_parser_ruby.c +630 -0
  48. data/lib/oversip/config.rb +597 -0
  49. data/lib/oversip/config_validators.rb +126 -0
  50. data/lib/oversip/default_server.rb +52 -0
  51. data/lib/oversip/errors.rb +10 -0
  52. data/lib/oversip/fiber_pool.rb +56 -0
  53. data/lib/oversip/launcher.rb +635 -0
  54. data/lib/oversip/logger.rb +84 -0
  55. data/lib/oversip/modules/outbound_mangling.rb +56 -0
  56. data/lib/oversip/modules/user_assertion.rb +73 -0
  57. data/lib/oversip/proxies_config.rb +189 -0
  58. data/lib/oversip/ruby_ext/eventmachine.rb +38 -0
  59. data/lib/oversip/sip/client.rb +428 -0
  60. data/lib/oversip/sip/client_transaction.rb +586 -0
  61. data/lib/oversip/sip/constants.rb +88 -0
  62. data/lib/oversip/sip/core.rb +217 -0
  63. data/lib/oversip/sip/launcher.rb +221 -0
  64. data/lib/oversip/sip/listeners/connection.rb +54 -0
  65. data/lib/oversip/sip/listeners/ipv4_tcp_client.rb +21 -0
  66. data/lib/oversip/sip/listeners/ipv4_tcp_server.rb +22 -0
  67. data/lib/oversip/sip/listeners/ipv4_tls_client.rb +21 -0
  68. data/lib/oversip/sip/listeners/ipv4_tls_server.rb +22 -0
  69. data/lib/oversip/sip/listeners/ipv4_tls_tunnel_server.rb +22 -0
  70. data/lib/oversip/sip/listeners/ipv4_udp_server.rb +21 -0
  71. data/lib/oversip/sip/listeners/ipv6_tcp_client.rb +21 -0
  72. data/lib/oversip/sip/listeners/ipv6_tcp_server.rb +22 -0
  73. data/lib/oversip/sip/listeners/ipv6_tls_client.rb +21 -0
  74. data/lib/oversip/sip/listeners/ipv6_tls_server.rb +22 -0
  75. data/lib/oversip/sip/listeners/ipv6_tls_tunnel_server.rb +22 -0
  76. data/lib/oversip/sip/listeners/ipv6_udp_server.rb +21 -0
  77. data/lib/oversip/sip/listeners/tcp_client.rb +97 -0
  78. data/lib/oversip/sip/listeners/tcp_connection.rb +202 -0
  79. data/lib/oversip/sip/listeners/tcp_server.rb +71 -0
  80. data/lib/oversip/sip/listeners/tls_client.rb +125 -0
  81. data/lib/oversip/sip/listeners/tls_server.rb +88 -0
  82. data/lib/oversip/sip/listeners/tls_tunnel_connection.rb +89 -0
  83. data/lib/oversip/sip/listeners/tls_tunnel_server.rb +61 -0
  84. data/lib/oversip/sip/listeners/udp_connection.rb +214 -0
  85. data/lib/oversip/sip/listeners.rb +24 -0
  86. data/lib/oversip/sip/message.rb +177 -0
  87. data/lib/oversip/sip/message_processor.rb +213 -0
  88. data/lib/oversip/sip/name_addr.rb +51 -0
  89. data/lib/oversip/sip/proxy.rb +324 -0
  90. data/lib/oversip/sip/request.rb +179 -0
  91. data/lib/oversip/sip/response.rb +37 -0
  92. data/lib/oversip/sip/rfc3263.rb +643 -0
  93. data/lib/oversip/sip/server_transaction.rb +295 -0
  94. data/lib/oversip/sip/sip.rb +76 -0
  95. data/lib/oversip/sip/tags.rb +39 -0
  96. data/lib/oversip/sip/timers.rb +55 -0
  97. data/lib/oversip/sip/transport_manager.rb +130 -0
  98. data/lib/oversip/sip/uac.rb +89 -0
  99. data/lib/oversip/sip/uac_request.rb +84 -0
  100. data/lib/oversip/sip/uri.rb +208 -0
  101. data/lib/oversip/syslog.rb +68 -0
  102. data/lib/oversip/system_callbacks.rb +45 -0
  103. data/lib/oversip/tls.rb +172 -0
  104. data/lib/oversip/utils.rb +30 -0
  105. data/lib/oversip/version.rb +21 -0
  106. data/lib/oversip/websocket/constants.rb +55 -0
  107. data/lib/oversip/websocket/http_request.rb +59 -0
  108. data/lib/oversip/websocket/launcher.rb +183 -0
  109. data/lib/oversip/websocket/listeners/connection.rb +51 -0
  110. data/lib/oversip/websocket/listeners/ipv4_ws_server.rb +22 -0
  111. data/lib/oversip/websocket/listeners/ipv4_wss_server.rb +22 -0
  112. data/lib/oversip/websocket/listeners/ipv4_wss_tunnel_server.rb +22 -0
  113. data/lib/oversip/websocket/listeners/ipv6_ws_server.rb +22 -0
  114. data/lib/oversip/websocket/listeners/ipv6_wss_server.rb +22 -0
  115. data/lib/oversip/websocket/listeners/ipv6_wss_tunnel_server.rb +22 -0
  116. data/lib/oversip/websocket/listeners/ws_server.rb +331 -0
  117. data/lib/oversip/websocket/listeners/wss_server.rb +88 -0
  118. data/lib/oversip/websocket/listeners/wss_tunnel_server.rb +133 -0
  119. data/lib/oversip/websocket/listeners.rb +13 -0
  120. data/lib/oversip/websocket/websocket.rb +13 -0
  121. data/lib/oversip/websocket/ws_framing.rb +545 -0
  122. data/lib/oversip/websocket/ws_sip_app.rb +120 -0
  123. data/lib/oversip.rb +127 -0
  124. data/test/oversip_test_helper.rb +19 -0
  125. data/test/test_http_parser.rb +73 -0
  126. data/test/test_name_addr.rb +27 -0
  127. data/test/test_name_addr_parser.rb +24 -0
  128. data/test/test_sip_message_parser.rb +168 -0
  129. data/test/test_sip_uri_parser.rb +56 -0
  130. data/test/test_uri.rb +68 -0
  131. data/thirdparty/stud/stud.tar.gz +0 -0
  132. metadata +334 -0
@@ -0,0 +1,84 @@
1
+ module OverSIP
2
+
3
+ # Logging client module. Any class desiring to log messages must include (or extend) this module.
4
+ # In order to identify itself in the logs, the class can define log_id() method or set @log_id
5
+ # attribute.
6
+ module Logger
7
+
8
+ def self.load_methods
9
+ ::Syslog.close if ::Syslog.opened?
10
+
11
+ syslog_options = ::Syslog::LOG_PID | ::Syslog::LOG_NDELAY
12
+ syslog_facility = ::OverSIP::Syslog::SYSLOG_FACILITY_MAPPING[::OverSIP.configuration[:core][:syslog_facility]] rescue ::Syslog::LOG_DAEMON
13
+ ::Syslog.open(::OverSIP.master_name, syslog_options, syslog_facility)
14
+
15
+ begin
16
+ @@threshold = ::OverSIP::Syslog::SYSLOG_SEVERITY_MAPPING[::OverSIP.configuration[:core][:syslog_level]]
17
+ rescue
18
+ @@threshold = 0 # debug.
19
+ end
20
+
21
+ $oversip_debug = ( @@threshold == 0 ? true : false )
22
+
23
+ ::OverSIP::Syslog::SYSLOG_SEVERITY_MAPPING.each do |level_str, level_value|
24
+ method_str = "
25
+ def log_system_#{level_str}(msg)
26
+ "
27
+
28
+ method_str << "
29
+ return false if @@threshold > #{level_value}
30
+
31
+ ::OverSIP::Syslog.log #{level_value}, msg, log_id, false
32
+ "
33
+
34
+ if not ::OverSIP.daemonized?
35
+ if %w{debug info notice}.include? level_str
36
+ method_str << "
37
+ puts ::OverSIP::Logger.fg_system_msg2str('#{level_str}', msg, log_id)
38
+ "
39
+ else
40
+ method_str << "
41
+ $stderr.puts ::OverSIP::Logger.fg_system_msg2str('#{level_str}', msg, log_id)
42
+ "
43
+ end
44
+ end
45
+
46
+ method_str << "end"
47
+
48
+ self.module_eval method_str
49
+
50
+
51
+ # User logs.
52
+ method_str = "
53
+ def log_#{level_str}(msg)
54
+ return false if @@threshold > #{level_value}
55
+
56
+ ::OverSIP::Syslog.log #{level_value}, msg, log_id, true
57
+ end
58
+ "
59
+
60
+ self.module_eval method_str
61
+
62
+ end # .each
63
+ end
64
+
65
+ def self.fg_system_msg2str(level_str, msg, log_id)
66
+ case msg
67
+ when ::String
68
+ "#{level_str.upcase}: <#{log_id}> " << msg
69
+ when ::Exception
70
+ "#{level_str.upcase}: <#{log_id}> #{msg.message} (#{msg.class })\n#{(msg.backtrace || [])[0..3].join("\n")}"
71
+ else
72
+ "#{level_str.upcase}: <#{log_id}> " << msg.inspect
73
+ end
74
+ end
75
+
76
+ # Default logging identifier is the class name. If log_id() method is redefined by the
77
+ # class including this module, or it sets @log_id, then such a value takes preference.
78
+ def log_id
79
+ @log_id ||= (self.is_a?(::Module) ? self.name.split("::").last : self.class.name)
80
+ end
81
+
82
+ end # module Logger
83
+
84
+ end
@@ -0,0 +1,56 @@
1
+ module OverSIP::Modules
2
+
3
+ module OutboundMangling
4
+
5
+ extend ::OverSIP::Logger
6
+
7
+ @log_id = "OutboundMangling module"
8
+
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
13
+
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
30
+ end
31
+ end
32
+
33
+ def self.extract_outbound_from_ruri request
34
+ # Do nothing if the request already contains a Route header with the Outbound flow token (so
35
+ # the registrar *does* support Path).
36
+ unless request.incoming_outbound_requested?
37
+ if (ov_ob = request.ruri.del_param("ov-ob"))
38
+ log_system_debug "incoming Outbound flow token extracted from ;ov-ob param in RURI for #{request.log_id}" if $oversip_debug
39
+ request.route_outbound_flow_token = ov_ob
40
+ request.incoming_outbound_requested = true
41
+ return true
42
+ else
43
+ return false
44
+ end
45
+
46
+ else
47
+ # If the request already contains a proper Outbound Route header, then at least try to remove
48
+ # the ;ov-ob param from the RURI.
49
+ request.ruri.del_param("ov-ob")
50
+ return false
51
+ end
52
+ end
53
+
54
+ end # module OutboundMangling
55
+
56
+ end
@@ -0,0 +1,73 @@
1
+ module OverSIP::Modules
2
+
3
+ module UserAssertion
4
+
5
+ extend ::OverSIP::Logger
6
+
7
+ @log_id = "UserAssertion module"
8
+
9
+ def self.assert_connection message
10
+ case message
11
+ when ::OverSIP::SIP::Request
12
+ request = message
13
+ when ::OverSIP::SIP::Response
14
+ request = message.request
15
+ else
16
+ raise ::OverSIP::RuntimeError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
17
+ end
18
+
19
+ # Don't do this stuf for UDP or for outbound connections.
20
+ return false unless request.connection.class.reliable_transport_listener?
21
+ # Return if already set.
22
+ return request.cvars[:asserted_user] if request.cvars[:asserted_user]
23
+ # Don't do this stuf in case of P-Preferred-Identity header is present.
24
+ return false if request.headers["P-Preferred-Identity"]
25
+
26
+ log_system_debug "user #{request.from.uri} asserted to connection" if $oversip_debug
27
+ # Store the request From URI as "asserted_user" for this connection.
28
+ request.cvars[:asserted_user] = request.from.uri
29
+ end
30
+
31
+ def self.revoke_assertion message
32
+ case message
33
+ when ::OverSIP::SIP::Request
34
+ request = message
35
+ when ::OverSIP::SIP::Response
36
+ request = message.request
37
+ else
38
+ raise ::OverSIP::RuntimeError, "message must be a OverSIP::SIP::Request or OverSIP::SIP::Response"
39
+ end
40
+
41
+ request.cvars.delete :asserted_user
42
+ true
43
+ end
44
+
45
+ def self.add_pai request
46
+ # Add P-Asserted-Identity if the user has previously been asserted but JUST
47
+ # in case it matches request From URI !
48
+ # NOTE: If the connection is not asserted (it's null) then it will not match this
49
+ # comparisson, so OK.
50
+ if request.cvars[:asserted_user] == request.from.uri
51
+ # Don't add P-Asserted-Identity if the request contains P-Preferred-Identity header.
52
+ unless request.headers["P-Preferred-Identity"]
53
+ log_system_debug "user asserted, adding P-Asserted-Identity for #{request.log_id}" if $oversip_debug
54
+ request.set_header "P-Asserted-Identity", "<" << request.cvars[:asserted_user] << ">"
55
+ return true
56
+ else
57
+ # Remove posible P-Asserted-Identity header!
58
+ log_system_debug "user asserted but P-Preferred-Identity header present, P-Asserted-Identity not added for #{request.log_id}" if $oversip_debug
59
+ request.headers.delete "P-Asserted-Identity"
60
+ return nil
61
+ end
62
+
63
+ # Otherwise ensure the request has no spoofed P-Asserted-Identity headers!
64
+ else
65
+ request.headers.delete "P-Asserted-Identity"
66
+ return false
67
+
68
+ end
69
+ end
70
+
71
+ end # module UserAssertion
72
+
73
+ end
@@ -0,0 +1,189 @@
1
+ module OverSIP
2
+
3
+ module ProxiesConfig
4
+
5
+ extend ::OverSIP::Logger
6
+ extend ::OverSIP::Config::Validators
7
+
8
+ def self.log_id
9
+ @log_id ||= "ProxiesConfig"
10
+ end
11
+
12
+ @proxy_configuration = {
13
+ :do_record_routing => true,
14
+ :record_route_all => false,
15
+ :use_dns => true,
16
+ :use_dns_cache => true,
17
+ :dns_cache_time => 300,
18
+ :use_blacklist => true,
19
+ :blacklist_time => 10,
20
+ :use_naptr => true,
21
+ :use_srv => true,
22
+ :transport_preference => ["tls", "tcp", "udp"],
23
+ :force_transport_preference => false,
24
+ :ip_type_preference => ["ipv6", "ipv4"],
25
+ :dns_failover_on_503 => true,
26
+ :timer_B => 32,
27
+ :timer_C => 120,
28
+ :timer_F => 32,
29
+ :callback_on_server_tls_handshake => true
30
+ }
31
+
32
+ PROXY_CONFIG_VALIDATIONS = {
33
+ :do_record_routing => :boolean,
34
+ :record_route_all => :boolean,
35
+ :use_dns => :boolean,
36
+ :use_dns_cache => :boolean,
37
+ :dns_cache_time => [ :fixnum, [ :greater_equal_than, 300 ] ],
38
+ :use_blacklist => :boolean,
39
+ :blacklist_time => [ :fixnum, [ :greater_equal_than, 2 ], [ :minor_equal_than, 600 ] ],
40
+ :use_naptr => :boolean,
41
+ :use_srv => :boolean,
42
+ :transport_preference => [ [ :choices, %w{tls tcp udp}], :multi_value, :non_empty ],
43
+ :force_transport_preference => :boolean,
44
+ :ip_type_preference => [ [ :choices, %w{ipv4 ipv6}], :multi_value, :non_empty ],
45
+ :dns_failover_on_503 => :boolean,
46
+ :timer_B => [ :fixnum, [ :greater_equal_than, 2 ], [ :minor_equal_than, 64 ] ],
47
+ :timer_C => [ :fixnum, [ :greater_equal_than, 8 ], [ :minor_equal_than, 180 ] ],
48
+ :timer_F => [ :fixnum, [ :greater_equal_than, 2 ], [ :minor_equal_than, 64 ] ],
49
+ :callback_on_server_tls_handshake => :boolean
50
+ }
51
+
52
+ def self.load proxies_yaml, reload=false
53
+ begin
54
+ unless proxies_yaml.is_a? ::Hash
55
+ raise "invalid proxies configuration file, it is not a collection"
56
+ end
57
+
58
+ proxies = {}
59
+
60
+ proxies_yaml.each do |proxy, conf|
61
+ unless proxy.is_a? ::String
62
+ raise "proxy name is not a string (#{proxy.inspect})"
63
+ end
64
+
65
+ proxies[proxy.to_sym] = @proxy_configuration.dup
66
+ proxies[proxy.to_sym].each do |parameter, default_value|
67
+ proxies[proxy.to_sym][parameter] = case default_value
68
+ when ::TrueClass, ::FalseClass, ::NilClass, ::Fixnum
69
+ default_value
70
+ else
71
+ default_value.clone
72
+ end
73
+ end
74
+
75
+ PROXY_CONFIG_VALIDATIONS.each do |parameter, validations|
76
+ values = proxies_yaml[proxy][parameter.to_s]
77
+ validations = [ validations ] unless validations.is_a?(::Array)
78
+
79
+ if values == nil
80
+ if validations.include? :required
81
+ raise "#{proxy}[#{parameter}] requires a value"
82
+ end
83
+ next
84
+ end
85
+
86
+ if values.is_a? ::Array
87
+ unless validations.include? :multi_value
88
+ raise "#{proxy}[#{parameter}] does not allow multiple values"
89
+ end
90
+
91
+ if validations.include? :non_empty and values.empty?
92
+ raise "#{proxy}[#{parameter}] does not allow empty values"
93
+ end
94
+ end
95
+
96
+ values = ( values.is_a?(::Array) ? values : [ values ] )
97
+
98
+ values.each do |value|
99
+ validations.each do |validation|
100
+
101
+ if validation.is_a? ::Symbol
102
+ args = []
103
+ elsif validation.is_a? ::Array
104
+ args = validation[1..-1]
105
+ validation = validation[0]
106
+ end
107
+
108
+ next if [:required, :multi_value, :non_empty].include? validation
109
+
110
+ unless send validation, value, *args
111
+ raise "#{proxy}[#{parameter}] has invalid value '#{::OverSIP::Config.humanize_value value}' (does not satisfy '#{validation}' validation requirement)"
112
+ end
113
+ end
114
+
115
+ proxies[proxy.to_sym][parameter] = ( validations.include?(:multi_value) ? values : values[0] )
116
+ end
117
+
118
+ end # PROXY_CONFIG_VALIDATIONS[section].each
119
+ end # proxies_yaml.each
120
+
121
+ rescue ::Exception => e
122
+ unless reload
123
+ ::OverSIP::Launcher.fatal e.message
124
+ else
125
+ raise ::OverSIP::ConfigurationError, e.message
126
+ end
127
+ end
128
+
129
+ @proxies = proxies
130
+ post_process
131
+
132
+ ::OverSIP.proxies = @proxies
133
+ end
134
+
135
+
136
+ def self.post_process
137
+ @proxies.each_key do |proxy|
138
+ # Add a string parameter with the proxy name itself.
139
+ @proxies[proxy][:name] = proxy.to_s
140
+
141
+ # If use_srv is not set then ensure use_naptr is also not set.
142
+ @proxies[proxy][:use_naptr] = false unless @proxies[proxy][:use_srv]
143
+
144
+ # Convert transport values into Symbols.
145
+ @proxies[proxy][:transport_preference] = @proxies[proxy][:transport_preference].map do |transport|
146
+ transport.to_sym
147
+ end
148
+
149
+ # Ensure there are not duplicate transports.
150
+ @proxies[proxy][:transport_preference].uniq!
151
+
152
+ # Remove transports that are not supported.
153
+ @proxies[proxy][:transport_preference].delete :tls unless ::OverSIP.configuration[:sip][:sip_tls]
154
+ @proxies[proxy][:transport_preference].delete :tcp unless ::OverSIP.configuration[:sip][:sip_tcp]
155
+ @proxies[proxy][:transport_preference].delete :udp unless ::OverSIP.configuration[:sip][:sip_udp]
156
+
157
+ # Convert IP type values into Symbols.
158
+ @proxies[proxy][:ip_type_preference] = @proxies[proxy][:ip_type_preference].map do |ip_type|
159
+ ip_type.to_sym
160
+ end
161
+
162
+ # Ensure there are not duplicate IP types.
163
+ @proxies[proxy][:ip_type_preference].uniq!
164
+
165
+ # Remove IP types that are not supported.
166
+ @proxies[proxy][:ip_type_preference].delete :ipv4 unless ::OverSIP.configuration[:sip][:listen_ipv4]
167
+ @proxies[proxy][:ip_type_preference].delete :ipv6 unless ::OverSIP.configuration[:sip][:listen_ipv6]
168
+
169
+ # Add new parameters for fast access.
170
+ @proxies[proxy][:has_sip_ipv4] = @proxies[proxy][:ip_type_preference].include?(:ipv4)
171
+ @proxies[proxy][:has_sip_ipv6] = @proxies[proxy][:ip_type_preference].include?(:ipv6)
172
+ @proxies[proxy][:has_sip_udp] = @proxies[proxy][:transport_preference].include?(:udp)
173
+ @proxies[proxy][:has_sip_tcp] = @proxies[proxy][:transport_preference].include?(:tcp)
174
+ @proxies[proxy][:has_sip_tls] = @proxies[proxy][:transport_preference].include?(:tls)
175
+
176
+ # Add a hash for the DNS cache.
177
+ @proxies[proxy][:dns_cache] = {}
178
+
179
+ # Add a hash for the blacklist.
180
+ @proxies[proxy][:blacklist] = {}
181
+
182
+ # Only allow record routing for all requsts if record routing is enabled
183
+ @proxies[proxy][:record_route_all] = false unless @proxies[proxy][:do_record_routing]
184
+ end
185
+ end
186
+
187
+ end
188
+
189
+ end
@@ -0,0 +1,38 @@
1
+ module EventMachine
2
+
3
+ # Fast method for setting an outgoing TCP connection.
4
+ def self.oversip_connect_tcp_server bind_addr, server, port, klass, *args
5
+ s = bind_connect_server bind_addr, 0, server, port
6
+ c = klass.new s, *args
7
+ @conns[s] = c
8
+ block_given? and yield c
9
+ c
10
+ end
11
+
12
+
13
+ class Connection
14
+
15
+ # We require Ruby 1.9 so don't check String#bytesize method.
16
+ def send_data data
17
+ ::EventMachine::send_data @signature, data, data.bytesize
18
+ end
19
+
20
+ def send_datagram data, address, port
21
+ ::EventMachine::send_datagram @signature, data, data.bytesize, address, port
22
+ end
23
+
24
+ # Rewrite close_connection so it set an internal attribute (which can be
25
+ # inspected when unbind() callback is called).
26
+ alias _em_close_connection close_connection
27
+ def close_connection after_writing=false
28
+ @local_closed = true
29
+ _em_close_connection after_writing
30
+ end
31
+
32
+ def close_connection_after_writing
33
+ close_connection true
34
+ end
35
+
36
+ end
37
+
38
+ end