oversip 0.9.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 (121) hide show
  1. data/AUTHORS.txt +11 -0
  2. data/LICENSE.txt +22 -0
  3. data/README.md +16 -0
  4. data/Rakefile +55 -0
  5. data/bin/oversip +182 -0
  6. data/ext/common/c_util.h +74 -0
  7. data/ext/common/ruby_c_util.h +88 -0
  8. data/ext/sip_parser/common_headers.h +209 -0
  9. data/ext/sip_parser/ext_help.h +18 -0
  10. data/ext/sip_parser/extconf.rb +3 -0
  11. data/ext/sip_parser/sip_parser.c +29649 -0
  12. data/ext/sip_parser/sip_parser.h +227 -0
  13. data/ext/sip_parser/sip_parser_ruby.c +1292 -0
  14. data/ext/stud/extconf.rb +27 -0
  15. data/ext/stud/stud.tar.gz +0 -0
  16. data/ext/stun/ext_help.h +16 -0
  17. data/ext/stun/extconf.rb +3 -0
  18. data/ext/stun/stun_ruby.c +391 -0
  19. data/ext/utils/ext_help.h +14 -0
  20. data/ext/utils/extconf.rb +3 -0
  21. data/ext/utils/haproxy_protocol.c +6163 -0
  22. data/ext/utils/haproxy_protocol.h +27 -0
  23. data/ext/utils/ip_utils.c +5952 -0
  24. data/ext/utils/ip_utils.h +61 -0
  25. data/ext/utils/outbound_utils.c +3227 -0
  26. data/ext/utils/outbound_utils.h +27 -0
  27. data/ext/utils/utils_ruby.c +384 -0
  28. data/ext/utils/utils_ruby.h +75 -0
  29. data/ext/websocket_framing_utils/ext_help.h +18 -0
  30. data/ext/websocket_framing_utils/extconf.rb +3 -0
  31. data/ext/websocket_framing_utils/ws_framing_utils.h +46 -0
  32. data/ext/websocket_framing_utils/ws_framing_utils_ruby.c +135 -0
  33. data/ext/websocket_http_parser/ext_help.h +18 -0
  34. data/ext/websocket_http_parser/extconf.rb +3 -0
  35. data/ext/websocket_http_parser/ws_http_parser.c +2598 -0
  36. data/ext/websocket_http_parser/ws_http_parser.h +86 -0
  37. data/ext/websocket_http_parser/ws_http_parser_ruby.c +630 -0
  38. data/lib/oversip/config.rb +541 -0
  39. data/lib/oversip/config_validators.rb +126 -0
  40. data/lib/oversip/errors.rb +7 -0
  41. data/lib/oversip/fiber_pool.rb +56 -0
  42. data/lib/oversip/launcher.rb +507 -0
  43. data/lib/oversip/logger.rb +170 -0
  44. data/lib/oversip/master_process.rb +67 -0
  45. data/lib/oversip/posix_mq.rb +121 -0
  46. data/lib/oversip/proxies_config.rb +169 -0
  47. data/lib/oversip/ruby_ext/eventmachine.rb +38 -0
  48. data/lib/oversip/sip/client_transaction.rb +587 -0
  49. data/lib/oversip/sip/constants.rb +87 -0
  50. data/lib/oversip/sip/grammar/name_addr.rb +27 -0
  51. data/lib/oversip/sip/grammar/uri.rb +116 -0
  52. data/lib/oversip/sip/launcher.rb +180 -0
  53. data/lib/oversip/sip/listeners/ipv4_tcp_client.rb +21 -0
  54. data/lib/oversip/sip/listeners/ipv4_tcp_server.rb +21 -0
  55. data/lib/oversip/sip/listeners/ipv4_tls_client.rb +21 -0
  56. data/lib/oversip/sip/listeners/ipv4_tls_server.rb +21 -0
  57. data/lib/oversip/sip/listeners/ipv4_tls_tunnel_server.rb +21 -0
  58. data/lib/oversip/sip/listeners/ipv4_udp_server.rb +20 -0
  59. data/lib/oversip/sip/listeners/ipv6_tcp_client.rb +21 -0
  60. data/lib/oversip/sip/listeners/ipv6_tcp_server.rb +21 -0
  61. data/lib/oversip/sip/listeners/ipv6_tls_client.rb +21 -0
  62. data/lib/oversip/sip/listeners/ipv6_tls_server.rb +21 -0
  63. data/lib/oversip/sip/listeners/ipv6_tls_tunnel_server.rb +21 -0
  64. data/lib/oversip/sip/listeners/ipv6_udp_server.rb +20 -0
  65. data/lib/oversip/sip/listeners/reactor.rb +39 -0
  66. data/lib/oversip/sip/listeners/tcp_client.rb +73 -0
  67. data/lib/oversip/sip/listeners/tcp_reactor.rb +185 -0
  68. data/lib/oversip/sip/listeners/tcp_server.rb +71 -0
  69. data/lib/oversip/sip/listeners/tls_client.rb +117 -0
  70. data/lib/oversip/sip/listeners/tls_server.rb +70 -0
  71. data/lib/oversip/sip/listeners/tls_tunnel_reactor.rb +113 -0
  72. data/lib/oversip/sip/listeners/tls_tunnel_server.rb +61 -0
  73. data/lib/oversip/sip/listeners/udp_reactor.rb +213 -0
  74. data/lib/oversip/sip/listeners.rb +28 -0
  75. data/lib/oversip/sip/logic.rb +14 -0
  76. data/lib/oversip/sip/message.rb +168 -0
  77. data/lib/oversip/sip/message_processor.rb +202 -0
  78. data/lib/oversip/sip/modules/core.rb +200 -0
  79. data/lib/oversip/sip/modules/registrar_without_path.rb +75 -0
  80. data/lib/oversip/sip/modules/user_assertion.rb +123 -0
  81. data/lib/oversip/sip/proxy.rb +460 -0
  82. data/lib/oversip/sip/request.rb +128 -0
  83. data/lib/oversip/sip/response.rb +30 -0
  84. data/lib/oversip/sip/rfc3263.rb +646 -0
  85. data/lib/oversip/sip/server_transaction.rb +295 -0
  86. data/lib/oversip/sip/sip.rb +74 -0
  87. data/lib/oversip/sip/tags.rb +39 -0
  88. data/lib/oversip/sip/timers.rb +55 -0
  89. data/lib/oversip/sip/transport_manager.rb +129 -0
  90. data/lib/oversip/syslogger_process.rb +119 -0
  91. data/lib/oversip/tls.rb +179 -0
  92. data/lib/oversip/utils.rb +25 -0
  93. data/lib/oversip/version.rb +23 -0
  94. data/lib/oversip/websocket/constants.rb +56 -0
  95. data/lib/oversip/websocket/default_policy.rb +19 -0
  96. data/lib/oversip/websocket/http_request.rb +63 -0
  97. data/lib/oversip/websocket/launcher.rb +207 -0
  98. data/lib/oversip/websocket/listeners/ipv4_tcp_server.rb +15 -0
  99. data/lib/oversip/websocket/listeners/ipv4_tls_server.rb +15 -0
  100. data/lib/oversip/websocket/listeners/ipv4_tls_tunnel_server.rb +15 -0
  101. data/lib/oversip/websocket/listeners/ipv6_tcp_server.rb +15 -0
  102. data/lib/oversip/websocket/listeners/ipv6_tls_server.rb +15 -0
  103. data/lib/oversip/websocket/listeners/ipv6_tls_tunnel_server.rb +15 -0
  104. data/lib/oversip/websocket/listeners/tcp_server.rb +265 -0
  105. data/lib/oversip/websocket/listeners/tls_server.rb +69 -0
  106. data/lib/oversip/websocket/listeners/tls_tunnel_server.rb +100 -0
  107. data/lib/oversip/websocket/listeners.rb +12 -0
  108. data/lib/oversip/websocket/ws_app.rb +75 -0
  109. data/lib/oversip/websocket/ws_apps/ipv4_ws_sip_app.rb +21 -0
  110. data/lib/oversip/websocket/ws_apps/ipv4_wss_sip_app.rb +21 -0
  111. data/lib/oversip/websocket/ws_apps/ipv6_ws_sip_app.rb +21 -0
  112. data/lib/oversip/websocket/ws_apps/ipv6_wss_sip_app.rb +22 -0
  113. data/lib/oversip/websocket/ws_apps/ws_autobahn_app.rb +23 -0
  114. data/lib/oversip/websocket/ws_apps/ws_sip_app.rb +156 -0
  115. data/lib/oversip/websocket/ws_apps.rb +9 -0
  116. data/lib/oversip/websocket/ws_framing.rb +597 -0
  117. data/lib/oversip.rb +59 -0
  118. data/test/oversip_test_helper.rb +20 -0
  119. data/test/test_http_parser.rb +73 -0
  120. data/test/test_sip_parser.rb +139 -0
  121. metadata +256 -0
