discover_yadis (OpenID)

    # File lib/openid/consumer/discovery.rb, line 373
      def self.discover_yadis(uri)
        # Discover OpenID services for a URI. Tries Yadis and falls back
        # on old-style <link rel='...'> discovery if Yadis fails.
        #
        # @param uri: normalized identity URL
        # @type uri: str
        #
        # @return: (claimed_id, services)
        # @rtype: (str, list(OpenIDServiceEndpoint))
        #
        # @raises DiscoveryFailure: when discovery fails.

        # Might raise a yadis.discover.DiscoveryFailure if no document
        # came back for that URI at all.  I don't think falling back to
        # OpenID 1.0 discovery on the same URL will help, so don't bother
        # to catch it.
        response = Yadis.discover(uri)

        yadis_url = response.normalized_uri
        body = response.response_text

        begin
          openid_services = OpenIDServiceEndpoint.from_xrds(yadis_url, body)
        rescue Yadis::XRDSError
          # Does not parse as a Yadis XRDS file
          openid_services = []
        end

        if openid_services.empty?
          # Either not an XRDS or there are no OpenID services.

          if response.is_xrds
            # if we got the Yadis content-type or followed the Yadis
            # header, re-fetch the document without following the Yadis
            # header, with no Accept header.
            return self.discover_no_yadis(uri)
          end

          # Try to parse the response as HTML.
          # <link rel="...">
          openid_services = OpenIDServiceEndpoint.from_html(yadis_url, body)
        end

        return [yadis_url, self.get_op_or_user_services(openid_services)]
      end