oversip 1.2.1 → 1.3.0.dev1

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 (61) hide show
  1. data/README.md +28 -4
  2. data/bin/oversip +1 -1
  3. data/etc/proxies.conf +10 -0
  4. data/etc/server.rb +13 -9
  5. data/ext/utils/haproxy_protocol.c +0 -3
  6. data/ext/utils/outbound_utils.c +1 -1
  7. data/ext/utils/utils_ruby.c +0 -1
  8. data/ext/websocket_http_parser/ws_http_parser.c +940 -1903
  9. data/ext/websocket_http_parser/ws_http_parser.h +1 -0
  10. data/lib/oversip/config_validators.rb +2 -2
  11. data/lib/oversip/launcher.rb +275 -240
  12. data/lib/oversip/master_process.rb +7 -2
  13. data/lib/oversip/proxies_config.rb +8 -1
  14. data/lib/oversip/sip/client.rb +304 -0
  15. data/lib/oversip/sip/client_transaction.rb +31 -36
  16. data/lib/oversip/sip/core.rb +7 -4
  17. data/lib/oversip/sip/launcher.rb +30 -30
  18. data/lib/oversip/sip/listeners/connection.rb +4 -0
  19. data/lib/oversip/sip/listeners/ipv4_tcp_server.rb +1 -0
  20. data/lib/oversip/sip/listeners/ipv4_tls_server.rb +1 -0
  21. data/lib/oversip/sip/listeners/ipv4_tls_tunnel_server.rb +1 -0
  22. data/lib/oversip/sip/listeners/ipv4_udp_server.rb +1 -0
  23. data/lib/oversip/sip/listeners/ipv6_tcp_server.rb +1 -0
  24. data/lib/oversip/sip/listeners/ipv6_tls_server.rb +1 -0
  25. data/lib/oversip/sip/listeners/ipv6_tls_tunnel_server.rb +1 -0
  26. data/lib/oversip/sip/listeners/ipv6_udp_server.rb +1 -0
  27. data/lib/oversip/sip/listeners/tcp_client.rb +26 -0
  28. data/lib/oversip/sip/listeners/tcp_connection.rb +7 -1
  29. data/lib/oversip/sip/listeners/tcp_server.rb +1 -1
  30. data/lib/oversip/sip/listeners/tls_client.rb +28 -24
  31. data/lib/oversip/sip/listeners/tls_server.rb +25 -8
  32. data/lib/oversip/sip/listeners/tls_tunnel_connection.rb +1 -24
  33. data/lib/oversip/sip/message.rb +2 -2
  34. data/lib/oversip/sip/message_processor.rb +23 -13
  35. data/lib/oversip/sip/{grammar/name_addr.rb → name_addr.rb} +11 -0
  36. data/lib/oversip/sip/proxy.rb +53 -227
  37. data/lib/oversip/sip/request.rb +15 -11
  38. data/lib/oversip/sip/response.rb +3 -3
  39. data/lib/oversip/sip/rfc3263.rb +2 -3
  40. data/lib/oversip/sip/tags.rb +1 -1
  41. data/lib/oversip/sip/transport_manager.rb +6 -5
  42. data/lib/oversip/sip/uac.rb +93 -0
  43. data/lib/oversip/sip/uac_request.rb +82 -0
  44. data/lib/oversip/sip/{grammar/uri.rb → uri.rb} +22 -0
  45. data/lib/oversip/version.rb +3 -3
  46. data/lib/oversip/websocket/launcher.rb +25 -25
  47. data/lib/oversip/websocket/listeners/connection.rb +4 -0
  48. data/lib/oversip/websocket/listeners/ipv4_ws_server.rb +1 -0
  49. data/lib/oversip/websocket/listeners/ipv4_wss_server.rb +1 -0
  50. data/lib/oversip/websocket/listeners/ipv4_wss_tunnel_server.rb +1 -0
  51. data/lib/oversip/websocket/listeners/ipv6_ws_server.rb +1 -0
  52. data/lib/oversip/websocket/listeners/ipv6_wss_server.rb +1 -0
  53. data/lib/oversip/websocket/listeners/ipv6_wss_tunnel_server.rb +1 -0
  54. data/lib/oversip/websocket/listeners/ws_server.rb +55 -26
  55. data/lib/oversip/websocket/listeners/wss_server.rb +26 -9
  56. data/lib/oversip/websocket/listeners/wss_tunnel_server.rb +14 -11
  57. data/lib/oversip/websocket/ws_framing.rb +6 -2
  58. data/lib/oversip.rb +3 -1
  59. data/test/test_http_parser.rb +3 -3
  60. data/test/test_uri.rb +18 -12
  61. metadata +91 -77
