oversip 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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