barx 0.1.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.
- data/MIT-LICENSE +21 -0
- data/README +11 -0
- data/examples/README +78 -0
- data/examples/dix +47 -0
- data/examples/proxri +41 -0
- data/examples/xrioid +66 -0
- data/lib/barx.rb +9 -0
- data/lib/httpclient/cacert.p7s +952 -0
- data/lib/httpclient/cookie.rb +541 -0
- data/lib/httpclient/http.rb +602 -0
- data/lib/httpclient.rb +2054 -0
- data/lib/xri_parser.rb +163 -0
- data/lib/xri_resolver.rb +1056 -0
- data/test/authority_parser_profile.rb +14 -0
- data/test/test_helper.rb +7 -0
- data/test/unit/all.rb +7 -0
- data/test/unit/authority_parser_test.rb +300 -0
- data/test/unit/input_param_parser_test.rb +93 -0
- data/test/unit/multi_stage_resolution_test.rb +44 -0
- data/test/unit/sep_selection_test.rb +87 -0
- data/test/xrds_sources/empty_sels_no_append_qxri_sep +13 -0
- data/test/xrds_sources/empty_sels_sep +13 -0
- data/test/xrds_sources/first_stage1 +38 -0
- data/test/xrds_sources/no_svc_sep +8 -0
- data/test/xrds_sources/second_stage1 +26 -0
- data/test/xrds_sources/sep1 +31 -0
- metadata +82 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'ruby-prof'
|
3
|
+
require File.dirname(__FILE__) + '/../dist/lib/xri_parser'
|
4
|
+
include XriParser
|
5
|
+
|
6
|
+
RubyProf.start
|
7
|
+
1000.times do
|
8
|
+
parsed = AuthorityParser.parse('@example*foo')
|
9
|
+
end
|
10
|
+
result = RubyProf.stop
|
11
|
+
|
12
|
+
# Print a flat profile to text
|
13
|
+
printer = RubyProf::FlatPrinter.new(result)
|
14
|
+
printer.print(STDOUT, 0)
|
data/test/test_helper.rb
ADDED
data/test/unit/all.rb
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
UNIT_TEST_ROOT = File.dirname(__FILE__)
|
3
|
+
|
4
|
+
require "#{UNIT_TEST_ROOT}/authority_parser_test.rb"
|
5
|
+
require "#{UNIT_TEST_ROOT}/input_param_parser_test.rb"
|
6
|
+
require "#{UNIT_TEST_ROOT}/multi_stage_resolution_test.rb"
|
7
|
+
require "#{UNIT_TEST_ROOT}/sep_selection_test.rb"
|
@@ -0,0 +1,300 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
class AuthorityParserTest < Test::Unit::TestCase
|
3
|
+
include XriParser
|
4
|
+
|
5
|
+
def test_parse1
|
6
|
+
parsed = AuthorityParser.parse('@example')
|
7
|
+
assert_equal '@', parsed.root
|
8
|
+
assert_equal 1, parsed.subsegments.length
|
9
|
+
assert_equal '*example', parsed.subsegments[0]
|
10
|
+
assert_equal '@*example', parsed.fully_qualified
|
11
|
+
assert parsed.path.empty?
|
12
|
+
assert_equal '@', parsed.community
|
13
|
+
assert_equal 'example', parsed.local_iname
|
14
|
+
assert !parsed.is_inumber?
|
15
|
+
end
|
16
|
+
def test_parse2
|
17
|
+
parsed = AuthorityParser.parse('@example*foo')
|
18
|
+
assert_equal '@', parsed.root
|
19
|
+
assert_equal 2, parsed.subsegments.length
|
20
|
+
assert_equal '*example', parsed.subsegments[0]
|
21
|
+
assert_equal '*foo', parsed.subsegments[1]
|
22
|
+
assert_equal '@*example*foo', parsed.fully_qualified
|
23
|
+
assert parsed.path.empty?
|
24
|
+
assert_equal '@example', parsed.community
|
25
|
+
assert_equal 'foo', parsed.local_iname
|
26
|
+
assert !parsed.is_inumber?
|
27
|
+
end
|
28
|
+
def test_parse3
|
29
|
+
parsed = AuthorityParser.parse('=example')
|
30
|
+
assert_equal '=', parsed.root
|
31
|
+
assert_equal 1, parsed.subsegments.length
|
32
|
+
assert_equal '*example', parsed.subsegments[0]
|
33
|
+
assert_equal '=*example', parsed.fully_qualified
|
34
|
+
assert parsed.path.empty?
|
35
|
+
assert_equal '=', parsed.community
|
36
|
+
assert_equal 'example', parsed.local_iname
|
37
|
+
assert !parsed.is_inumber?
|
38
|
+
end
|
39
|
+
def test_parse4
|
40
|
+
parsed = AuthorityParser.parse('=example*foo')
|
41
|
+
assert_equal '=', parsed.root
|
42
|
+
assert_equal 2, parsed.subsegments.length
|
43
|
+
assert_equal '*example', parsed.subsegments[0]
|
44
|
+
assert_equal '*foo', parsed.subsegments[1]
|
45
|
+
assert_equal '=*example*foo', parsed.fully_qualified
|
46
|
+
assert parsed.path.empty?
|
47
|
+
assert_equal '=example', parsed.community
|
48
|
+
assert_equal 'foo', parsed.local_iname
|
49
|
+
assert !parsed.is_inumber?
|
50
|
+
end
|
51
|
+
def test_parse5
|
52
|
+
parsed = AuthorityParser.parse('!!1001')
|
53
|
+
assert_equal '!', parsed.root
|
54
|
+
assert_equal 1, parsed.subsegments.length
|
55
|
+
assert_equal '!1001', parsed.subsegments[0]
|
56
|
+
assert_equal '!!1001', parsed.fully_qualified
|
57
|
+
assert parsed.path.empty?
|
58
|
+
assert_equal '!', parsed.community
|
59
|
+
assert_nil parsed.local_iname
|
60
|
+
assert_equal '!1001', parsed.local_inumber
|
61
|
+
assert parsed.is_inumber?
|
62
|
+
end
|
63
|
+
def test_parse6
|
64
|
+
parsed = AuthorityParser.parse('=!9C9D.73FC.7768.6268')
|
65
|
+
assert_equal '=', parsed.root
|
66
|
+
assert_equal 1, parsed.subsegments.length
|
67
|
+
assert_equal '!9C9D.73FC.7768.6268', parsed.subsegments[0]
|
68
|
+
assert_equal '=!9C9D.73FC.7768.6268', parsed.fully_qualified
|
69
|
+
assert parsed.path.empty?
|
70
|
+
assert_equal '=', parsed.community
|
71
|
+
assert_nil parsed.local_iname
|
72
|
+
assert_equal '!9C9D.73FC.7768.6268', parsed.local_inumber
|
73
|
+
assert parsed.is_inumber?
|
74
|
+
end
|
75
|
+
def test_parse7
|
76
|
+
parsed = AuthorityParser.parse('=!9C9D.73FC.7768.6268!1002')
|
77
|
+
assert_equal '=', parsed.root
|
78
|
+
assert_equal 2, parsed.subsegments.length
|
79
|
+
assert_equal '!9C9D.73FC.7768.6268', parsed.subsegments[0]
|
80
|
+
assert_equal '!1002', parsed.subsegments[1]
|
81
|
+
assert parsed.path.empty?
|
82
|
+
assert_equal '=!9C9D.73FC.7768.6268', parsed.community
|
83
|
+
assert_nil parsed.local_iname
|
84
|
+
assert_equal '!1002', parsed.local_inumber
|
85
|
+
assert parsed.is_inumber?
|
86
|
+
end
|
87
|
+
## examples from http://wiki.oasis-open.org/xri/XriCd02/GlobalXrefs
|
88
|
+
## compound global xrefs omitted because of Special Status note that document
|
89
|
+
def test_parse8
|
90
|
+
parsed = AuthorityParser.parse('@!!1000')
|
91
|
+
assert_equal '@', parsed.root
|
92
|
+
assert_equal 2, parsed.subsegments.length
|
93
|
+
assert_equal '!', parsed.subsegments[0]
|
94
|
+
assert_equal '!1000', parsed.subsegments[1]
|
95
|
+
assert_equal '@!!1000', parsed.fully_qualified
|
96
|
+
assert parsed.path.empty?
|
97
|
+
assert_equal '@!', parsed.community
|
98
|
+
assert_nil parsed.local_iname
|
99
|
+
assert_equal '!1000', parsed.local_inumber
|
100
|
+
assert parsed.is_inumber?
|
101
|
+
end
|
102
|
+
def test_parse9
|
103
|
+
parsed = AuthorityParser.parse('@example*foo=baz')
|
104
|
+
assert_equal '@', parsed.root
|
105
|
+
assert_equal 3, parsed.subsegments.length
|
106
|
+
assert_equal '*example', parsed.subsegments[0]
|
107
|
+
assert_equal '*foo', parsed.subsegments[1]
|
108
|
+
assert_equal '=baz', parsed.subsegments[2]
|
109
|
+
assert_equal '@*example*foo=baz', parsed.fully_qualified
|
110
|
+
assert parsed.path.empty?
|
111
|
+
assert_equal '@example*foo', parsed.community
|
112
|
+
assert_nil parsed.local_inumber
|
113
|
+
assert_equal '=baz', parsed.local_iname
|
114
|
+
assert !parsed.is_inumber?
|
115
|
+
end
|
116
|
+
def test_parse10
|
117
|
+
parsed = AuthorityParser.parse('@*foo=baz')
|
118
|
+
assert_equal '@', parsed.root
|
119
|
+
assert_equal 2, parsed.subsegments.length
|
120
|
+
assert_equal '*foo', parsed.subsegments[0]
|
121
|
+
assert_equal '=baz', parsed.subsegments[1]
|
122
|
+
assert_equal '@*foo=baz', parsed.fully_qualified
|
123
|
+
assert parsed.path.empty?
|
124
|
+
assert_equal '@foo', parsed.community
|
125
|
+
assert_nil parsed.local_inumber
|
126
|
+
assert_equal '=baz', parsed.local_iname
|
127
|
+
assert !parsed.is_inumber?
|
128
|
+
end
|
129
|
+
def test_parse11
|
130
|
+
parsed = AuthorityParser.parse('@!1234*foo')
|
131
|
+
assert_equal '@', parsed.root
|
132
|
+
assert_equal 2, parsed.subsegments.length
|
133
|
+
assert_equal '!1234', parsed.subsegments[0]
|
134
|
+
assert_equal '*foo', parsed.subsegments[1]
|
135
|
+
assert_equal '@!1234*foo', parsed.fully_qualified
|
136
|
+
assert parsed.path.empty?
|
137
|
+
assert_equal '@!1234', parsed.community
|
138
|
+
assert_nil parsed.local_inumber
|
139
|
+
assert_equal 'foo', parsed.local_iname
|
140
|
+
assert !parsed.is_inumber?
|
141
|
+
end
|
142
|
+
def test_parse12
|
143
|
+
parsed = AuthorityParser.parse('@=baz')
|
144
|
+
assert_equal '@', parsed.root
|
145
|
+
assert_equal 1, parsed.subsegments.length
|
146
|
+
assert_equal '=baz', parsed.subsegments[0]
|
147
|
+
assert_equal '@=baz', parsed.fully_qualified
|
148
|
+
assert parsed.path.empty?
|
149
|
+
assert_equal '@', parsed.community
|
150
|
+
assert_nil parsed.local_inumber
|
151
|
+
assert_equal '=baz', parsed.local_iname
|
152
|
+
assert !parsed.is_inumber?
|
153
|
+
end
|
154
|
+
def test_parse13
|
155
|
+
parsed = AuthorityParser.parse('@example*(=foo)')
|
156
|
+
assert_equal '@', parsed.root
|
157
|
+
assert_equal 2, parsed.subsegments.length
|
158
|
+
assert_equal '*example', parsed.subsegments[0]
|
159
|
+
assert_equal '*(=foo)', parsed.subsegments[1]
|
160
|
+
assert_equal '@*example*(=foo)', parsed.fully_qualified
|
161
|
+
assert parsed.path.empty?
|
162
|
+
assert_equal '@example', parsed.community
|
163
|
+
assert_nil parsed.local_inumber
|
164
|
+
assert_equal '(=foo)', parsed.local_iname
|
165
|
+
assert !parsed.is_inumber?
|
166
|
+
end
|
167
|
+
def test_parse14
|
168
|
+
parsed = AuthorityParser.parse('$ip*124.173.14.2*bar')
|
169
|
+
assert_equal '$ip*124.173.14.2', parsed.root
|
170
|
+
assert_equal 1, parsed.subsegments.length
|
171
|
+
assert_equal '*bar', parsed.subsegments[0]
|
172
|
+
assert_equal '$ip*124.173.14.2*bar', parsed.fully_qualified
|
173
|
+
assert parsed.path.empty?
|
174
|
+
assert_equal '$ip*124.173.14.2', parsed.community
|
175
|
+
assert_nil parsed.local_inumber
|
176
|
+
assert_equal 'bar', parsed.local_iname
|
177
|
+
assert !parsed.is_inumber?
|
178
|
+
end
|
179
|
+
def test_parse15
|
180
|
+
parsed = AuthorityParser.parse('$ip*124.173.14.2!1234')
|
181
|
+
assert_equal '$ip*124.173.14.2', parsed.root
|
182
|
+
assert_equal 1, parsed.subsegments.length
|
183
|
+
assert_equal '!1234', parsed.subsegments[0]
|
184
|
+
assert_equal '$ip*124.173.14.2!1234', parsed.fully_qualified
|
185
|
+
assert parsed.path.empty?
|
186
|
+
assert_equal '$ip*124.173.14.2', parsed.community
|
187
|
+
assert_nil parsed.local_iname
|
188
|
+
assert_equal '!1234', parsed.local_inumber
|
189
|
+
assert parsed.is_inumber?
|
190
|
+
end
|
191
|
+
def test_parse16
|
192
|
+
parsed = AuthorityParser.parse('$ip*124.173.14.2=example')
|
193
|
+
assert_equal '$ip*124.173.14.2', parsed.root
|
194
|
+
assert_equal 1, parsed.subsegments.length
|
195
|
+
assert_equal '=example', parsed.subsegments[0]
|
196
|
+
assert_equal '$ip*124.173.14.2=example', parsed.fully_qualified
|
197
|
+
assert parsed.path.empty?
|
198
|
+
assert_equal '$ip*124.173.14.2', parsed.community
|
199
|
+
assert_nil parsed.local_inumber
|
200
|
+
assert_equal '=example', parsed.local_iname
|
201
|
+
assert !parsed.is_inumber?
|
202
|
+
end
|
203
|
+
def test_parse17
|
204
|
+
parsed = AuthorityParser.parse('$dns*www.example.com*bar')
|
205
|
+
assert_equal '$dns*www.example.com', parsed.root
|
206
|
+
assert_equal 1, parsed.subsegments.length
|
207
|
+
assert_equal '*bar', parsed.subsegments[0]
|
208
|
+
assert_equal '$dns*www.example.com*bar', parsed.fully_qualified
|
209
|
+
assert parsed.path.empty?
|
210
|
+
assert_equal '$dns*www.example.com', parsed.community
|
211
|
+
assert_nil parsed.local_inumber
|
212
|
+
assert_equal 'bar', parsed.local_iname
|
213
|
+
assert !parsed.is_inumber?
|
214
|
+
end
|
215
|
+
def test_parse18
|
216
|
+
parsed = AuthorityParser.parse('$dns*www.example.com=example')
|
217
|
+
assert_equal '$dns*www.example.com', parsed.root
|
218
|
+
assert_equal 1, parsed.subsegments.length
|
219
|
+
assert_equal '=example', parsed.subsegments[0]
|
220
|
+
assert_equal '$dns*www.example.com=example', parsed.fully_qualified
|
221
|
+
assert parsed.path.empty?
|
222
|
+
assert_equal '$dns*www.example.com', parsed.community
|
223
|
+
assert_nil parsed.local_inumber
|
224
|
+
assert_equal '=example', parsed.local_iname
|
225
|
+
assert !parsed.is_inumber?
|
226
|
+
end
|
227
|
+
def test_parse19
|
228
|
+
parsed = AuthorityParser.parse('$dns*www.example.com!1234')
|
229
|
+
assert_equal '$dns*www.example.com', parsed.root
|
230
|
+
assert_equal 1, parsed.subsegments.length
|
231
|
+
assert_equal '!1234', parsed.subsegments[0]
|
232
|
+
assert_equal '$dns*www.example.com!1234', parsed.fully_qualified
|
233
|
+
assert parsed.path.empty?
|
234
|
+
assert_equal '$dns*www.example.com', parsed.community
|
235
|
+
assert_nil parsed.local_iname
|
236
|
+
assert_equal '!1234', parsed.local_inumber
|
237
|
+
assert parsed.is_inumber?
|
238
|
+
end
|
239
|
+
def test_parse20
|
240
|
+
parsed = AuthorityParser.parse('$(http://example.com/user/)*foo')
|
241
|
+
assert_equal '$(http://example.com/user/)', parsed.root
|
242
|
+
assert_equal 1, parsed.subsegments.length
|
243
|
+
assert_equal '*foo', parsed.subsegments[0]
|
244
|
+
assert_equal '$(http://example.com/user/)*foo', parsed.fully_qualified
|
245
|
+
assert parsed.path.empty?
|
246
|
+
assert_equal '$(http://example.com/user/)', parsed.community
|
247
|
+
assert_nil parsed.local_inumber
|
248
|
+
assert_equal 'foo', parsed.local_iname
|
249
|
+
assert !parsed.is_inumber?
|
250
|
+
end
|
251
|
+
def test_parse21
|
252
|
+
parsed = AuthorityParser.parse('$(http://example.com/user/)=example')
|
253
|
+
assert_equal '$(http://example.com/user/)', parsed.root
|
254
|
+
assert_equal 1, parsed.subsegments.length
|
255
|
+
assert_equal '=example', parsed.subsegments[0]
|
256
|
+
assert_equal '$(http://example.com/user/)=example', parsed.fully_qualified
|
257
|
+
assert parsed.path.empty?
|
258
|
+
assert_equal '$(http://example.com/user/)', parsed.community
|
259
|
+
assert_nil parsed.local_inumber
|
260
|
+
assert_equal '=example', parsed.local_iname
|
261
|
+
assert !parsed.is_inumber?
|
262
|
+
end
|
263
|
+
def test_parse22
|
264
|
+
parsed = AuthorityParser.parse('$(http://example.com/user/)!1234')
|
265
|
+
assert_equal '$(http://example.com/user/)', parsed.root
|
266
|
+
assert_equal 1, parsed.subsegments.length
|
267
|
+
assert_equal '!1234', parsed.subsegments[0]
|
268
|
+
assert_equal '$(http://example.com/user/)!1234', parsed.fully_qualified
|
269
|
+
assert parsed.path.empty?
|
270
|
+
assert_equal '$(http://example.com/user/)', parsed.community
|
271
|
+
assert_nil parsed.local_iname
|
272
|
+
assert_equal '!1234', parsed.local_inumber
|
273
|
+
assert parsed.is_inumber?
|
274
|
+
end
|
275
|
+
## UUID identified community
|
276
|
+
def test_parse23
|
277
|
+
parsed = AuthorityParser.parse('$(6c0699fa-34a7-11dc-8314-0800200c9a66)*foo')
|
278
|
+
assert_equal '$(6c0699fa-34a7-11dc-8314-0800200c9a66)', parsed.root
|
279
|
+
assert_equal 1, parsed.subsegments.length
|
280
|
+
assert_equal '*foo', parsed.subsegments[0]
|
281
|
+
assert_equal '$(6c0699fa-34a7-11dc-8314-0800200c9a66)*foo', parsed.fully_qualified
|
282
|
+
assert parsed.path.empty?
|
283
|
+
assert_equal '$(6c0699fa-34a7-11dc-8314-0800200c9a66)', parsed.community
|
284
|
+
assert_nil parsed.local_inumber
|
285
|
+
assert_equal 'foo', parsed.local_iname
|
286
|
+
assert !parsed.is_inumber?
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_local_path_query_methods
|
290
|
+
parsed = AuthorityParser.parse('=example*foo/yellow/brick/road*v2?foo=bar')
|
291
|
+
assert_equal '=', parsed.root
|
292
|
+
assert_equal 2, parsed.subsegments.length
|
293
|
+
assert_equal '*example', parsed.subsegments[0]
|
294
|
+
assert_equal '*foo', parsed.subsegments[1]
|
295
|
+
assert_equal '=example*foo', parsed.authority
|
296
|
+
assert_equal '/yellow/brick/road*v2?foo=bar', parsed.local
|
297
|
+
assert_equal '/yellow/brick/road*v2', parsed.path
|
298
|
+
assert_equal 'foo=bar', parsed.query
|
299
|
+
end
|
300
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
class InputParamParserTest < Test::Unit::TestCase
|
3
|
+
include XriResolver
|
4
|
+
|
5
|
+
def test_default
|
6
|
+
resparams = ParseInputParameters.new()
|
7
|
+
assert_equal "", resparams.resolution_media_type
|
8
|
+
assert !resparams.service_media_type
|
9
|
+
assert !resparams.service_type
|
10
|
+
assert resparams.sep
|
11
|
+
assert resparams.cid
|
12
|
+
assert !resparams.nodefault_p
|
13
|
+
assert !resparams.nodefault_t
|
14
|
+
assert !resparams.nodefault_m
|
15
|
+
assert !resparams.https
|
16
|
+
assert !resparams.saml
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_saml_param
|
20
|
+
params = {:_xrd_r => 'application/xrds+xml;saml=true'}
|
21
|
+
resparams = ParseInputParameters.new(params)
|
22
|
+
assert_equal "application/xrds+xml", resparams.resolution_media_type
|
23
|
+
assert resparams.saml
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_all_query_params_set
|
27
|
+
params = {:_xrd_r => 'application/xrd+xml;saml=true;https=true;cid=1;refs=0;nodefault_p=1;nodefault_t=1;nodefault_m=1;sep=1',
|
28
|
+
:_xrd_t => 'xri://+i-service*(+forwarding)*($v*1.0)',
|
29
|
+
:_xrd_m => 'video/mpeg'}
|
30
|
+
resparams = ParseInputParameters.new(params)
|
31
|
+
assert_equal "application/xrd+xml", resparams.resolution_media_type
|
32
|
+
assert_equal "xri://+i-service*(+forwarding)*($v*1.0)", resparams.service_type
|
33
|
+
assert_equal "video/mpeg", resparams.service_media_type
|
34
|
+
assert resparams.sep
|
35
|
+
assert resparams.cid
|
36
|
+
assert resparams.nodefault_p
|
37
|
+
assert resparams.nodefault_t
|
38
|
+
assert resparams.nodefault_m
|
39
|
+
assert resparams.https
|
40
|
+
assert resparams.saml
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_header_params
|
44
|
+
params = {}
|
45
|
+
req = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*, application/xrds+xml'
|
46
|
+
resparams = ParseInputParameters.new(params, req)
|
47
|
+
assert_equal "application/xrds+xml", resparams.resolution_media_type
|
48
|
+
assert !resparams.service_media_type
|
49
|
+
assert !resparams.service_type
|
50
|
+
assert !resparams.sep
|
51
|
+
assert resparams.cid
|
52
|
+
assert !resparams.nodefault_p
|
53
|
+
assert !resparams.nodefault_t
|
54
|
+
assert !resparams.nodefault_m
|
55
|
+
assert !resparams.https
|
56
|
+
assert !resparams.saml
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_all_header_params_set
|
60
|
+
params = {}
|
61
|
+
req = 'application/xrd+xml;saml=1;https=1;cid=true;refs=false;sep=1;nodefault_p=1;nodefault_t=1;nodefault_m=1'
|
62
|
+
resparams = ParseInputParameters.new(params, req)
|
63
|
+
assert_equal "application/xrd+xml", resparams.resolution_media_type
|
64
|
+
assert !resparams.service_media_type
|
65
|
+
assert !resparams.service_type
|
66
|
+
assert resparams.sep
|
67
|
+
assert resparams.cid
|
68
|
+
assert resparams.nodefault_p
|
69
|
+
assert resparams.nodefault_t
|
70
|
+
assert resparams.nodefault_m
|
71
|
+
assert resparams.https
|
72
|
+
assert resparams.saml
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_combo
|
76
|
+
params = {:_xrd_t => 'xri://+i-service*(+forwarding)*($v*1.0)',
|
77
|
+
:_xrd_m => 'video/mpeg'}
|
78
|
+
req = 'text/uri-list'
|
79
|
+
resparams = ParseInputParameters.new(params, req)
|
80
|
+
assert_equal "text/uri-list", resparams.resolution_media_type
|
81
|
+
assert_equal "xri://+i-service*(+forwarding)*($v*1.0)", resparams.service_type
|
82
|
+
assert_equal "video/mpeg", resparams.service_media_type
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_params_override_accept_header
|
86
|
+
params = {:_xrd_r => 'application/xrd+xml;cid=true'}
|
87
|
+
req = 'application/xrds+xml;cid=false'
|
88
|
+
resparams = ParseInputParameters.new(params, req)
|
89
|
+
assert_equal "application/xrd+xml", resparams.resolution_media_type
|
90
|
+
assert resparams.cid
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
class MultiStageResolutionTest < Test::Unit::TestCase
|
3
|
+
|
4
|
+
class XriResolver::AuthorityResolver::HTTPClient
|
5
|
+
|
6
|
+
def self.authr=(authority_servers = {})
|
7
|
+
@@authority_servers = authority_servers
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_with_redirect(uri, query=nil, extheader={}, &block)
|
11
|
+
Retn.new({}, @@authority_servers[uri.to_s])
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_resolution_uses_local_httpclient_method
|
16
|
+
authrs = {'https://at.xri.net/*example' => IO.read("#{TEST_ROOT}/xrds_sources/first_stage1")}
|
17
|
+
XriResolver::AuthorityResolver::HTTPClient.authr = authrs
|
18
|
+
xrds = XriResolver::AuthorityResolver.resolve('@example')
|
19
|
+
assert xrds.instance_of?(XriResolver::AuthorityResolver)
|
20
|
+
assert xrds.resolved_successfully?
|
21
|
+
assert_equal '100', xrds.status_code
|
22
|
+
assert_equal '@*example', xrds.resolved
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_two_stage_resolution
|
26
|
+
authrs = {'https://at.xri.net/*example' => IO.read("#{TEST_ROOT}/xrds_sources/first_stage1"),
|
27
|
+
'http://resolve.example.com/resolve/@example/*user' => IO.read("#{TEST_ROOT}/xrds_sources/second_stage1")}
|
28
|
+
XriResolver::AuthorityResolver::HTTPClient.authr = authrs
|
29
|
+
xrds = XriResolver::AuthorityResolver.resolve('@example*user')
|
30
|
+
inputs = XriResolver::ParseInputParameters.new
|
31
|
+
assert xrds.instance_of?(XriResolver::AuthorityResolver)
|
32
|
+
assert xrds.resolved_successfully?
|
33
|
+
assert_equal '100', xrds.status_code
|
34
|
+
assert_equal '@*example*user', xrds.resolved
|
35
|
+
assert_equal 2, xrds.xrd_array.length
|
36
|
+
|
37
|
+
uri_list = XriResolver::SEPSelector.select(xrds, xrds.last_xrd, inputs).to_urilist
|
38
|
+
assert_equal ["http://example.com/contact/@example*user"], uri_list
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
end
|
44
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
class SEPSelectionTest < Test::Unit::TestCase
|
3
|
+
|
4
|
+
class XriResolver::AuthorityResolver::HTTPClient
|
5
|
+
|
6
|
+
def self.authr=(authority_servers = {})
|
7
|
+
@@authority_servers = authority_servers
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_with_redirect(uri, query=nil, extheader={}, &block)
|
11
|
+
Retn.new({}, @@authority_servers[uri.to_s])
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_resolution_uses_httpclient_stubbing
|
16
|
+
authrs = {'https://equal.xri.net/*example' => IO.read("#{TEST_ROOT}/xrds_sources/sep1")}
|
17
|
+
XriResolver::AuthorityResolver::HTTPClient.authr = authrs
|
18
|
+
xrds = XriResolver::AuthorityResolver.resolve('=example')
|
19
|
+
assert xrds.instance_of?(XriResolver::AuthorityResolver)
|
20
|
+
assert xrds.resolved_successfully?
|
21
|
+
assert_equal '100', xrds.status_code
|
22
|
+
assert_equal '=*example', xrds.resolved
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_select_path_match
|
26
|
+
authrs = {'https://equal.xri.net/*example' => IO.read("#{TEST_ROOT}/xrds_sources/sep1")}
|
27
|
+
XriResolver::AuthorityResolver::HTTPClient.authr = authrs
|
28
|
+
xrds = XriResolver::AuthorityResolver.resolve('=example/(+contact)')
|
29
|
+
inputs = XriResolver::ParseInputParameters.new
|
30
|
+
uri_list = XriResolver::SEPSelector.select(xrds, xrds.last_xrd, inputs).to_urilist
|
31
|
+
assert uri_list.kind_of?(Array)
|
32
|
+
## first SEP: positive match on null type, default match on path, default match on null mediaType
|
33
|
+
## second SEP, negative match on type, default match on path, default match on null mediaType
|
34
|
+
## third SEP, default match on type, positive/select match on path, default match on null mediaType
|
35
|
+
|
36
|
+
assert_equal ['http://example.com/contact/=example/(+contact)'], uri_list
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_empty_path_match
|
40
|
+
authrs = {'https://equal.xri.net/*example' => IO.read("#{TEST_ROOT}/xrds_sources/sep1")}
|
41
|
+
XriResolver::AuthorityResolver::HTTPClient.authr = authrs
|
42
|
+
xrds = XriResolver::AuthorityResolver.resolve('=example')
|
43
|
+
inputs = XriResolver::ParseInputParameters.new
|
44
|
+
uri_list = XriResolver::SEPSelector.select(xrds, xrds.last_xrd, inputs).to_urilist
|
45
|
+
assert uri_list.kind_of?(Array)
|
46
|
+
## first SEP: positive match on null type, default match on null path, default match on null mediaType
|
47
|
+
## second SEP, negative match on type, default match on null path, default match on null mediaType
|
48
|
+
## third SEP, default match on null type, positive match on null path, default match on null mediaType
|
49
|
+
|
50
|
+
assert_equal ['http://example.com/forwarding/=example', 'http://example.com/contact/=example'], uri_list
|
51
|
+
end
|
52
|
+
|
53
|
+
## these 3 are probably the simplest possible cases
|
54
|
+
def test_no_seps_in_xrd
|
55
|
+
authrs = {'https://equal.xri.net/*example' => IO.read("#{TEST_ROOT}/xrds_sources/no_svc_sep")}
|
56
|
+
XriResolver::AuthorityResolver::HTTPClient.authr = authrs
|
57
|
+
xrds = XriResolver::AuthorityResolver.resolve('=example')
|
58
|
+
inputs = XriResolver::ParseInputParameters.new
|
59
|
+
uri_list = XriResolver::SEPSelector.select(xrds, xrds.last_xrd, inputs).to_urilist
|
60
|
+
assert uri_list.kind_of?(Array)
|
61
|
+
assert uri_list.empty?
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_empty_sels_no_append_qxri_sep
|
65
|
+
authrs = {'https://equal.xri.net/*example' => IO.read("#{TEST_ROOT}/xrds_sources/empty_sels_no_append_qxri_sep")}
|
66
|
+
XriResolver::AuthorityResolver::HTTPClient.authr = authrs
|
67
|
+
xrds = XriResolver::AuthorityResolver.resolve('=example')
|
68
|
+
inputs = XriResolver::ParseInputParameters.new
|
69
|
+
uri_list = XriResolver::SEPSelector.select(xrds, xrds.last_xrd, inputs).to_urilist
|
70
|
+
assert uri_list.kind_of?(Array)
|
71
|
+
assert_equal 1, uri_list.size
|
72
|
+
assert_equal 'http://example.com/default_selection/', uri_list[0]
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_empty_sels_sep
|
76
|
+
authrs = {'https://equal.xri.net/*example' => IO.read("#{TEST_ROOT}/xrds_sources/empty_sels_sep")}
|
77
|
+
XriResolver::AuthorityResolver::HTTPClient.authr = authrs
|
78
|
+
xrds = XriResolver::AuthorityResolver.resolve('=example')
|
79
|
+
inputs = XriResolver::ParseInputParameters.new
|
80
|
+
uri_list = XriResolver::SEPSelector.select(xrds, xrds.last_xrd, inputs).to_urilist
|
81
|
+
assert uri_list.kind_of?(Array)
|
82
|
+
assert_equal 1, uri_list.size
|
83
|
+
assert_equal 'http://example.com/default_selection/=example', uri_list[0]
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<XRDS ref="xri://=example" xmlns="xri://$xrds">
|
3
|
+
<XRD xmlns="xri://$xrd*($v*2.0)">
|
4
|
+
<Query>*example</Query>
|
5
|
+
<Status code="100"/>
|
6
|
+
<CanonicalID priority="10">=!1234.5678</CanonicalID>
|
7
|
+
|
8
|
+
<Service priority="10">
|
9
|
+
<URI>http://example.com/default_selection/</URI>
|
10
|
+
</Service>
|
11
|
+
|
12
|
+
</XRD>
|
13
|
+
</XRDS>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<XRDS ref="xri://=example" xmlns="xri://$xrds">
|
3
|
+
<XRD xmlns="xri://$xrd*($v*2.0)">
|
4
|
+
<Query>*example</Query>
|
5
|
+
<Status code="100"/>
|
6
|
+
<CanonicalID priority="10">=!1234.5678</CanonicalID>
|
7
|
+
|
8
|
+
<Service priority="10">
|
9
|
+
<URI append="qxri">http://example.com/default_selection/</URI>
|
10
|
+
</Service>
|
11
|
+
|
12
|
+
</XRD>
|
13
|
+
</XRDS>
|
@@ -0,0 +1,38 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<XRDS ref="xri://@example" xmlns="xri://$xrds">
|
3
|
+
<XRD xmlns="xri://$xrd*($v*2.0)">
|
4
|
+
<Query>*example</Query>
|
5
|
+
<Status code="100"/>
|
6
|
+
<Expires>2007-08-27T17:27:07.000Z</Expires>
|
7
|
+
<ProviderID>xri://@</ProviderID>
|
8
|
+
<LocalID priority="10">!1234</LocalID>
|
9
|
+
<CanonicalID priority="10">@!1234</CanonicalID>
|
10
|
+
<Service priority="10">
|
11
|
+
<Type select="true">xri://$res*auth*($v*2.0)</Type>
|
12
|
+
<ProviderID>xri://!!1000</ProviderID>
|
13
|
+
<MediaType>application/xrds+xml;trust=none</MediaType>
|
14
|
+
<URI priority="10">http://resolve.example.com/resolve/@example/</URI>
|
15
|
+
</Service>
|
16
|
+
<Service priority="10">
|
17
|
+
<Type match="null"/>
|
18
|
+
<Type select="true">xri://+i-service*(+contact)*($v*1.0)</Type>
|
19
|
+
<ProviderID>xri://!!1000!100xx</ProviderID>
|
20
|
+
<Path select="true">(+contact)</Path>
|
21
|
+
<Path match="null"/>
|
22
|
+
<URI append="authority" priority="1">http://example.net/contact/</URI>
|
23
|
+
</Service>
|
24
|
+
<Service priority="1">
|
25
|
+
<Type match="content" select="true">xri://+i-service*(+forwarding)*($v*1.0)</Type>
|
26
|
+
<Type match="null" select="false"/>
|
27
|
+
<ProviderID>xri://!!1000!100</ProviderID>
|
28
|
+
<Path match="content">(+index)</Path>
|
29
|
+
<Path match="default"/>
|
30
|
+
<URI append="qxri" priority="1">http://example.net/forwarding/</URI>
|
31
|
+
</Service>
|
32
|
+
<Service priority="10">
|
33
|
+
<Type select="true">http://openid.net/signon/1.0</Type>
|
34
|
+
<ProviderID/>
|
35
|
+
<URI append="qxri" priority="1">https://example.net/server/</URI>
|
36
|
+
</Service>
|
37
|
+
</XRD>
|
38
|
+
</XRDS>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<XRDS xmlns="xri://$xrds" ref="xri://@example*user">
|
3
|
+
<XRD xmlns:xrd="xri://$xrd*($v*2.0)">
|
4
|
+
<Query>*user</Query>
|
5
|
+
<Status code="100">SUCCESS</Status>
|
6
|
+
<ProviderID>xri://!!1000</ProviderID>
|
7
|
+
<LocalID >!1234</LocalID>
|
8
|
+
<CanonicalID >@!1234!1234</CanonicalID>
|
9
|
+
<xrd:Service>
|
10
|
+
<xrd:ProviderID>xri://!!1000!100</xrd:ProviderID>
|
11
|
+
<xrd:Type select="true">xri://+i-service*(+contact)*($v*1.0)</xrd:Type> <xrd:Type match="null"></xrd:Type>
|
12
|
+
|
13
|
+
<xrd:Path select="true">(+contact)</xrd:Path> <xrd:Path match="null"></xrd:Path>
|
14
|
+
<xrd:URI priority="1" append="authority">http://example.com/contact/</xrd:URI>
|
15
|
+
</xrd:Service>
|
16
|
+
<xrd:Service priority="1">
|
17
|
+
<xrd:ProviderID>xri://!!1000!100</xrd:ProviderID>
|
18
|
+
<xrd:Type select="true" match="content">xri://+i-service*(+forwarding)*($v*1.0)</xrd:Type> <xrd:Type select="false" match="null"></xrd:Type>
|
19
|
+
|
20
|
+
<xrd:Path match="content">(+index)</xrd:Path> <xrd:Path match="default"></xrd:Path>
|
21
|
+
<xrd:URI priority="1" append="qxri">http://example.com/forwarding/</xrd:URI>
|
22
|
+
</xrd:Service>
|
23
|
+
|
24
|
+
|
25
|
+
</XRD>
|
26
|
+
</XRDS>
|