@@ -28,23 +28,23 @@ module OverSIP::SIP
28
28
  klass = case transport
29
29
  when :udp
30
30
  case ip_type
31
- when :ipv4 ; OverSIP::SIP::IPv4UdpServer
32
- when :ipv6 ; OverSIP::SIP::IPv6UdpServer
31
+ when :ipv4 ; ::OverSIP::SIP::IPv4UdpServer
32
+ when :ipv6 ; ::OverSIP::SIP::IPv6UdpServer
33
33
  end
34
34
  when :tcp
35
35
  case ip_type
36
- when :ipv4 ; OverSIP::SIP::IPv4TcpServer
37
- when :ipv6 ; OverSIP::SIP::IPv6TcpServer
36
+ when :ipv4 ; ::OverSIP::SIP::IPv4TcpServer
37
+ when :ipv6 ; ::OverSIP::SIP::IPv6TcpServer
38
38
  end
39
39
  when :tls
40
40
  case ip_type
41
- when :ipv4 ; OverSIP::SIP::IPv4TlsServer
42
- when :ipv6 ; OverSIP::SIP::IPv6TlsServer
41
+ when :ipv4 ; ::OverSIP::SIP::IPv4TlsServer
42
+ when :ipv6 ; ::OverSIP::SIP::IPv6TlsServer
43
43
  end
44
44
  when :tls_tunnel
45
45
  case ip_type
46
- when :ipv4 ; OverSIP::SIP::IPv4TlsTunnelServer
47
- when :ipv6 ; OverSIP::SIP::IPv6TlsTunnelServer
46
+ when :ipv4 ; ::OverSIP::SIP::IPv4TlsTunnelServer
47
+ when :ipv6 ; ::OverSIP::SIP::IPv6TlsTunnelServer
48
48
  end
49
49
  end
50
50
 
@@ -53,57 +53,57 @@ module OverSIP::SIP
53
53
 
54
54
  case
55
55
 
56
- when klass == OverSIP::SIP::IPv4UdpServer
56
+ when klass == ::OverSIP::SIP::IPv4UdpServer
57
57
  klass.via_core = "SIP/2.0/UDP #{uri_ip}:#{port}"
58
58
  klass.record_route = "<sip:#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
59
59
  klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
60
60
  klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
61
61
 
62
62
  if enabled
63
- EM::open_datagram_socket(ip, port, klass) do |conn|
63
+ ::EM::open_datagram_socket(ip, port, klass) do |conn|
64
64
  klass.connections = conn
65
65
  end
66
66
  end
67
67
 
68
- when klass == OverSIP::SIP::IPv6UdpServer
68
+ when klass == ::OverSIP::SIP::IPv6UdpServer
69
69
  klass.via_core = "SIP/2.0/UDP #{uri_ip}:#{port}"
70
70
  klass.record_route = "<sip:#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
71
71
  klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
72
72
  klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=udp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
73
73
 
74
74
  if enabled
75
- EM::open_datagram_socket(ip, port, klass) do |conn|
75
+ ::EM::open_datagram_socket(ip, port, klass) do |conn|
76
76
  klass.connections = conn
77
77
  end
78
78
  end
79
79
 
80
- when klass == OverSIP::SIP::IPv4TcpServer
80
+ when klass == ::OverSIP::SIP::IPv4TcpServer
81
81
  klass.via_core = "SIP/2.0/TCP #{uri_ip}:#{port}"
82
82
  klass.record_route = "<sip:#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
83
83
  klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
84
84
  klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
85
85
 
86
86
  if enabled
87
- EM.start_server(ip, port, klass) do |conn|
87
+ ::EM.start_server(ip, port, klass) do |conn|
88
88
  conn.post_connection
89
- conn.set_comm_inactivity_timeout 3600 # TODO
89
+ conn.set_comm_inactivity_timeout 300
90
90
  end
91
91
  end
92
92
 
