]> git.wh0rd.org - tt-rss.git/commitdiff
fixing the rel url to abs
authorsyrnon <syrnon@outlook.com>
Tue, 9 Jul 2013 15:05:16 +0000 (18:05 +0300)
committersyrnon <syrnon@outlook.com>
Tue, 9 Jul 2013 15:05:16 +0000 (18:05 +0300)
classes/feeditem/atom.php

index 522ca633e35d76f521e4f0e53c46cb060d09041a..532c599cc858033da4ed3c371d1f87103f525b22 100644 (file)
@@ -30,7 +30,36 @@ class FeedItem_Atom extends FeedItem_Common {
                        return strtotime($date->nodeValue);
                }
        }
-
+       
+       function rel2abs($rel, $base)
+       {
+           /* return if already absolute URL */
+           if (parse_url($rel, PHP_URL_SCHEME) != '') return $rel;
+       
+           /* queries and anchors */
+           if ($rel[0]=='#' || $rel[0]=='?') return $base.$rel;
+       
+           /* parse base URL and convert to local variables:
+              $scheme, $host, $path */
+           extract(parse_url($base));
+       
+           /* remove non-directory element from path */
+           $path = preg_replace('#/[^/]*$#', '', $path);
+       
+           /* destroy path if relative url points to root */
+           if ($rel[0] == '/') $path = '';
+       
+           /* dirty absolute URL */
+           $abs = "$host$path/$rel";
+       
+           /* replace '//' or '/./' or '/foo/../' with '/' */
+           $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
+           for($n=1; $n>0; $abs=preg_replace($re, '/', $abs, -1, $n)) {}
+
+           /* absolute URL is ready! */
+           return $scheme.'://'.$abs;
+       }
+       
        function get_link() {
                $links = $this->elem->getElementsByTagName("link");
 
@@ -40,7 +69,7 @@ class FeedItem_Atom extends FeedItem_Common {
                                        || $link->getAttribute("rel") == "alternate"
                                        || $link->getAttribute("rel") == "standout")) {
                                $base = $this->xpath->evaluate("string(ancestor-or-self::*[@xml:base][1]/@xml:base)",$link);
-                               return $base.$link->getAttribute("href");
+                               return $this->rel2abs($link->getAttribute("href"), $base);
                        }
                }
        }