summaryrefslogtreecommitdiff
path: root/plugins/OStatus/lib/linkheader.php
blob: cd78d31cef6ce325c4e1959f1dae391c562e0855 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php

class LinkHeader
{
    var $href;
    var $rel;
    var $type;

    function __construct($str)
    {
        preg_match('/^<[^>]+>/', $str, $uri_reference);
        //if (empty($uri_reference)) return;

        $this->href = 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;
    }
}