From 87e26d58226334c735fb43b960678fc1a4837469 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Sat, 22 May 2010 19:20:20 +0200 Subject: introduce FedoraClient / FedoraPkgdb first work --- FedoraClient.php | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 FedoraClient.php (limited to 'FedoraClient.php') diff --git a/FedoraClient.php b/FedoraClient.php new file mode 100644 index 0000000..da62e4f --- /dev/null +++ b/FedoraClient.php @@ -0,0 +1,138 @@ + + * + */ + +define ('FEDORACLIENT_VERSION','0.1'); + +if (!function_exists('curl_version')) { + die("curl extention required\n"); +} + +abstract class FedoraClient { + private $url; + private $agent; + protected $debug = 0; + + function __construct ($url, array $options) { + $this->url = $url; + if (isset($options['agent']) && !empty($options['agent'])) { + $this->agent = $options['agent']; + } else { + $this->agent = 'PHP FedoraClient/'.FEDORACLIENT_VERSION; + } + if (isset($options['debug']) && intval($options['debug'])>0) { + $this->debug = intval($options['debug']); + } + if ($this->debug >= 2) { + echo "[debug] ".__CLASS__."::".__FUNCTION__.": url='$url', agent='".$this->agent."'\n"; + } + } + + function sendRequest($method, array $options=array()) { + $curl = curl_init(); + # And join to make our url. + $url = $this->url.urlencode($method); + curl_setopt($curl, CURLOPT_URL, $url); + # Boilerplate so pycurl processes cookies + curl_setopt($curl, CURLOPT_COOKIEFILE, '/dev/null'); + + # Associate with the response to accumulate data + $this->data=''; + curl_setopt($curl, CURLOPT_WRITEFUNCTION, array($this, 'receive')); + + # Follow redirect + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_MAXREDIRS, 5); + + # Set standard headers + curl_setopt($curl, CURLOPT_HTTPHEADER, array('User-agent: '.$this->agent, 'Accept: application/json')); + + if ($this->debug >= 1) { + echo "[debug] ".__CLASS__."::".__FUNCTION__.": call '$url'\n"; + } + # run the request + curl_exec($curl); + + + # Check for auth failures + # Note: old TG apps returned 403 Forbidden on authentication failures. + # Updated apps return 401 Unauthorized + # We need to accept both until all apps are updated to return 401. + $http_status = curl_getinfo($curl, CURLINFO_HTTP_CODE); + if ($http_status==401 || $http_status==403) { + if ($this->debug >= 1) { + echo "[debug] ".__CLASS__."::".__FUNCTION__.": http_status '$http_status' Authentication failed logging in\n"; + } + return array(); + } else if ($http_status>=400) { + if ($this->debug >= 1) { + echo "[debug] ".__CLASS__."::".__FUNCTION__.": http_status '$http_status' Unknown HTTP Server Response\n"; + } + return array(); + } else if ($this->debug >= 2) { + echo "[debug] ".__CLASS__."::".__FUNCTION__.": http_status '$http_status'\n"; + } + + if ($this->debug >= 1) { + echo "[debug] ".__CLASS__."::".__FUNCTION__.": close connexion\n"; + } + curl_close($curl); + return json_decode($this->data, true); + } + + function receive($curl, $data) { + if ($this->debug >= 9) { + echo "[debug] ".__CLASS__."::".__FUNCTION__.": $data\n"; + } + $this->data .= $data; + return strlen($data); + } +} + + + +class FedoraPkgdb extends FedoraClient { + private $branches = array(); + + function __construct (array $options=array()) { + parent::__construct('https://admin.fedoraproject.org/pkgdb/', $options); + if ($this->debug>=2) { + echo "[debug] ".__CLASS__."::".__FUNCTION__."\n"; + } + } + + function getBranches($refresh=false) { + if (count($this->branches) && !$refresh) { + return $this->branches; + } + $rep =$this->sendRequest('collections'); + + if (isset($rep['collections'])) { + $this->branches = array(); + foreach ($rep['collections'] as $coll) if (isset($coll[0]['branchname'])) { + $this->branches[$coll[0]['branchname']] = $coll[0]; + } + } + return $this->branches; + } +} +?> -- cgit