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);
 | |
|     }
 | |
| }
 | |
| 
 | |
| ?>
 |