Module: OpenID::Yadis::XRI
- Defined in:
- lib/openid/yadis/xri.rb,
lib/openid/yadis/xrires.rb
Defined Under Namespace
Classes: ProxyResolver, XRIHTTPError
Constant Summary collapse
- XRI_AUTHORITIES =
The ‘(’ is for cross-reference authorities, and hopefully has a matching ‘)’ somewhere.
["!", "=", "@", "+", "$", "("]
Class Method Summary collapse
- .append_args(url, args) ⇒ Object
-
.escape_for_iri(xri) ⇒ Object
Note this is not not idempotent, so do not apply this more than once.
- .identifier_scheme(identifier) ⇒ Object
-
.iri_to_uri(iri) ⇒ Object
RFC 3987 section 3.1.
- .make_xri(xri) ⇒ Object
- .provider_is_authoritative(provider_id, canonical_id) ⇒ Object
- .root_authority(xri) ⇒ Object
-
.to_iri_normal(xri) ⇒ Object
Transform an XRI reference to an IRI reference.
-
.to_uri_normal(xri) ⇒ Object
Transform an XRI reference to a URI reference.
- .urlencode(args) ⇒ Object
Class Method Details
.append_args(url, args) ⇒ Object
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/openid/yadis/xrires.rb', line 84 def self.append_args(url, args) return url if args.length == 0 # rstrip question marks rstripped = url.dup while rstripped[-1].chr == '?' rstripped = rstripped[0...rstripped.length-1] end if rstripped.index('?') sep = '&' else sep = '?' end return url + sep + XRI.urlencode(args) end |
.escape_for_iri(xri) ⇒ Object
Note this is not not idempotent, so do not apply this more than once. XRI Syntax section 2.3.2
34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/openid/yadis/xri.rb', line 34 def self.escape_for_iri(xri) esc = xri.dup # encode all % esc.gsub!(/%/, '%25') esc.gsub!(/\((.*?)\)/) { |xref_match| xref_match.gsub(/[\/\?\#]/) { |char_match| CGI::escape(char_match) } } return esc end |
.identifier_scheme(identifier) ⇒ Object
12 13 14 15 16 17 18 19 20 21 |
# File 'lib/openid/yadis/xri.rb', line 12 def self.identifier_scheme(identifier) if (!identifier.nil? and identifier.length > 0 and (identifier.match('^xri://') or XRI_AUTHORITIES.member?(identifier[0].chr))) return :xri else return :uri end end |
.iri_to_uri(iri) ⇒ Object
RFC 3987 section 3.1
54 55 56 57 58 59 |
# File 'lib/openid/yadis/xri.rb', line 54 def self.iri_to_uri(iri) uri = iri.dup # for char in ucschar or iprivate # convert each char to %HH%HH%HH (as many %HH as octets) return uri end |
.make_xri(xri) ⇒ Object
82 83 84 85 86 87 |
# File 'lib/openid/yadis/xri.rb', line 82 def self.make_xri(xri) if xri.index('xri://') != 0 xri = 'xri://' + xri end return xri end |
.provider_is_authoritative(provider_id, canonical_id) ⇒ Object
61 62 63 64 65 66 |
# File 'lib/openid/yadis/xri.rb', line 61 def self.(provider_id, canonical_id) lastbang = canonical_id.rindex('!') return false unless lastbang parent = canonical_id[0...lastbang] return parent == provider_id end |
.root_authority(xri) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/openid/yadis/xri.rb', line 68 def self.(xri) xri = xri[6..-1] if xri.index('xri://') == 0 = xri.split('/', 2)[0] if [0].chr == '(' root = [0....index(')')+1] elsif XRI_AUTHORITIES.member?([0].chr) root = [0].chr else root = .split(/[!*]/)[0] end self.make_xri(root) end |
.to_iri_normal(xri) ⇒ Object
Transform an XRI reference to an IRI reference. Note this is not not idempotent, so do not apply this to an identifier more than once. XRI Syntax section 2.3.1
26 27 28 29 30 |
# File 'lib/openid/yadis/xri.rb', line 26 def self.to_iri_normal(xri) iri = xri.dup iri.insert(0, 'xri://') if not iri.match('^xri://') return escape_for_iri(iri) end |
.to_uri_normal(xri) ⇒ Object
Transform an XRI reference to a URI reference. Note this is not not idempotent, so do not apply this to an identifier more than once. XRI Syntax section 2.3.1
49 50 51 |
# File 'lib/openid/yadis/xri.rb', line 49 def self.to_uri_normal(xri) return iri_to_uri(to_iri_normal(xri)) end |
.urlencode(args) ⇒ Object
76 77 78 79 80 81 82 |
# File 'lib/openid/yadis/xrires.rb', line 76 def self.urlencode(args) a = [] args.each do |key, val| a << (CGI::escape(key) + "=" + CGI::escape(val)) end a.join("&") end |