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.
- checksums.yaml +7 -0
- data/AUTHORS +22 -0
- data/LICENSE +25 -0
- data/README.md +43 -0
- data/Rakefile +54 -0
- data/bin/oversip +184 -0
- data/etc/oversip.conf +274 -0
- data/etc/proxies.conf +145 -0
- data/etc/server.rb +315 -0
- data/etc/tls/ca/cacert.pem +3894 -0
- data/etc/tls/demo-tls.oversip.net.crt +17 -0
- data/etc/tls/demo-tls.oversip.net.key +15 -0
- data/etc/tls/upgrade-cacert.sh +12 -0
- data/etc/tls/utils/create-cert.rb +162 -0
- data/etc/tls/utils/get-sip-identities.rb +95 -0
- data/ext/common/c_util.h +74 -0
- data/ext/common/ruby_c_util.h +88 -0
- data/ext/sip_parser/common_headers.h +210 -0
- data/ext/sip_parser/ext_help.h +18 -0
- data/ext/sip_parser/extconf.rb +3 -0
- data/ext/sip_parser/sip_message_parser.c +29741 -0
- data/ext/sip_parser/sip_parser.h +250 -0
- data/ext/sip_parser/sip_parser_ruby.c +1370 -0
- data/ext/sip_parser/sip_uri_parser.c +39699 -0
- data/ext/stud/extconf.rb +43 -0
- data/ext/stun/ext_help.h +16 -0
- data/ext/stun/extconf.rb +3 -0
- data/ext/stun/stun_ruby.c +394 -0
- data/ext/utils/ext_help.h +14 -0
- data/ext/utils/extconf.rb +3 -0
- data/ext/utils/haproxy_protocol.c +6163 -0
- data/ext/utils/haproxy_protocol.h +27 -0
- data/ext/utils/ip_utils.c +5952 -0
- data/ext/utils/ip_utils.h +64 -0
- data/ext/utils/outbound_utils.c +3227 -0
- data/ext/utils/outbound_utils.h +27 -0
- data/ext/utils/utils_ruby.c +392 -0
- data/ext/utils/utils_ruby.h +76 -0
- data/ext/websocket_framing_utils/ext_help.h +18 -0
- data/ext/websocket_framing_utils/extconf.rb +3 -0
- data/ext/websocket_framing_utils/ws_framing_utils.h +47 -0
- data/ext/websocket_framing_utils/ws_framing_utils_ruby.c +135 -0
- data/ext/websocket_http_parser/ext_help.h +18 -0
- data/ext/websocket_http_parser/extconf.rb +3 -0
- data/ext/websocket_http_parser/ws_http_parser.c +1635 -0
- data/ext/websocket_http_parser/ws_http_parser.h +87 -0
- data/ext/websocket_http_parser/ws_http_parser_ruby.c +630 -0
- data/lib/oversip/config.rb +597 -0
- data/lib/oversip/config_validators.rb +126 -0
- data/lib/oversip/default_server.rb +52 -0
- data/lib/oversip/errors.rb +10 -0
- data/lib/oversip/fiber_pool.rb +56 -0
- data/lib/oversip/launcher.rb +635 -0
- data/lib/oversip/logger.rb +84 -0
- data/lib/oversip/modules/outbound_mangling.rb +56 -0
- data/lib/oversip/modules/user_assertion.rb +73 -0
- data/lib/oversip/proxies_config.rb +189 -0
- data/lib/oversip/ruby_ext/eventmachine.rb +38 -0
- data/lib/oversip/sip/client.rb +428 -0
- data/lib/oversip/sip/client_transaction.rb +586 -0
- data/lib/oversip/sip/constants.rb +88 -0
- data/lib/oversip/sip/core.rb +217 -0
- data/lib/oversip/sip/launcher.rb +221 -0
- data/lib/oversip/sip/listeners/connection.rb +54 -0
- data/lib/oversip/sip/listeners/ipv4_tcp_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv4_tcp_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv4_tls_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv4_tls_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv4_tls_tunnel_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv4_udp_server.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tcp_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tcp_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv6_tls_client.rb +21 -0
- data/lib/oversip/sip/listeners/ipv6_tls_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv6_tls_tunnel_server.rb +22 -0
- data/lib/oversip/sip/listeners/ipv6_udp_server.rb +21 -0
- data/lib/oversip/sip/listeners/tcp_client.rb +97 -0
- data/lib/oversip/sip/listeners/tcp_connection.rb +202 -0
- data/lib/oversip/sip/listeners/tcp_server.rb +71 -0
- data/lib/oversip/sip/listeners/tls_client.rb +125 -0
- data/lib/oversip/sip/listeners/tls_server.rb +88 -0
- data/lib/oversip/sip/listeners/tls_tunnel_connection.rb +89 -0
- data/lib/oversip/sip/listeners/tls_tunnel_server.rb +61 -0
- data/lib/oversip/sip/listeners/udp_connection.rb +214 -0
- data/lib/oversip/sip/listeners.rb +24 -0
- data/lib/oversip/sip/message.rb +177 -0
- data/lib/oversip/sip/message_processor.rb +213 -0
- data/lib/oversip/sip/name_addr.rb +51 -0
- data/lib/oversip/sip/proxy.rb +324 -0
- data/lib/oversip/sip/request.rb +179 -0
- data/lib/oversip/sip/response.rb +37 -0
- data/lib/oversip/sip/rfc3263.rb +643 -0
- data/lib/oversip/sip/server_transaction.rb +295 -0
- data/lib/oversip/sip/sip.rb +76 -0
- data/lib/oversip/sip/tags.rb +39 -0
- data/lib/oversip/sip/timers.rb +55 -0
- data/lib/oversip/sip/transport_manager.rb +130 -0
- data/lib/oversip/sip/uac.rb +89 -0
- data/lib/oversip/sip/uac_request.rb +84 -0
- data/lib/oversip/sip/uri.rb +208 -0
- data/lib/oversip/syslog.rb +68 -0
- data/lib/oversip/system_callbacks.rb +45 -0
- data/lib/oversip/tls.rb +172 -0
- data/lib/oversip/utils.rb +30 -0
- data/lib/oversip/version.rb +21 -0
- data/lib/oversip/websocket/constants.rb +55 -0
- data/lib/oversip/websocket/http_request.rb +59 -0
- data/lib/oversip/websocket/launcher.rb +183 -0
- data/lib/oversip/websocket/listeners/connection.rb +51 -0
- data/lib/oversip/websocket/listeners/ipv4_ws_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv4_wss_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv4_wss_tunnel_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv6_ws_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv6_wss_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ipv6_wss_tunnel_server.rb +22 -0
- data/lib/oversip/websocket/listeners/ws_server.rb +331 -0
- data/lib/oversip/websocket/listeners/wss_server.rb +88 -0
- data/lib/oversip/websocket/listeners/wss_tunnel_server.rb +133 -0
- data/lib/oversip/websocket/listeners.rb +13 -0
- data/lib/oversip/websocket/websocket.rb +13 -0
- data/lib/oversip/websocket/ws_framing.rb +545 -0
- data/lib/oversip/websocket/ws_sip_app.rb +120 -0
- data/lib/oversip.rb +127 -0
- data/test/oversip_test_helper.rb +19 -0
- data/test/test_http_parser.rb +73 -0
- data/test/test_name_addr.rb +27 -0
- data/test/test_name_addr_parser.rb +24 -0
- data/test/test_sip_message_parser.rb +168 -0
- data/test/test_sip_uri_parser.rb +56 -0
- data/test/test_uri.rb +68 -0
- data/thirdparty/stud/stud.tar.gz +0 -0
- metadata +334 -0
data/lib/oversip.rb
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#
|
|
2
|
+
# OverSIP
|
|
3
|
+
# Copyright (c) 2012-2014 Iñaki Baz Castillo <ibc@aliax.net>
|
|
4
|
+
# MIT License
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
# Ruby built-in libraries.
|
|
8
|
+
|
|
9
|
+
require "rbconfig"
|
|
10
|
+
require "etc"
|
|
11
|
+
require "fileutils"
|
|
12
|
+
require "socket"
|
|
13
|
+
require "timeout"
|
|
14
|
+
require "yaml"
|
|
15
|
+
require "tempfile"
|
|
16
|
+
require "base64"
|
|
17
|
+
require "digest/md5"
|
|
18
|
+
require "digest/sha1"
|
|
19
|
+
require "securerandom"
|
|
20
|
+
require "fiber"
|
|
21
|
+
require "openssl"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Ruby external gems.
|
|
25
|
+
|
|
26
|
+
require "syslog"
|
|
27
|
+
gem "eventmachine", "~> 1.2.0"
|
|
28
|
+
require "eventmachine"
|
|
29
|
+
gem "iobuffer", "= 1.1.2"
|
|
30
|
+
require "iobuffer"
|
|
31
|
+
gem "em-udns", "= 0.3.6"
|
|
32
|
+
require "em-udns"
|
|
33
|
+
gem "escape_utils", "= 1.0.1"
|
|
34
|
+
require "escape_utils"
|
|
35
|
+
gem "term-ansicolor", "= 1.3.2"
|
|
36
|
+
require "term/ansicolor"
|
|
37
|
+
gem "posix-spawn", "= 0.3.9"
|
|
38
|
+
require "posix-spawn"
|
|
39
|
+
gem "em-synchrony", "= 1.0.3"
|
|
40
|
+
require "em-synchrony"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# OverSIP files.
|
|
44
|
+
|
|
45
|
+
require "oversip/version.rb"
|
|
46
|
+
require "oversip/syslog.rb"
|
|
47
|
+
require "oversip/logger.rb"
|
|
48
|
+
require "oversip/config.rb"
|
|
49
|
+
require "oversip/config_validators.rb"
|
|
50
|
+
require "oversip/proxies_config.rb"
|
|
51
|
+
require "oversip/errors.rb"
|
|
52
|
+
require "oversip/launcher.rb"
|
|
53
|
+
require "oversip/utils.#{RbConfig::CONFIG["DLEXT"]}"
|
|
54
|
+
require "oversip/utils.rb"
|
|
55
|
+
require "oversip/default_server.rb"
|
|
56
|
+
require "oversip/system_callbacks.rb"
|
|
57
|
+
|
|
58
|
+
require "oversip/sip/sip.rb"
|
|
59
|
+
require "oversip/sip/sip_parser.#{RbConfig::CONFIG["DLEXT"]}"
|
|
60
|
+
require "oversip/sip/constants.rb"
|
|
61
|
+
require "oversip/sip/core.rb"
|
|
62
|
+
require "oversip/sip/message.rb"
|
|
63
|
+
require "oversip/sip/request.rb"
|
|
64
|
+
require "oversip/sip/response.rb"
|
|
65
|
+
require "oversip/sip/uri.rb"
|
|
66
|
+
require "oversip/sip/name_addr.rb"
|
|
67
|
+
require "oversip/sip/message_processor.rb"
|
|
68
|
+
require "oversip/sip/listeners.rb"
|
|
69
|
+
require "oversip/sip/launcher.rb"
|
|
70
|
+
require "oversip/sip/server_transaction.rb"
|
|
71
|
+
require "oversip/sip/client_transaction.rb"
|
|
72
|
+
require "oversip/sip/transport_manager.rb"
|
|
73
|
+
require "oversip/sip/timers.rb"
|
|
74
|
+
require "oversip/sip/tags.rb"
|
|
75
|
+
require "oversip/sip/rfc3263.rb"
|
|
76
|
+
require "oversip/sip/client.rb"
|
|
77
|
+
require "oversip/sip/proxy.rb"
|
|
78
|
+
require "oversip/sip/uac.rb"
|
|
79
|
+
require "oversip/sip/uac_request.rb"
|
|
80
|
+
|
|
81
|
+
require "oversip/websocket/websocket.rb"
|
|
82
|
+
require "oversip/websocket/ws_http_parser.#{RbConfig::CONFIG["DLEXT"]}"
|
|
83
|
+
require "oversip/websocket/constants.rb"
|
|
84
|
+
require "oversip/websocket/http_request.rb"
|
|
85
|
+
require "oversip/websocket/listeners.rb"
|
|
86
|
+
require "oversip/websocket/launcher.rb"
|
|
87
|
+
require "oversip/websocket/ws_framing_utils.#{RbConfig::CONFIG["DLEXT"]}"
|
|
88
|
+
require "oversip/websocket/ws_framing.rb"
|
|
89
|
+
require "oversip/websocket/ws_sip_app.rb"
|
|
90
|
+
|
|
91
|
+
require "oversip/fiber_pool.rb"
|
|
92
|
+
require "oversip/tls.rb"
|
|
93
|
+
require "oversip/stun.#{RbConfig::CONFIG["DLEXT"]}"
|
|
94
|
+
|
|
95
|
+
require "oversip/modules/user_assertion.rb"
|
|
96
|
+
require "oversip/modules/outbound_mangling.rb"
|
|
97
|
+
|
|
98
|
+
require "oversip/ruby_ext/eventmachine.rb"
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
module OverSIP
|
|
102
|
+
|
|
103
|
+
class << self
|
|
104
|
+
attr_accessor :pid_file, :master_name, :pid, :daemonized,
|
|
105
|
+
:configuration,
|
|
106
|
+
:proxies,
|
|
107
|
+
:tls_public_cert, :tls_private_cert,
|
|
108
|
+
:stud_pids,
|
|
109
|
+
:is_ready, # true, false
|
|
110
|
+
:status, # :loading, :running, :terminating
|
|
111
|
+
:root_fiber
|
|
112
|
+
|
|
113
|
+
def daemonized?
|
|
114
|
+
@daemonized
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Pre-declare internal modules.
|
|
120
|
+
module SIP ; end
|
|
121
|
+
module WebSocket ; end
|
|
122
|
+
module Modules ; end
|
|
123
|
+
|
|
124
|
+
# Allow OverSIP::M::MODULE_NAME usage.
|
|
125
|
+
M = Modules
|
|
126
|
+
|
|
127
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "test/unit"
|
|
2
|
+
require "oversip"
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class OverSIPTest < Test::Unit::TestCase
|
|
6
|
+
|
|
7
|
+
def assert_true(object, message="")
|
|
8
|
+
assert_equal(true, object, message)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def assert_false(object, message="")
|
|
12
|
+
assert_equal(false, object, message)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def assert_equal_options(options, element)
|
|
16
|
+
assert options.include?(element)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require "oversip_test_helper"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestHttpParser < OverSIPTest
|
|
7
|
+
|
|
8
|
+
def parse data
|
|
9
|
+
parser = OverSIP::WebSocket::HttpRequestParser.new
|
|
10
|
+
buffer = IO::Buffer.new
|
|
11
|
+
request = OverSIP::WebSocket::HttpRequest.new
|
|
12
|
+
|
|
13
|
+
buffer << data
|
|
14
|
+
|
|
15
|
+
unless bytes_parsed = parser.execute(request, buffer.to_str, 0)
|
|
16
|
+
raise "ERROR: parsing error: \"#{parser.error}\""
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if parser.finished?
|
|
20
|
+
buffer.read bytes_parsed
|
|
21
|
+
if request.content_length and ! request.content_length.zero?
|
|
22
|
+
request.body = buffer.read request.content_length
|
|
23
|
+
end
|
|
24
|
+
if buffer.size != 0
|
|
25
|
+
raise "ERROR: buffer is not empty after parsing"
|
|
26
|
+
end
|
|
27
|
+
else
|
|
28
|
+
raise "ERROR: parsed NOT finished!"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
[parser, request]
|
|
32
|
+
end
|
|
33
|
+
private :parse
|
|
34
|
+
|
|
35
|
+
def test_parse_http_get
|
|
36
|
+
parser, request = parse <<-END
|
|
37
|
+
GET /chat?qwe=QWE&asd=#fragment HTTP/1.1\r
|
|
38
|
+
Host: server.example.Com.\r
|
|
39
|
+
Upgrade: WebSocket\r
|
|
40
|
+
Connection: keep-Alive , Upgrade\r
|
|
41
|
+
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r
|
|
42
|
+
Sec-WebSocket-protocol: foo , chat.lalala.com\r
|
|
43
|
+
Sec-WebSocket-protocol: xmpp.nonaino.org\r
|
|
44
|
+
Origin: http://example.Com\r
|
|
45
|
+
Sec-WebSocket-Version: 13\r
|
|
46
|
+
noNaino-lALA : qwe\r
|
|
47
|
+
NOnaino-lala: asd\r
|
|
48
|
+
\r
|
|
49
|
+
END
|
|
50
|
+
|
|
51
|
+
assert_equal request.http_method, :GET
|
|
52
|
+
assert_equal request.http_version, "HTTP/1.1"
|
|
53
|
+
|
|
54
|
+
assert_equal "/chat?qwe=QWE&asd=#fragment", request.uri
|
|
55
|
+
assert_equal "/chat", request.uri_path
|
|
56
|
+
assert_equal "qwe=QWE&asd=", request.uri_query
|
|
57
|
+
assert_equal "fragment", request.uri_fragment
|
|
58
|
+
assert_equal request.uri_scheme, nil
|
|
59
|
+
assert_equal "server.example.com", request.host
|
|
60
|
+
assert_nil request.port
|
|
61
|
+
|
|
62
|
+
assert_nil request.content_length
|
|
63
|
+
assert request.hdr_connection.include?("upgrade")
|
|
64
|
+
assert_equal "websocket", request.hdr_upgrade
|
|
65
|
+
assert_equal 13, request.hdr_sec_websocket_version
|
|
66
|
+
assert_equal "dGhlIHNhbXBsZSBub25jZQ==", request.hdr_sec_websocket_key
|
|
67
|
+
assert_equal "http://example.com", request.hdr_origin
|
|
68
|
+
assert_equal ["foo", "chat.lalala.com", "xmpp.nonaino.org"], request.hdr_sec_websocket_protocol
|
|
69
|
+
|
|
70
|
+
assert_equal ["qwe", "asd"], request["Nonaino-Lala"]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require "oversip_test_helper"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestNameAddr < OverSIPTest
|
|
7
|
+
|
|
8
|
+
def test_name_addr
|
|
9
|
+
full_name_addr = '"Iñaki Baz Castillo" <sips:i%C3%B1aki@aliax.net:5060;transport=tcp;foo=123;baz?X-Header-1=qwe&X-Header-2=asd>'
|
|
10
|
+
aor = "sip:i%C3%B1aki@aliax.net"
|
|
11
|
+
|
|
12
|
+
name_addr = ::OverSIP::SIP::NameAddr.new "Iñaki Baz Castillo", :sips, "iñaki", "aliax.net", 5060
|
|
13
|
+
name_addr.transport_param = :tcp
|
|
14
|
+
name_addr.set_param "FOO", "123"
|
|
15
|
+
name_addr.set_param "baz", nil
|
|
16
|
+
name_addr.headers = "?X-Header-1=qwe&X-Header-2=asd"
|
|
17
|
+
|
|
18
|
+
assert_true name_addr.sip?
|
|
19
|
+
assert_false name_addr.tel?
|
|
20
|
+
assert_false name_addr.unknown_scheme?
|
|
21
|
+
assert_equal "iñaki", name_addr.user
|
|
22
|
+
assert_equal "123", name_addr.get_param("Foo")
|
|
23
|
+
assert_equal aor, name_addr.aor
|
|
24
|
+
assert_equal full_name_addr, name_addr.to_s
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require "oversip_test_helper"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestNameAddrParser < OverSIPTest
|
|
7
|
+
|
|
8
|
+
def test_parse_name_addr
|
|
9
|
+
name_addr_str = '"Iñaki" <sips:i%C3%B1aki@aliax.net:5060;transport=tcp;foo=123;baz?X-Header-1=qwe&X-Header-2=asd>'
|
|
10
|
+
aor = "sip:i%C3%B1aki@aliax.net"
|
|
11
|
+
|
|
12
|
+
name_addr = ::OverSIP::SIP::NameAddr.parse name_addr_str
|
|
13
|
+
|
|
14
|
+
assert_equal ::OverSIP::SIP::NameAddr, name_addr.class
|
|
15
|
+
assert_equal "Iñaki", name_addr.display_name
|
|
16
|
+
assert_true name_addr.sip?
|
|
17
|
+
assert_false name_addr.unknown_scheme?
|
|
18
|
+
assert_equal "iñaki", name_addr.user
|
|
19
|
+
assert_equal "123", name_addr.get_param("Foo")
|
|
20
|
+
assert_equal aor, name_addr.aor
|
|
21
|
+
assert_equal name_addr_str, name_addr.to_s
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require "oversip_test_helper"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestSipMessageParser < OverSIPTest
|
|
7
|
+
|
|
8
|
+
def parse data
|
|
9
|
+
parser = OverSIP::SIP::MessageParser.new
|
|
10
|
+
buffer = IO::Buffer.new
|
|
11
|
+
|
|
12
|
+
buffer << data
|
|
13
|
+
|
|
14
|
+
unless bytes_parsed = parser.execute(buffer.to_str, 0)
|
|
15
|
+
raise "ERROR: parsing error for class #{parser.parsed.class}: \"#{parser.error}\""
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
msg = parser.parsed
|
|
19
|
+
|
|
20
|
+
if parser.finished?
|
|
21
|
+
buffer.read bytes_parsed
|
|
22
|
+
if msg.content_length and ! msg.content_length.zero?
|
|
23
|
+
msg.body = buffer.read msg.content_length
|
|
24
|
+
end
|
|
25
|
+
if buffer.size != 0
|
|
26
|
+
raise "ERROR: buffer is not empty after parsing"
|
|
27
|
+
end
|
|
28
|
+
else
|
|
29
|
+
raise "ERROR: parsed NOT finished! (msg.class = #{msg.class})"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
parser.post_parsing
|
|
33
|
+
|
|
34
|
+
[parser, msg]
|
|
35
|
+
end
|
|
36
|
+
private :parse
|
|
37
|
+
|
|
38
|
+
def test_parse_sip_invite
|
|
39
|
+
parser, msg = parse <<-END
|
|
40
|
+
INVITE sip:sips%3Auser%40example.com@example.NET.;transport=tcp;FOO=baz?Subject=lalala SIP/2.0\r
|
|
41
|
+
via: SIP/2.0/UDP host5.example.net;branch=z9hG4bKkdjuw ; Rport\r
|
|
42
|
+
v: SIP/2.0/TCP 1.2.3.4;branch=z9hG4bKkdjuw\r
|
|
43
|
+
To: <tel:+(34)-94-499-44-22;lalala=lololo>\r
|
|
44
|
+
from: <sips:I%20have%20spaces@[2001:123:Ab:0:0::123]:9999> ;\r
|
|
45
|
+
tag=938\r
|
|
46
|
+
Route: <sip:qweqwe/.+asdasd@1.2.3.4:7777;LR;ob>,\r
|
|
47
|
+
"Server Ñ€áéíóú" <SIP:[01::000:A0f]:6666;lr>\r
|
|
48
|
+
Max-Forwards: 87\r
|
|
49
|
+
_i: esc01.239409asdfakjkn23onasd0-3234\r
|
|
50
|
+
CSeq: 234234 INVITE\r
|
|
51
|
+
C: application/sdp\r
|
|
52
|
+
Require: AAA, Bbb\r
|
|
53
|
+
Require: ccc\r
|
|
54
|
+
Proxy-Require: AAA, Bbb\r
|
|
55
|
+
Proxy-Require: ccc\r
|
|
56
|
+
Supported: AAA, Bbb\r
|
|
57
|
+
k: ccc\r
|
|
58
|
+
Contact:\r
|
|
59
|
+
<sip:cal%6Cer@host5.example.net;%6C%72;n%61me=v%61lue%25%34%31;ob>;p1=foo;P2=BAR;+sip-instance=qweqwe;reg-id=1\r
|
|
60
|
+
Content-Length: 150\r
|
|
61
|
+
\r
|
|
62
|
+
v=0\r
|
|
63
|
+
o=mhandley 29739 7272939 IN IP4 192.0.2.1\r
|
|
64
|
+
s=-\r
|
|
65
|
+
c=IN IP4 192.0.2.1\r
|
|
66
|
+
t=0 0\r
|
|
67
|
+
m=audio 49217 RTP/AVP 0 12\r
|
|
68
|
+
m=video 3227 RTP/AVP 31\r
|
|
69
|
+
a=rtpmap:31 LPC\r
|
|
70
|
+
END
|
|
71
|
+
|
|
72
|
+
assert_equal msg.class, OverSIP::SIP::Request
|
|
73
|
+
assert_equal msg.sip_method, :INVITE
|
|
74
|
+
assert_equal msg.sip_version, "SIP/2.0"
|
|
75
|
+
assert_true msg.initial?
|
|
76
|
+
|
|
77
|
+
assert_false parser.duplicated_core_header?
|
|
78
|
+
assert_equal parser.missing_core_header?, "Call-ID"
|
|
79
|
+
|
|
80
|
+
assert_equal msg.num_vias, 2
|
|
81
|
+
assert_equal msg.via_sent_by_host, "host5.example.net"
|
|
82
|
+
assert_nil msg.via_sent_by_port
|
|
83
|
+
assert_nil msg.via_received
|
|
84
|
+
assert_true msg.via_rport?
|
|
85
|
+
assert_equal msg.via_core_value, "SIP/2.0/UDP host5.example.net"
|
|
86
|
+
assert_nil msg.via_params
|
|
87
|
+
assert_equal ["SIP/2.0/UDP host5.example.net;branch=z9hG4bKkdjuw ; Rport", "SIP/2.0/TCP 1.2.3.4;branch=z9hG4bKkdjuw"], msg.hdr_via
|
|
88
|
+
|
|
89
|
+
assert_equal msg.cseq, 234234
|
|
90
|
+
assert_equal msg.max_forwards, 87
|
|
91
|
+
assert_equal msg.content_length, 150
|
|
92
|
+
assert_equal msg.body.bytesize, 150
|
|
93
|
+
|
|
94
|
+
assert_equal "sip:sips%3auser%40example.com@example.net.;transport=tcp;foo=baz?subject=lalala", msg.ruri.uri.downcase
|
|
95
|
+
assert_equal :sip, msg.ruri.scheme
|
|
96
|
+
assert_equal "sips:user@example.com", msg.ruri.user
|
|
97
|
+
assert_equal "example.net", msg.ruri.host
|
|
98
|
+
assert_equal :domain, msg.ruri.host_type
|
|
99
|
+
assert_nil msg.ruri.port
|
|
100
|
+
assert_equal({"transport" => "tcp", "foo" => "baz"}, msg.ruri.params)
|
|
101
|
+
assert_equal "?Subject=lalala", msg.ruri.headers
|
|
102
|
+
assert_equal :tcp, msg.ruri.transport_param
|
|
103
|
+
assert_nil msg.ruri.phone_context_param
|
|
104
|
+
|
|
105
|
+
assert_equal :sips, msg.from.scheme
|
|
106
|
+
assert_equal "I have spaces", msg.from.user
|
|
107
|
+
assert OverSIP::Utils.compare_ips("[2001:123:ab::123]", msg.from.host)
|
|
108
|
+
assert_equal :ipv6_reference, msg.from.host_type
|
|
109
|
+
assert_equal 9999, msg.from.port
|
|
110
|
+
assert_equal({}, msg.from.params)
|
|
111
|
+
assert_equal "938", msg.from_tag
|
|
112
|
+
|
|
113
|
+
assert_equal :tel, msg.to.scheme
|
|
114
|
+
assert_equal "+34944994422", msg.to.user
|
|
115
|
+
assert_nil msg.to.host
|
|
116
|
+
assert_nil msg.to.port
|
|
117
|
+
assert_equal({"lalala" => "lololo"}, msg.to.params)
|
|
118
|
+
assert_nil msg.to_tag
|
|
119
|
+
|
|
120
|
+
assert_equal :sip, msg.contact.scheme
|
|
121
|
+
assert_equal "caller", msg.contact.user
|
|
122
|
+
assert_equal "host5.example.net", msg.contact.host
|
|
123
|
+
assert_equal :domain, msg.contact.host_type
|
|
124
|
+
assert_nil msg.contact.port
|
|
125
|
+
assert_true msg.contact.ob_param?
|
|
126
|
+
assert_equal({"%6c%72" => nil, "n%61me" => "v%61lue%25%34%31", "ob" => nil}, msg.contact.params)
|
|
127
|
+
assert_equal ";p1=foo;P2=BAR;+sip-instance=qweqwe;reg-id=1", msg.contact_params
|
|
128
|
+
assert_true msg.contact_reg_id?
|
|
129
|
+
|
|
130
|
+
assert_equal 2, msg.routes.size
|
|
131
|
+
|
|
132
|
+
assert_nil msg.routes.first.display_name
|
|
133
|
+
assert_equal :sip, msg.routes.first.scheme
|
|
134
|
+
assert_equal "qweqwe/.+asdasd", msg.routes.first.user
|
|
135
|
+
assert OverSIP::Utils.compare_ips("1.2.3.4", msg.routes.first.host)
|
|
136
|
+
assert_equal "1.2.3.4", msg.routes.first.host
|
|
137
|
+
assert_equal :ipv4, msg.routes.first.host_type
|
|
138
|
+
assert_equal 7777, msg.routes.first.port
|
|
139
|
+
assert_true msg.routes.first.lr_param?
|
|
140
|
+
|
|
141
|
+
assert_equal "Server Ñ€áéíóú", msg.routes[1].display_name
|
|
142
|
+
assert_equal :sip, msg.routes[1].scheme
|
|
143
|
+
assert_nil msg.routes[1].user
|
|
144
|
+
assert OverSIP::Utils.compare_ips("[1::a0f]", msg.routes[1].host)
|
|
145
|
+
assert_equal :ipv6_reference, msg.routes[1].host_type
|
|
146
|
+
assert_equal 6666, msg.routes[1].port
|
|
147
|
+
assert_true msg.routes[1].lr_param?
|
|
148
|
+
|
|
149
|
+
assert_equal ["aaa", "bbb", "ccc"], msg.require
|
|
150
|
+
assert_equal ["aaa", "bbb", "ccc"], msg.proxy_require
|
|
151
|
+
assert_equal ["aaa", "bbb", "ccc"], msg.supported
|
|
152
|
+
|
|
153
|
+
# Change the full RURI and test again.
|
|
154
|
+
msg.ruri = ::OverSIP::SIP::Uri.new :sips, "iñaki", "aliax.net", 7070
|
|
155
|
+
|
|
156
|
+
assert_equal :sips, msg.ruri.scheme
|
|
157
|
+
assert_equal "iñaki", msg.ruri.user
|
|
158
|
+
assert_equal "aliax.net", msg.ruri.host
|
|
159
|
+
assert_equal :domain, msg.ruri.host_type
|
|
160
|
+
assert_equal 7070, msg.ruri.port
|
|
161
|
+
assert_equal({}, msg.ruri.params)
|
|
162
|
+
assert_nil msg.ruri.headers
|
|
163
|
+
assert_nil msg.ruri.transport_param
|
|
164
|
+
assert_nil msg.ruri.phone_context_param
|
|
165
|
+
assert_equal "sips:i%C3%B1aki@aliax.net:7070", msg.ruri.to_s
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require "oversip_test_helper"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestSipUriParser < OverSIPTest
|
|
7
|
+
|
|
8
|
+
def test_parse_sip_uri
|
|
9
|
+
uri_str = "sips:i%C3%B1aki@aliax.net:5060;transport=tcp;foo=123;baz?X-Header-1=qwe&X-Header-2=asd"
|
|
10
|
+
aor = "sip:i%C3%B1aki@aliax.net"
|
|
11
|
+
|
|
12
|
+
uri = ::OverSIP::SIP::Uri.parse uri_str
|
|
13
|
+
|
|
14
|
+
assert_equal ::OverSIP::SIP::Uri, uri.class
|
|
15
|
+
assert_true uri.sip?
|
|
16
|
+
assert_false uri.unknown_scheme?
|
|
17
|
+
assert_equal "iñaki", uri.user
|
|
18
|
+
assert_true uri.has_param? "FOO"
|
|
19
|
+
assert_false uri.has_param? "LALALA"
|
|
20
|
+
assert_equal "123", uri.get_param("Foo")
|
|
21
|
+
assert_equal aor, uri.aor
|
|
22
|
+
assert_equal uri_str, uri.to_s
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_parse_tel_uri
|
|
26
|
+
uri_str = "tel:944991212;foo=bar;phone-context=+34"
|
|
27
|
+
aor = "tel:944991212"
|
|
28
|
+
|
|
29
|
+
uri = ::OverSIP::SIP::Uri.parse uri_str
|
|
30
|
+
|
|
31
|
+
assert_equal ::OverSIP::SIP::Uri, uri.class
|
|
32
|
+
assert_true uri.tel?
|
|
33
|
+
assert_false uri.unknown_scheme?
|
|
34
|
+
assert_equal "944991212", uri.number
|
|
35
|
+
assert_true uri.has_param? "FOO"
|
|
36
|
+
assert_false uri.has_param? "LALALA"
|
|
37
|
+
assert_equal "bar", uri.get_param("Foo")
|
|
38
|
+
assert_equal aor, uri.aor
|
|
39
|
+
assert_equal uri_str, uri.to_s
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_parse_http_uri
|
|
43
|
+
uri_str = "http://oversip.net/authors/"
|
|
44
|
+
aor = nil
|
|
45
|
+
|
|
46
|
+
uri = ::OverSIP::SIP::Uri.parse uri_str
|
|
47
|
+
|
|
48
|
+
assert_equal ::OverSIP::SIP::Uri, uri.class
|
|
49
|
+
assert_false uri.sip?
|
|
50
|
+
assert_false uri.tel?
|
|
51
|
+
assert_true uri.unknown_scheme?
|
|
52
|
+
assert_nil uri.has_param? "FOO"
|
|
53
|
+
assert_nil uri.aor
|
|
54
|
+
assert_equal uri_str, uri.to_s
|
|
55
|
+
end
|
|
56
|
+
end
|
data/test/test_uri.rb
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require "oversip_test_helper"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class TestUri < OverSIPTest
|
|
7
|
+
|
|
8
|
+
def test_sip_uri
|
|
9
|
+
full_uri = "sips:i%C3%B1aki@aliax.net:5060;transport=tcp;foo=123;baz?X-Header-1=qwe&X-Header-2=asd"
|
|
10
|
+
aor = "sip:i%C3%B1aki@aliax.net"
|
|
11
|
+
|
|
12
|
+
uri = ::OverSIP::SIP::Uri.new :sips, "iñaki", "aliax.net", 5060
|
|
13
|
+
uri.transport_param = :tcp
|
|
14
|
+
uri.set_param "FOO", "123"
|
|
15
|
+
uri.set_param "baz", nil
|
|
16
|
+
uri.headers = "?X-Header-1=qwe&X-Header-2=asd"
|
|
17
|
+
|
|
18
|
+
assert_true uri.sip?
|
|
19
|
+
assert_false uri.tel?
|
|
20
|
+
assert_false uri.unknown_scheme?
|
|
21
|
+
assert_equal "iñaki", uri.user
|
|
22
|
+
assert_equal "123", uri.get_param("Foo")
|
|
23
|
+
assert_equal aor, uri.aor
|
|
24
|
+
assert_equal full_uri, uri.to_s
|
|
25
|
+
|
|
26
|
+
uri.clear_params
|
|
27
|
+
|
|
28
|
+
assert_equal({}, uri.params)
|
|
29
|
+
assert_equal "sips:i%C3%B1aki@aliax.net:5060?X-Header-1=qwe&X-Header-2=asd", uri.to_s
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_tel_uri
|
|
33
|
+
full_uri = "tel:944991212;foo=bar;phone-context=+34"
|
|
34
|
+
aor = "tel:944991212"
|
|
35
|
+
|
|
36
|
+
uri = ::OverSIP::SIP::Uri.new :tel, "944991212"
|
|
37
|
+
uri.set_param "FOO", "bar"
|
|
38
|
+
uri.phone_context_param = "+34"
|
|
39
|
+
|
|
40
|
+
assert_false uri.sip?
|
|
41
|
+
assert_true uri.tel?
|
|
42
|
+
assert_false uri.unknown_scheme?
|
|
43
|
+
assert_equal "944991212", uri.number
|
|
44
|
+
assert_equal "bar", uri.get_param("Foo")
|
|
45
|
+
assert_equal aor, uri.aor
|
|
46
|
+
assert_equal full_uri, uri.to_s
|
|
47
|
+
|
|
48
|
+
uri.clear_params
|
|
49
|
+
|
|
50
|
+
assert_equal({}, uri.params)
|
|
51
|
+
assert_equal aor, uri.to_s
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def test_http_uri
|
|
55
|
+
full_uri = "http://oversip.net/authors/"
|
|
56
|
+
aor = nil
|
|
57
|
+
|
|
58
|
+
uri = ::OverSIP::SIP::Uri.allocate
|
|
59
|
+
uri.instance_variable_set :@uri, full_uri
|
|
60
|
+
|
|
61
|
+
assert_false uri.sip?
|
|
62
|
+
assert_false uri.tel?
|
|
63
|
+
assert_true uri.unknown_scheme?
|
|
64
|
+
assert_nil uri.aor
|
|
65
|
+
assert_equal full_uri, uri.to_s
|
|
66
|
+
assert_nil uri.clear_params
|
|
67
|
+
end
|
|
68
|
+
end
|
|
Binary file
|