1<?php 2 3/** 4 * Code for using a proxy XRI resolver. 5 */ 6 7require_once 'Auth/Yadis/XRDS.php'; 8require_once 'Auth/Yadis/XRI.php'; 9 10class Auth_Yadis_ProxyResolver { 11 function Auth_Yadis_ProxyResolver($fetcher, $proxy_url = null) 12 { 13 $this->fetcher = $fetcher; 14 $this->proxy_url = $proxy_url; 15 if (!$this->proxy_url) { 16 $this->proxy_url = Auth_Yadis_getDefaultProxy(); 17 } 18 } 19 20 function queryURL($xri, $service_type = null) 21 { 22 // trim off the xri:// prefix 23 $qxri = substr(Auth_Yadis_toURINormal($xri), 6); 24 $hxri = $this->proxy_url . $qxri; 25 $args = array( 26 '_xrd_r' => 'application/xrds+xml' 27 ); 28 29 if ($service_type) { 30 $args['_xrd_t'] = $service_type; 31 } else { 32 // Don't perform service endpoint selection. 33 $args['_xrd_r'] .= ';sep=false'; 34 } 35 36 $query = Auth_Yadis_XRIAppendArgs($hxri, $args); 37 return $query; 38 } 39 40 function query($xri, $service_types, $filters = array()) 41 { 42 $services = array(); 43 $canonicalID = null; 44 foreach ($service_types as $service_type) { 45 $url = $this->queryURL($xri, $service_type); 46 $response = $this->fetcher->get($url); 47 if ($response->status != 200 and $response->status != 206) { 48 continue; 49 } 50 $xrds = Auth_Yadis_XRDS::parseXRDS($response->body); 51 if (!$xrds) { 52 continue; 53 } 54 $canonicalID = Auth_Yadis_getCanonicalID($xri, 55 $xrds); 56 57 if ($canonicalID === false) { 58 return null; 59 } 60 61 $some_services = $xrds->services($filters); 62 $services = array_merge($services, $some_services); 63 // TODO: 64 // * If we do get hits for multiple service_types, we're 65 // almost certainly going to have duplicated service 66 // entries and broken priority ordering. 67 } 68 return array($canonicalID, $services); 69 } 70} 71 72 73