73 lines
2.1 KiB
PHP
73 lines
2.1 KiB
PHP
<?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);
|
|
}
|
|
}
|
|
|
|
?>
|