93
- when klass == OverSIP::SIP::IPv6TcpServer
93
+ when klass == ::OverSIP::SIP::IPv6TcpServer
94
94
  klass.via_core = "SIP/2.0/TCP #{uri_ip}:#{port}"
95
95
  klass.record_route = "<sip:#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
96
96
  klass.outbound_record_route_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
97
97
  klass.outbound_path_fragment = "@#{uri_ip}:#{port};transport=tcp;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
98
98
 
99
99
  if enabled
100
- EM.start_server(ip, port, klass) do |conn|
100
+ ::EM.start_server(ip, port, klass) do |conn|
101
101
  conn.post_connection
102
- conn.set_comm_inactivity_timeout 3600 # TODO
102
+ conn.set_comm_inactivity_timeout 300
103
103
  end
104
104
  end
105
105
 
106
- when klass == OverSIP::SIP::IPv4TlsServer
106
+ when klass == ::OverSIP::SIP::IPv4TlsServer
107
107
  klass.via_core = "SIP/2.0/TLS #{uri_ip}:#{port}"
108
108
  rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4] || uri_ip
109
109
  klass.record_route = "<sip:#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
@@ -111,13 +111,13 @@ module OverSIP::SIP
111
111
  klass.outbound_path_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
112
112
 
113
113
  if enabled
114
- EM.start_server(ip, port, klass) do |conn|
114
+ ::EM.start_server(ip, port, klass) do |conn|
115
115
  conn.post_connection
116
- conn.set_comm_inactivity_timeout 3600 # TODO
116
+ conn.set_comm_inactivity_timeout 300
117
117
  end
118
118
  end
119
119
 
120
- when klass == OverSIP::SIP::IPv6TlsServer
120
+ when klass == ::OverSIP::SIP::IPv6TlsServer
121
121
  klass.via_core = "SIP/2.0/TLS #{uri_ip}:#{port}"
122
122
  rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6] || uri_ip
123
123
  klass.record_route = "<sip:#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
@@ -125,13 +125,13 @@ module OverSIP::SIP
125
125
  klass.outbound_path_fragment = "@#{rr_host}:#{port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
126
126
 
127
127
  if enabled
128
- EM.start_server(ip, port, klass) do |conn|
128
+ ::EM.start_server(ip, port, klass) do |conn|
129
129
  conn.post_connection
130
- conn.set_comm_inactivity_timeout 3600 # TODO
130
+ conn.set_comm_inactivity_timeout 300
131
131
  end
132
132
  end
133
133
 
134
- when klass == OverSIP::SIP::IPv4TlsTunnelServer
134
+ when klass == ::OverSIP::SIP::IPv4TlsTunnelServer
135
135
  klass.via_core = "SIP/2.0/TLS #{uri_virtual_ip}:#{virtual_port}"
136
136
  rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv4] || uri_virtual_ip
137
137
  klass.record_route = "<sip:#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
@@ -139,13 +139,13 @@ module OverSIP::SIP
139
139
  klass.outbound_path_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
140
140
 
141
141
  if enabled
142
- EM.start_server(ip, port, klass) do |conn|
142
+ ::EM.start_server(ip, port, klass) do |conn|
143
143
  conn.post_connection
144
- conn.set_comm_inactivity_timeout 3600 # TODO
144
+ conn.set_comm_inactivity_timeout 300
145
145
  end
146
146
  end
147
147
 
148
- when klass == OverSIP::SIP::IPv6TlsTunnelServer
148
+ when klass == ::OverSIP::SIP::IPv6TlsTunnelServer
149
149
  klass.via_core = "SIP/2.0/TLS #{uri_virtual_ip}:#{virtual_port}"
150
150
  rr_host = ::OverSIP.configuration[:sip][:record_route_hostname_tls_ipv6] || uri_virtual_ip
151
151
  klass.record_route = "<sip:#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
@@ -153,9 +153,9 @@ module OverSIP::SIP
153
153
  klass.outbound_path_fragment = "@#{rr_host}:#{virtual_port};transport=tls;lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid};ob>"
154
154
 
155
155
  if enabled
156
- EM.start_server(ip, port, klass) do |conn|
156
+ ::EM.start_server(ip, port, klass) do |conn|
157
157
  conn.post_connection
158
- conn.set_comm_inactivity_timeout 3600 # TODO
158
+ conn.set_comm_inactivity_timeout 300
159
159
  end