@@ -0,0 +1,116 @@
1
+ module OverSIP::SIP
2
+
3
+ class Uri
4
+ attr_reader :scheme, :user, :host, :host_type, :port, :params, :transport_param, :ovid_param, :phone_context_param, :headers
5
+ attr_accessor :uri_modified
6
+
7
+ def scheme= value
8
+ return nil if unknown_scheme?
9
+ @scheme = value
10
+ @uri_modified = true
11
+ end
12
+
13
+ def unknown_scheme?
14
+ not @scheme.is_a? Symbol
15
+ end
16
+
17
+ def user= value
18
+ return nil if unknown_scheme?
19
+ @user = value
20
+ @uri_modified = true
21
+ end
22
+ alias :number :user
23
+ alias :number= :user=
24
+
25
+ def host= value
26
+ return nil if unknown_scheme?
27
+ @host = value
28
+ @host_type = ::OverSIP::Utils.ip_type(value) || :domain
29
+ @uri_modified = true
30
+ end
31
+ alias :domain :host
32
+ alias :domain= :host=
33
+
34
+ def host_type= value
35
+ return nil if unknown_scheme?
36
+ @host_type = value
37
+ end
38
+
39
+ def port= value
40
+ return nil if unknown_scheme?
41
+ @port = value
42
+ @uri_modified = true
43
+ end
44
+
45
+ def params
46
+ @params ||= {}
47
+ end
48
+
49
+ def set_param k, v
50
+ return nil if unknown_scheme?
51
+ @params ||= {}
52
+ @params[k.downcase] = v
53
+ @uri_modified = true
54
+ end
55
+
56
+ def del_param k
57
+ return nil if unknown_scheme?
58
+ return false unless @params
59
+ if @params.include?(k=k.downcase)
60
+ @uri_modified = true
61
+ return @params.delete(k)
62
+ end
63
+ false
64
+ end
65
+
66
+ def lr_param?
67
+ @lr_param ? true : false
68
+ end
69
+
70
+ def ob_param?
71
+ @ob_param ? true : false
72
+ end
73
+
74
+ def headers= value
75
+ return nil if unknown_scheme?
76
+ @headers = value
77
+ @uri_modified = true
78
+ end
79
+
80
+ def uri
81
+ return @uri unless @uri_modified
82
+
83
+ case @scheme
84
+ when :sip, :sips
85
+ @uri = @scheme.to_s << ":"
86
+ ( @uri << ::EscapeUtils.escape_uri(@user) << "@" ) if @user
87
+ @uri << @host
88
+ ( @uri << ":" << @port.to_s ) if @port
89
+
90
+ @params.each do |k,v|
91
+ @uri << ";" << k
92
+ ( @uri << "=" << v.to_s ) if v
93
+ end if @params
94
+
95
+ @uri << @headers if @headers
96
+
97
+ when :tel
98
+ @uri = "tel:"
99
+ @uri << @user
100
+
101
+ @params.each do |k,v|
102
+ @uri << ";" << k
103
+ ( @uri << "=" << v.to_s ) if v
104
+ end if @params
105
+
106
+ end
107
+
108
+ @uri_modified = false
109
+ @uri
110
+ end
111
+ alias :to_s :uri
112
+ alias :inspect :uri
113
+
114
+ end # class Uri
115
+
116
+ end
@@ -0,0 +1,180 @@
1
+ module OverSIP::SIP
2
+
3
+ module Launcher
4
+
5
+ extend ::OverSIP::Logger
6
+
7
+ IP_TYPE = {
8
+ :ipv4 => "IPv4",
9
+ :ipv6 => "IPv6"
10
+ }
11
+
12
+
13
+ def self.log_id
14
+ @log_id ||= "SIP launcher"
15
+ end
16
+
17
+
18
+ def self.run enabled, ip_type, ip, port, transport, virtual_ip=nil, virtual_port=nil
19
+ uri_ip = case ip_type
20
+ when :ipv4 ; ip
21
+ when :ipv6 ; "[#{ip}]"
22
+ end
23
+
24
+ if virtual_ip
25
+ uri_virtual_ip = case ip_type
26
+ when :ipv4 ; virtual_ip
27
+ when :ipv6 ; "[#{virtual_ip}]"
28
+ end
29
+ end
30
+
31
+ klass = case transport
32
+ when :udp
33
+ case ip_type
34
+ when :ipv4 ; OverSIP::SIP::IPv4UdpServer
35
+ when :ipv6 ; OverSIP::SIP::IPv6UdpServer
36
+ end
37
+ when :tcp
38
+ case ip_type
39
+ when :ipv4 ; OverSIP::SIP::IPv4TcpServer
40
+ when :ipv6 ; OverSIP::SIP::IPv6TcpServer
41
+ end
42
+ when :tls
43
+ case ip_type
44
+ when :ipv4 ; OverSIP::SIP::IPv4TlsServer
45
+ when :ipv6 ; OverSIP::SIP::IPv6TlsServer
46
+ end
47
+ when :tls_tunnel
48
+ case ip_type
49
+ when :ipv4 ; OverSIP::SIP::IPv4TlsTunnelServer
50
+ when :ipv6 ; OverSIP::SIP::IPv6TlsTunnelServer
51
+ end
52
+ end
53
+
54
+ klass.ip = virtual_ip || ip
55
+ klass.port = virtual_port || port
56
+
57
+ case
58
+
59
+ when klass == OverSIP::SIP::IPv4UdpServer
60
+ klass.via_core = "SIP/2.0/UDP #{uri_ip}:#{port}"
61
+ klass.record_route = "<sip:#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
62
+ klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
63
+ klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
64
+
65
+ if enabled
66
+ EM::open_datagram_socket(ip, port, klass) do |conn|
67
+ klass.connections = conn
68
+ end
69
+ end
70
+
71
+ when klass == OverSIP::SIP::IPv6UdpServer
72
+ klass.via_core = "SIP/2.0/UDP #{uri_ip}:#{port}"
73
+ klass.record_route = "<sip:#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
74
+ klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
75
+ klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
76
+
77
+ if enabled
78
+ EM::open_datagram_socket(ip, port, klass) do |conn|
79
+ klass.connections = conn
80
+ end
81
+ end
82
+
83
+ when klass == OverSIP::SIP::IPv4TcpServer
84
+ klass.via_core = "SIP/2.0/TCP #{uri_ip}:#{port}"
85
+ klass.record_route = "<sip:#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
86
+ klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
87
+ klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
88
+
89
+ if enabled
90
+ EM.start_server(ip, port, klass) do |conn|
91
+ conn.post_connection
92
+ conn.set_comm_inactivity_timeout 3600 # TODO
93
+ end
94
+ end
95
+
96
+ when klass == OverSIP::SIP::IPv6TcpServer
97
+ klass.via_core = "SIP/2.0/TCP #{uri_ip}:#{port}"
98
+ klass.record_route = "<sip:#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
99
+ klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
100
+ klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
101
+
102
+ if enabled
103
+ EM.start_server(ip, port, klass) do |conn|
104
+ conn.post_connection
105
+ conn.set_comm_inactivity_timeout 3600 # TODO
106
+ end
107
+ end
108
+
109
+ when klass == OverSIP::SIP::IPv4TlsServer
110
+ klass.via_core = "SIP/2.0/TLS #{uri_ip}:#{port}"
111
+ rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4] || uri_ip
112
+ klass.record_route = "<sip:#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
113
+ klass.outbound_record_route_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
114
+ klass.outbound_path_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
115
+
116
+ if enabled
117
+ EM.start_server(ip, port, klass) do |conn|
118
+ conn.post_connection
119
+ conn.set_comm_inactivity_timeout 3600 # TODO
120
+ end
121
+ end
122
+
123
+ when klass == OverSIP::SIP::IPv6TlsServer
124
+ klass.via_core = "SIP/2.0/TLS #{uri_ip}:#{port}"
125
+ rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6] || uri_ip
126
+ klass.record_route = "<sip:#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
127
+ klass.outbound_record_route_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
128
+ klass.outbound_path_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
129
+
130
+ if enabled
131
+ EM.start_server(ip, port, klass) do |conn|
132
+ conn.post_connection
133
+ conn.set_comm_inactivity_timeout 3600 # TODO
134
+ end
135
+ end
136
+
137
+ when klass == OverSIP::SIP::IPv4TlsTunnelServer
138
+ klass.via_core = "SIP/2.0/TLS #{uri_virtual_ip}:#{virtual_port}"
139
+ rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4] || uri_virtual_ip
140
+ klass.record_route = "<sip:#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
141
+ klass.outbound_record_route_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
142
+ klass.outbound_path_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
143
+
144
+ if enabled
145
+ EM.start_server(ip, port, klass) do |conn|
146
+ conn.post_connection
147
+ conn.set_comm_inactivity_timeout 3600 # TODO
148
+ end
149
+ end
150
+
151
+ when klass == OverSIP::SIP::IPv6TlsTunnelServer
152
+ klass.via_core = "SIP/2.0/TLS #{uri_virtual_ip}:#{virtual_port}"
153
+ rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6] || uri_virtual_ip
154
+ klass.record_route = "<sip:#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
155
+ klass.outbound_record_route_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
156
+ klass.outbound_path_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
157
+
158
+ if enabled
159
+ EM.start_server(ip, port, klass) do |conn|
160
+ conn.post_connection
161
+ conn.set_comm_inactivity_timeout 3600 # TODO
162
+ end
163
+ end
164
+
165
+ end # case
166
+
167
+ transport_str = case transport
168
+ when :tls_tunnel ; "TLS-Tunnel"
169
+ else ; transport.to_s.upcase
170
+ end
171
+
172
+ if enabled
173
+ log_system_info "SIP #{transport_str} server listening on #{IP_TYPE[ip_type]} #{uri_ip}:#{port}"
174
+ end
175
+
176
+ end # def self.run
177
+
178
+ end
179
+
180
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv4TcpClient < TcpClient
4
+
5
+ @ip_type = :ipv4
6
+ @transport = :tcp
7
+ @server_class = ::OverSIP::SIP::IPv4TcpServer
8
+ @connections = @server_class.connections
9
+ @invite_server_transactions = @server_class.invite_server_transactions
10
+ @non_invite_server_transactions = @server_class.non_invite_server_transactions
11
+ @invite_client_transactions = @server_class.invite_client_transactions
12
+ @non_invite_client_transactions = @server_class.non_invite_client_transactions
13
+
14
+ LOG_ID = "SIP TCP IPv4 client"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv4TcpServer < TcpServer
4
+
5
+ @ip_type = :ipv4
6
+ @transport = :tcp
7
+ @connections = {}
8
+ @invite_server_transactions = {}
9
+ @non_invite_server_transactions = {}
10
+ @invite_client_transactions = {}
11
+ @non_invite_client_transactions = {}
12
+ @is_reliable_transport_listener = true
13
+
14
+ LOG_ID = "SIP TCP IPv4 server"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv4TlsClient < TlsClient
4
+
5
+ @ip_type = :ipv4
6
+ @transport = :tls
7
+ @server_class = ::OverSIP::SIP::IPv4TlsServer
8
+ @connections = @server_class.connections
9
+ @invite_server_transactions = @server_class.invite_server_transactions
10
+ @non_invite_server_transactions = @server_class.non_invite_server_transactions
11
+ @invite_client_transactions = @server_class.invite_client_transactions
12
+ @non_invite_client_transactions = @server_class.non_invite_client_transactions
13
+
14
+ LOG_ID = "SIP TLS IPv4 client"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv4TlsServer < TlsServer
4
+
5
+ @ip_type = :ipv4
6
+ @transport = :tls
7
+ @connections = {}
8
+ @invite_server_transactions = {}
9
+ @non_invite_server_transactions = {}
10
+ @invite_client_transactions = {}
11
+ @non_invite_client_transactions = {}
12
+ @is_reliable_transport_listener = true
13
+
14
+ LOG_ID = "SIP TLS IPv4 server"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv4TlsTunnelServer < TlsTunnelServer
4
+
5
+ @ip_type = :ipv4
6
+ @transport = :tls
7
+ @connections = {}
8
+ @invite_server_transactions = {}
9
+ @non_invite_server_transactions = {}
10
+ @invite_client_transactions = {}
11
+ @non_invite_client_transactions = {}
12
+ @is_reliable_transport_listener = true
13
+
14
+ LOG_ID = "SIP TLS-Tunnel IPv4 server"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,20 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv4UdpServer < UdpReactor
4
+
5
+ @ip_type = :ipv4
6
+ @transport = :udp
7
+ @connections = nil # To be set after creating the unique server instance.
8
+ @invite_server_transactions = {}
9
+ @non_invite_server_transactions = {}
10
+ @invite_client_transactions = {}
11
+ @non_invite_client_transactions = {}
12
+
13
+ LOG_ID = "SIP UDP IPv4 server"
14
+ def log_id
15
+ LOG_ID
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv6TcpClient < TcpClient
4
+
5
+ @ip_type = :ipv6
6
+ @transport = :tcp
7
+ @server_class = ::OverSIP::SIP::IPv6TcpServer
8
+ @connections = @server_class.connections
9
+ @invite_server_transactions = @server_class.invite_server_transactions
10
+ @non_invite_server_transactions = @server_class.non_invite_server_transactions
11
+ @invite_client_transactions = @server_class.invite_client_transactions
12
+ @non_invite_client_transactions = @server_class.non_invite_client_transactions
13
+
14
+ LOG_ID = "SIP TCP IPv6 client"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv6TcpServer < TcpServer
4
+
5
+ @ip_type = :ipv6
6
+ @transport = :tcp
7
+ @connections = {}
8
+ @invite_server_transactions = {}
9
+ @non_invite_server_transactions = {}
10
+ @invite_client_transactions = {}
11
+ @non_invite_client_transactions = {}
12
+ @is_reliable_transport_listener = true
13
+
14
+ LOG_ID = "SIP TCP IPv6 server"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv6TlsClient < TlsClient
4
+
5
+ @ip_type = :ipv6
6
+ @transport = :tls
7
+ @server_class = ::OverSIP::SIP::IPv6TlsServer
8
+ @connections = @server_class.connections
9
+ @invite_server_transactions = @server_class.invite_server_transactions
10
+ @non_invite_server_transactions = @server_class.non_invite_server_transactions
11
+ @invite_client_transactions = @server_class.invite_client_transactions
12
+ @non_invite_client_transactions = @server_class.non_invite_client_transactions
13
+
14
+ LOG_ID = "SIP TLS IPv6 client"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv6TlsServer < TlsServer
4
+
5
+ @ip_type = :ipv6
6
+ @transport = :tls
7
+ @connections = {}
8
+ @invite_server_transactions = {}
9
+ @non_invite_server_transactions = {}
10
+ @invite_client_transactions = {}
11
+ @non_invite_client_transactions = {}
12
+ @is_reliable_transport_listener = true
13
+
14
+ LOG_ID = "SIP TLS IPv6 server"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv6TlsTunnelServer < TlsTunnelServer
4
+
5
+ @ip_type = :ipv6
6
+ @transport = :tls
7
+ @connections = {}
8
+ @invite_server_transactions = {}
9
+ @non_invite_server_transactions = {}
10
+ @invite_client_transactions = {}
11
+ @non_invite_client_transactions = {}
12
+ @is_reliable_transport_listener = true
13
+
14
+ LOG_ID = "SIP TLS-Tunnel IPv6 server"
15
+ def log_id
16
+ LOG_ID
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,20 @@
1
+ module OverSIP::SIP
2
+
3
+ class IPv6UdpServer < UdpReactor
4
+
5
+ @ip_type = :ipv6
6
+ @transport = :udp
7
+ @connections = nil # To be set after creating the unique server instance.
8
+ @invite_server_transactions = {}
9
+ @non_invite_server_transactions = {}
10
+ @invite_client_transactions = {}
11
+ @non_invite_client_transactions = {}
12
+
13
+ LOG_ID = "SIP UDP IPv6 server"
14
+ def log_id
15
+ LOG_ID
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -0,0 +1,39 @@
1
+ module OverSIP::SIP
2
+
3
+ class Reactor < ::EM::Connection
4
+
5
+ include ::OverSIP::Logger
6
+ include ::OverSIP::SIP::MessageProcessor
7
+
8
+ class << self
9
+ attr_accessor :ip_type, :ip, :port, :transport,
10
+ :via_core,
11
+ :record_route,
12
+ :outbound_record_route_fragment, :outbound_path_fragment,
13
+ :connections,
14
+ :invite_server_transactions, :non_invite_server_transactions,
15
+ :invite_client_transactions, :non_invite_client_transactions
16
+
17
+ def reliable_transport_listener?
18
+ @is_reliable_transport_listener
19
+ end
20
+ end
21
+
22
+ def initialize
23
+ @parser = ::OverSIP::SIP::MessageParser.new
24
+ @buffer = ::IO::Buffer.new
25
+ @state = :init
26
+
27
+ # Set the socket sending error handling to report the error:
28
+ # :ERRORHANDLING_KILL, :ERRORHANDLING_IGNORE, :ERRORHANDLING_REPORT
29
+ self.send_error_handling = :ERRORHANDLING_REPORT
30
+ end
31
+
32
+ def receive_senderror error, data
33
+ log_system_error "Socket sending error: #{error.inspect}, #{data.inspect}"
34
+ end
35
+
36
+ end # class Reactor
37
+
38
+ end
39
+
@@ -0,0 +1,73 @@
1
+ module OverSIP::SIP
2
+
3
+ class TcpClient < TcpReactor
4
+
5
+ attr_accessor :server_class ## TODO: sirve??
6
+ attr_reader :connected
7
+ attr_reader :pending_client_transactions
8
+
9
+ def initialize ip, port
10
+ # NOTE: The parent class implementing "initialize" method is Reactor, and allows no arguments.
11
+ # If we call just "super" from here it will fail since "ip" and "port" will be passed as
12
+ # arguments. So we must use "super()" and we are done (no arguments are passed to parent).
13
+ super()
14
+
15
+ @remote_ip = ip
16
+ @remote_port = port
17
+ @connection_id = ::OverSIP::SIP::TransportManager.add_connection self, self.class, self.class.ip_type, @remote_ip, @remote_port
18
+ @connected = false
19
+ @pending_client_transactions = []
20
+
21
+ ### TODO: make it configurable.
22
+ set_pending_connect_timeout 2.0
23
+
24
+ end
25
+
26
+
27
+ def connection_completed
28
+ log_system_info "TCP connection opened to " << remote_desc
29
+
30
+ @connected = true
31
+ @pending_client_transactions.clear
32
+ end
33
+
34
+
35
+ def remote_desc
36
+ @remote_desc ||= case self.class.ip_type
37
+ when :ipv4 ; "#{@remote_ip}:#{@remote_port.to_s}"
38
+ when :ipv6 ; "[#{@remote_ip}]:#{@remote_port.to_s}"
39
+ end
40
+ end
41
+
42
+
43
+ def unbind cause=nil
44
+ @state = :ignore
45
+
46
+ # Remove the connection.
47
+ self.class.connections.delete @connection_id
48
+
49
+ @local_closed = true if cause == ::Errno::ETIMEDOUT
50
+
51
+ if @connected
52
+ log_msg = "connection to #{remote_desc} "
53
+ log_msg << ( @local_closed ? "locally closed" : "remotely closed" )
54
+ log_msg << " (cause: #{cause.inspect})" if cause
55
+ log_system_debug log_msg if $oversip_debug
56
+
57
+ # If the TCP client connection has failed (remote server rejected the connection) then
58
+ # inform to all the pending client transactions.
59
+ else
60
+ log_system_notice "connection to #{remote_desc} failed" if $oversip_debug
61
+
62
+ @pending_client_transactions.each do |client_transaction|
63
+ client_transaction.connection_failed
64
+ end
65
+ @pending_client_transactions.clear
66
+ end
67
+
68
+ @connected = false
69
+ end
70
+
71
+ end
72
+
73
+ end