| 
									
										
										
										
											2008-08-22 09:17:14 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Code for using a proxy XRI resolver. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require_once 'Auth/Yadis/XRDS.php'; | 
					
						
							|  |  |  | require_once 'Auth/Yadis/XRI.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Auth_Yadis_ProxyResolver { | 
					
						
							| 
									
										
										
										
											2010-06-29 10:24:48 -04:00
										 |  |  |     function Auth_Yadis_ProxyResolver($fetcher, $proxy_url = null) | 
					
						
							| 
									
										
										
										
											2008-08-22 09:17:14 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-06-29 10:24:48 -04:00
										 |  |  |         $this->fetcher = $fetcher; | 
					
						
							| 
									
										
										
										
											2008-08-22 09:17:14 -04:00
										 |  |  |         $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); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-29 10:24:48 -04:00
										 |  |  | 
 |