160
160
  end
161
161
 
@@ -17,6 +17,10 @@ module OverSIP::SIP
17
17
  def reliable_transport_listener?
18
18
  @is_reliable_transport_listener
19
19
  end
20
+
21
+ def outbound_listener?
22
+ @is_outbound_listener
23
+ end
20
24
  end
21
25
 
22
26
 
@@ -10,6 +10,7 @@ module OverSIP::SIP
10
10
  @invite_client_transactions = {}
11
11
  @non_invite_client_transactions = {}
12
12
  @is_reliable_transport_listener = true
13
+ @is_outbound_listener = true
13
14
 
14
15
  LOG_ID = "SIP TCP IPv4 server"
15
16
  def log_id
@@ -10,6 +10,7 @@ module OverSIP::SIP
10
10
  @invite_client_transactions = {}
11
11
  @non_invite_client_transactions = {}
12
12
  @is_reliable_transport_listener = true
13
+ @is_outbound_listener = true
13
14
 
14
15
  LOG_ID = "SIP TLS IPv4 server"
15
16
  def log_id
@@ -10,6 +10,7 @@ module OverSIP::SIP
10
10
  @invite_client_transactions = {}
11
11
  @non_invite_client_transactions = {}
12
12
  @is_reliable_transport_listener = true
13
+ @is_outbound_listener = true
13
14
 
14
15
  LOG_ID = "SIP TLS-Tunnel IPv4 server"
15
16
  def log_id
@@ -9,6 +9,7 @@ module OverSIP::SIP
9
9
  @non_invite_server_transactions = {}
10
10
  @invite_client_transactions = {}
11
11
  @non_invite_client_transactions = {}
12
+ @is_outbound_listener = true
12
13
 
13
14
  LOG_ID = "SIP UDP IPv4 server"
14
15
  def log_id
@@ -10,6 +10,7 @@ module OverSIP::SIP
10
10
  @invite_client_transactions = {}
11
11
  @non_invite_client_transactions = {}
12
12
  @is_reliable_transport_listener = true
13
+ @is_outbound_listener = true
13
14
 
14
15
  LOG_ID = "SIP TCP IPv6 server"
15
16
  def log_id
@@ -10,6 +10,7 @@ module OverSIP::SIP
10
10
  @invite_client_transactions = {}
11
11
  @non_invite_client_transactions = {}
12
12
  @is_reliable_transport_listener = true
13
+ @is_outbound_listener = true
13
14
 
14
15
  LOG_ID = "SIP TLS IPv6 server"
15
16
  def log_id
@@ -10,6 +10,7 @@ module OverSIP::SIP
10
10
  @invite_client_transactions = {}
11
11
  @non_invite_client_transactions = {}
12
12
  @is_reliable_transport_listener = true
13
+ @is_outbound_listener = true
13
14
 
14
15
  LOG_ID = "SIP TLS-Tunnel IPv6 server"
15
16
  def log_id
@@ -9,6 +9,7 @@ module OverSIP::SIP
9
9
  @non_invite_server_transactions = {}
10
10
  @invite_client_transactions = {}
11
11
  @non_invite_client_transactions = {}
12
+ @is_outbound_listener = true
12
13
 
13
14
  LOG_ID = "SIP UDP IPv6 server"
14
15
  def log_id
@@ -2,6 +2,10 @@ module OverSIP::SIP
2
2
 
3
3
  class TcpClient < TcpConnection
4
4
 
5
+ class << self
6
+ attr_reader :server_class
7
+ end
8
+
5
9
  attr_reader :connected
6
10
  attr_reader :pending_client_transactions
7
11
 
@@ -66,6 +70,28 @@ module OverSIP::SIP
66
70
  @connected = false
67
71
  end
68
72
 
73
+
74
+ # For the case in which OverSIP receives a SIP request from a connection open by OverSIP.
75
+ def record_route
76
+ @record_route and return @record_route
77
+
78
+ server_class = self.class.server_class
79
+ local_port, local_ip = ::Socket.unpack_sockaddr_in(get_sockname)
80
+
81
+ case
82
+ when server_class == ::OverSIP::SIP::IPv4TcpServer
83
+ uri_ip = local_ip
84
+ when server_class == ::OverSIP::SIP::IPv6TcpServer
85
+ uri_ip = "[#{local_ip}]"
86
+ when server_class == ::OverSIP::SIP::IPv4TlsServer
87
+ uri_ip = local_ip
88
+ when server_class == ::OverSIP::SIP::IPv6TlsServer
89
+ uri_ip = "[#{local_ip}]"
90
+ end
91
+
92
+ @record_route = "<sip:#{uri_ip}:#{local_port};transport=#{server_class.transport.to_s};lr;ovid=#{OverSIP::SIP::Tags.value_for_route_ovid}>"
93
+ end
94
+
69
95
  end
