diff options
Diffstat (limited to 'vendors/php-openid/Auth/Yadis/XRIRes.php')
| -rw-r--r-- | vendors/php-openid/Auth/Yadis/XRIRes.php | 72 | 
1 files changed, 72 insertions, 0 deletions
| diff --git a/vendors/php-openid/Auth/Yadis/XRIRes.php b/vendors/php-openid/Auth/Yadis/XRIRes.php new file mode 100644 index 000000000..5e1158735 --- /dev/null +++ b/vendors/php-openid/Auth/Yadis/XRIRes.php @@ -0,0 +1,72 @@ +<?php + +/** + * Code for using a proxy XRI resolver. + */ + +require_once 'Auth/Yadis/XRDS.php'; +require_once 'Auth/Yadis/XRI.php'; + +class Auth_Yadis_ProxyResolver { +    function Auth_Yadis_ProxyResolver($fetcher, $proxy_url = null) +    { +        $this->fetcher = $fetcher; +        $this->proxy_url = $proxy_url; +        if (!$this->proxy_url) { +            $this->proxy_url = Auth_Yadis_getDefaultProxy(); +        } +    } + +    function queryURL($xri, $service_type = null) +    { +        // trim off the xri:// prefix +        $qxri = substr(Auth_Yadis_toURINormal($xri), 6); +        $hxri = $this->proxy_url . $qxri; +        $args = array( +                      '_xrd_r' => 'application/xrds+xml' +                      ); + +        if ($service_type) { +            $args['_xrd_t'] = $service_type; +        } else { +            // Don't perform service endpoint selection. +            $args['_xrd_r'] .= ';sep=false'; +        } + +        $query = Auth_Yadis_XRIAppendArgs($hxri, $args); +        return $query; +    } + +    function query($xri, $service_types, $filters = array()) +    { +        $services = array(); +        $canonicalID = null; +        foreach ($service_types as $service_type) { +            $url = $this->queryURL($xri, $service_type); +            $response = $this->fetcher->get($url); +            if ($response->status != 200 and $response->status != 206) { +                continue; +            } +            $xrds = Auth_Yadis_XRDS::parseXRDS($response->body); +            if (!$xrds) { +                continue; +            } +            $canonicalID = Auth_Yadis_getCanonicalID($xri, +                                                         $xrds); + +            if ($canonicalID === false) { +                return null; +            } + +            $some_services = $xrds->services($filters); +            $services = array_merge($services, $some_services); +            // TODO: +            //  * If we do get hits for multiple service_types, we're +            //    almost certainly going to have duplicated service +            //    entries and broken priority ordering. +        } +        return array($canonicalID, $services); +    } +} + + | 
