final move of files
[web.mtrack] / Auth / Yadis / XRIRes.php
1 <?php
2
3 /**
4  * Code for using a proxy XRI resolver.
5  */
6
7 require_once 'Auth/Yadis/XRDS.php';
8 require_once 'Auth/Yadis/XRI.php';
9
10 class 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 ?>