70
96
 
71
97
  end
@@ -21,6 +21,13 @@ module OverSIP::SIP
21
21
  def receive_data data
22
22
  @state == :ignore and return
23
23
  @buffer << data
24
+ @state == :waiting_for_on_client_tls_handshake and return
25
+
26
+ process_received_data
27
+ end
28
+
29
+ def process_received_data
30
+ @state == :ignore and return
24
31
 
25
32
  while (case @state
26
33
  when :init
@@ -52,7 +59,6 @@ module OverSIP::SIP
52
59
  false
53
60
  end)
54
61
  end # while
55
-
56
62
  end
57
63
 
58
64
  def parse_headers
@@ -28,7 +28,7 @@ module OverSIP::SIP
28
28
  set_sock_opt Socket::SOL_TCP, Socket::TCP_KEEPINTVL, ::OverSIP::SIP.tcp_keepalive_interval # Interval between TCP pings.
29
29
  end
30
30
 
31
- log_system_info "connection opened from " << remote_desc
31
+ log_system_debug("connection opened from " << remote_desc) if $oversip_debug
32
32
  end
33
33
 
34
34
  def remote_desc force=nil
@@ -55,40 +55,44 @@ module OverSIP::SIP
55
55
 
56
56
  # This is called after all the calls to ssl_verify_peer().
57
57
  def ssl_handshake_completed
58
- log_system_info "TLS connection established to " << remote_desc
58
+ log_system_debug("TLS connection established to " << remote_desc) if $oversip_debug
59
59
 
60
60
  # @connected in TlsClient means "TLS connection" rather than
61
61
  # just "TCP connection".
62
62
  @connected = true
63
63
  @timer_tls_handshake.cancel if @timer_tls_handshake
64
64
 
65
- if @callback_on_server_tls_handshake
66
- begin
67
- ::OverSIP::SipEvents.on_server_tls_handshake self, @server_pems
68
- rescue ::Exception => e
69
- log_system_error "error calling OverSIP::SipEvents.on_server_tls_handshake():"
70
- log_system_error e
71
- close_connection
72
- end
65
+ # Run OverSIP::SipEvents.on_server_tls_handshake.
66
+ ::Fiber.new do
67
+ if @callback_on_server_tls_handshake
68
+ log_system_debug "running OverSIP::SipEvents.on_server_tls_handshake()..." if $oversip_debug
69
+ begin
70
+ ::OverSIP::SipEvents.on_server_tls_handshake self, @server_pems
71
+ rescue ::Exception => e
72
+ log_system_error "error calling OverSIP::SipEvents.on_server_tls_handshake():"
73
+ log_system_error e
74
+ close_connection
75
+ end
73
76
 
74
- # If the user has closed the connection in the on_server_tls_handshake() callback
75
- # then @local_closed is true, so notify pending transactions.
76
- if @local_closed
77
- @pending_client_transactions.each do |client_transaction|
78
- client_transaction.tls_validation_failed
77
+ # If the user or peer has closed the connection in the on_server_tls_handshake() callback
78
+ # then notify pending transactions.
79
+ if @local_closed or error?
80
+ log_system_debug "connection closed, aborting" if $oversip_debug
81
+ @pending_client_transactions.each do |client_transaction|
82
+ client_transaction.tls_validation_failed
83
+ end
84
+ @pending_client_transactions.clear
85
+ @pending_messages.clear
86
+ @state = :ignore
79
87
  end
80
- @pending_client_transactions.clear
81
- @pending_messages.clear
82
- @state = :ignore
83
- return
84
88
  end
85
- end
86
89
 
87
- @pending_client_transactions.clear
88
- @pending_messages.each do |msg|
89
- send_data msg
90
- end
91
- @pending_messages.clear
90
+ @pending_client_transactions.clear
91
+ @pending_messages.each do |msg|
92
+ send_data msg
93
+ end
94
+ @pending_messages.clear
95
+ end.resume
92
96
  end
