forked from GNUsocial/gnu-social
1301877dfe
* Subscription::start was sometimes passing users instead of profiles to hooks, which broke OStatus subscription notifications; now normalizing to profiles for processing. * H-card parsing would trigger a lot of PHP warnings and notices in hKit. Now suppressing warnings and notices for the duration of the call to keep them out of output when display_errors is on. * H-card parsing would trigger a PHP fatal error if the source page was not well-formed XML and Tidy was not present on the system. Switched normalization to use the PHP DOM module which is always present, as we have no need for Tidy's extra features here. * Trying to fetch avatars from Google profiles failed and triggered a PHP warning due to the relative URL not being resolved during h-card parsing. Now passing profile page URL into hKit by sneaking a <base> tag in while we normalize the HTML source. * Profile pages without a "Link" header could trigger PHP notices due to a bad NULL -> array(NULL) conversion in LinkHeader::getLink(). Now checking that there was a return value before converting single return value into array.
64 lines
1.7 KiB
PHP
64 lines
1.7 KiB
PHP
<?php
|
|
|
|
class LinkHeader
|
|
{
|
|
var $href;
|
|
var $rel;
|
|
var $type;
|
|
|
|
function __construct($str)
|
|
{
|
|
preg_match('/^<[^>]+>/', $str, $uri_reference);
|
|
//if (empty($uri_reference)) return;
|
|
|
|
$this->uri = trim($uri_reference[0], '<>');
|
|
$this->rel = array();
|
|
$this->type = null;
|
|
|
|
// remove uri-reference from header
|
|
$str = substr($str, strlen($uri_reference[0]));
|
|
|
|
// parse link-params
|
|
$params = explode(';', $str);
|
|
|
|
foreach ($params as $param) {
|
|
if (empty($param)) continue;
|
|
list($param_name, $param_value) = explode('=', $param, 2);
|
|
$param_name = trim($param_name);
|
|
$param_value = preg_replace('(^"|"$)', '', trim($param_value));
|
|
|
|
// for now we only care about 'rel' and 'type' link params
|
|
// TODO do something with the other links-params
|
|
switch ($param_name) {
|
|
case 'rel':
|
|
$this->rel = trim($param_value);
|
|
break;
|
|
|
|
case 'type':
|
|
$this->type = trim($param_value);
|
|
}
|
|
}
|
|
}
|
|
|
|
static function getLink($response, $rel=null, $type=null)
|
|
{
|
|
$headers = $response->getHeader('Link');
|
|
if ($headers) {
|
|
// Can get an array or string, so try to simplify the path
|
|
if (!is_array($headers)) {
|
|
$headers = array($headers);
|
|
}
|
|
|
|
foreach ($headers as $header) {
|
|
$lh = new LinkHeader($header);
|
|
|
|
if ((is_null($rel) || $lh->rel == $rel) &&
|
|
(is_null($type) || $lh->type == $type)) {
|
|
return $lh->href;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|