. * * @category Discovery * @package StatusNet * * @author James Walker * @copyright 2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * * @see http://status.net/ */ namespace Component\FreeNetwork\Util; /** * Class to represent Link: headers in an HTTP response * * Since these are a fairly important part of Hammer-stack discovery, they're * reified and implemented here. * * @category Discovery * @package StatusNet * * @author James Walker * @copyright 2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * * @see http://status.net/ * @see Discovery */ class LinkHeader { public $href; public $rel; public $type; /** * Initialize from a string * * @param string $str Link: header value */ public function __construct(string $str = '') { preg_match('/^<[^>]+>/', $str, $uri_reference); //if (empty($uri_reference)) return; $this->href = trim($uri_reference[0], '<>'); $this->rel = []; $this->type = null; // remove uri-reference from header $str = mb_substr($str, \mb_strlen($uri_reference[0])); // parse link-params $params = explode(';', $str); foreach ($params as $param) { if (empty($param)) { continue; } [$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); } } } /** * Given an HTTP response, return the requested Link: header * * @param HTTP_Request2_Response $response response to check * @param string $rel relationship to look for * @param string $type media type to look for * * @return LinkHeader discovered header, or null on failure */ public 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 = [$headers]; } foreach ($headers as $header) { $lh = new self($header); if ((\is_null($rel) || $lh->rel == $rel) && (\is_null($type) || $lh->type == $type)) { return $lh->href; } } } } }