93
97
 
94
98
  def unbind cause=nil
@@ -51,20 +51,37 @@ module OverSIP::SIP
51
51
  @timer_tls_handshake.cancel if @timer_tls_handshake
52
52
 
53
53
  if ::OverSIP::SIP.callback_on_client_tls_handshake
54
- begin
55
- ::OverSIP::SipEvents.on_client_tls_handshake self, @client_pems
56
- rescue ::Exception => e
57
- log_system_error "error calling OverSIP::SipEvents.on_client_tls_handshake():"
58
- log_system_error e
59
- close_connection
60
- end
54
+ # Set the state to :waiting_for_on_client_tls_handshake so data received after TLS handshake but before
55
+ # user callback validation is just stored.
56
+ @state = :waiting_for_on_client_tls_handshake
57
+
58
+ # Run OverSIP::SipEvents.on_client_tls_handshake.
59
+ ::Fiber.new do
60
+ begin
61
+ log_system_debug "running OverSIP::SipEvents.on_client_tls_handshake()..." if $oversip_debug
62
+ ::OverSIP::SipEvents.on_client_tls_handshake self, @client_pems
63
+ # If the user of the peer has not closed the connection then continue.
64
+ unless @local_closed or error?
65
+ @state = :init
66
+ # Call process_received_data() to process possible data received in the meanwhile.
67
+ process_received_data
68
+ else
69
+ log_system_debug "connection closed, aborting" if $oversip_debug
70
+ end
71
+
72
+ rescue ::Exception => e
73
+ log_system_error "error calling OverSIP::SipEvents.on_client_tls_handshake():"
74
+ log_system_error e
75
+ close_connection
76
+ end
77
+ end.resume
61
78
  end
62
79
  end
63
80
 
64
81
 
65
82
  def unbind cause=nil
66
- super
67
83
  @timer_tls_handshake.cancel if @timer_tls_handshake
84
+ super
68
85
  end
69
86
 
70
87
  end
@@ -6,9 +6,8 @@ module OverSIP::SIP
6
6
  # (avoid DoS attacks).
7
7
  HEADERS_MAX_SIZE = 16384
8
8
 
9
- def receive_data data
9
+ def process_received_data
10
10
  @state == :ignore and return
11
- @buffer << data
12
11
 
13
12
  while (case @state
14
13
  when :init
@@ -25,9 +24,6 @@ module OverSIP::SIP
25
24
  when :haproxy_protocol
26
25
  parse_haproxy_protocol
27
26
 
28
- #when :client_pems
29
- # parse_client_pems
30
-
31
27
  when :headers
32
28
  parse_headers
33
29
 
@@ -87,25 +83,6 @@ module OverSIP::SIP
87
83
  end
88
84
  end
89
85
 
90
- # TODO: Not terminated yet.
91
- # def parse_client_pems
92
- # # TODO: Wrong, it could occur that here the last PEMs byte arries.
93
- # return false if @buffer.size < 3 # 3 bytes = 0\r\n (minimum data).
94
- #
95
- # @pems_str ||= ""
96
- # @pems_str << @buffer.read(2)
97
- #
98
- # # No PEMS.
99
- # if @pems_str == "\r\n"
100
- # @state = :headers
101
- # return true
102
- # end
103
- #
104
- # #@pem_size_str =
105
- #
106
- # @state = :headers
107
- # end
108
-
109
86
  end
110
87
 
111
88
  end
@@ -110,7 +110,7 @@ module OverSIP::SIP
110
110
  def set_header name, value
111
111
  @headers[MessageParser.headerize(name)] =
112
112
  case value
113
- when Array
113
+ when ::Array
114
114
  value
115
115
  else
116
116
  [ value.to_s ]
@@ -135,7 +135,7 @@ module OverSIP::SIP
135
135
  # _value_ must be a string.
136
136
  def insert_header name, value
137
137
  if hdr = @headers[k=MessageParser.headerize(name)]
138
- hdr.insert 0, value.to_s
138
+ hdr.unshift value.to_s
139
139
  else
140
140
  #@headers[k] = [ value.to_s ]
141
141
  # NOTE: If the header name doesn't already exist in the mesage, insert
@@ -76,6 +76,17 @@ module OverSIP::SIP
76
76
  # Run the user provided OverSIP::SipEvents.on_request() callback (unless the request
77
77
  # it's a retransmission, a CANCEL or an ACK for a final non-2XX response).
78
78
  unless check_transaction
79
+ # Check OverSIP status.
80
+ unless ::OverSIP.status == :running
81
+ case ::OverSIP.status
82
+ when :loading
83
+ @msg.reply 500, "Server Still Loading", [ "Retry-After: 5" ]
84
+ when :terminating
85
+ @msg.reply 500, "Server is Being Stopped"
86
+ end
87
+ return
88
+ end
89
+
79
90
  # Create the antiloop identifier for this request.
80
91
  @msg.antiloop_id = ::OverSIP::SIP::Tags.create_antiloop_id(@msg)
81
92
 
@@ -89,14 +100,16 @@ module OverSIP::SIP
89
100
  @msg.tvars = {}
90
101
  @msg.cvars = @msg.connection.cvars
91
102
 
92
- begin
93
- # Run the callback.
94
- ::OverSIP::SipEvents.on_request @msg
95
- rescue ::Exception => e
96
- log_system_error "error calling OverSIP::SipEvents.on_request() => 500:"
97
- log_system_error e
98
- @msg.reply 500, "Internal Error", ["Content-Type: text/plain"], "#{e.class}: #{e.message}"
99
- end
103
+ # Run OverSIP::SipEvents.on_request within a fiber.
104
+ ::Fiber.new do
105
+ begin
106
+ ::OverSIP::SipEvents.on_request @msg
107
+ rescue ::Exception => e
108
+ log_system_error "error calling OverSIP::SipEvents.on_request() => 500:"
109
+ log_system_error e
110
+ @msg.reply 500, "Internal Error", ["Content-Type: text/plain"], "#{e.class}: #{e.message}"
111
+ end
112
+ end.resume
100
113
  end
101
114
  end
102
115
  private :process_request
@@ -106,9 +119,6 @@ module OverSIP::SIP
106
119
  def process_response
107
120
  case @msg.sip_method
108
121
  when :INVITE
109
- ### TODO: Esto va a petar cuando tenga una clase que hereda de, p.ej, IPv4TcpServer que se llame xxxClient,
110
- # ya que en ella no existirá @invite_client_transactions. Tengo que hacer que su @invite_client_transactions
111
- # se rellene al de la clase padre al hacer el load de las clases.
112
122
  if client_transaction = @msg.connection.class.invite_client_transactions[@msg.via_branch_id]
113
123
  client_transaction.receive_response(@msg)
114
124
  return
@@ -136,7 +146,7 @@ module OverSIP::SIP
136
146
 
137
147
  when :INVITE
138
148
  if server_transaction = @msg.connection.class.invite_server_transactions[@msg.via_branch_id]
139
- # If the retranmission arrives via a different connection (for TCP/TLS) then use
149
+ # If the retranmission arrives via a different connection (for TCP/TLS/WS/WSS) then use
140
150
  # the new one.
141
151
  if @msg.connection == server_transaction.request.connection
142
152
  log_system_debug "INVITE retransmission received" if $oversip_debug
@@ -155,7 +165,7 @@ module OverSIP::SIP
155
165
  server_transaction.receive_ack
156
166
  return true
157
167
  # Absorb ACK for statelessly generated final responses by us.
158
- elsif OverSIP::SIP::Tags.check_totag_for_sl_reply(@msg.to_tag)
168
+ elsif ::OverSIP::SIP::Tags.check_totag_for_sl_reply(@msg.to_tag)
159
169
  log_system_debug "absorving ACK for a stateless final response" if $oversip_debug
160
170
  return true
161
171
  else
@@ -4,6 +4,17 @@ module OverSIP::SIP
4
4
 
5
5
  attr_reader :display_name
6
6
 
7
+ def initialize display_name=nil, scheme=:sip, user=nil, host=nil, port=nil
8
+ @display_name = display_name
9
+ @scheme = scheme.to_sym
10
+ @user = user
11
+ @host = host
12
+ @host_type = ::OverSIP::Utils.ip_type(host) || :domain if host
13
+ @port = port
14
+
15
+ @name_addr_modified = true
16
+ end
17
+
7
18
  def display_name= value
8
19
  @display_name = value
9
20
  @name_addr_modified = true