diff options
author | Florian Pritz <bluewind@xinu.at> | 2011-10-08 19:42:09 +0200 |
---|---|---|
committer | Florian Pritz <bluewind@xinu.at> | 2011-10-08 20:36:40 +0200 |
commit | 4a4e6eb0712bc2f7f188325d2ac87b8aa4927cd8 (patch) | |
tree | 1a04b0e0e92379e27feca1fcdbc31d4b59974da3 /apps/bookmarks | |
parent | bbd96fdd39902ae0c2c52342627f705c592d720b (diff) | |
download | nextcloud-server-4a4e6eb0712bc2f7f188325d2ac87b8aa4927cd8.tar.gz nextcloud-server-4a4e6eb0712bc2f7f188325d2ac87b8aa4927cd8.zip |
apps/bookmarks: follow redirects when fetching title
This solves a problem where hitting a redirect page would lead to a "302
Found" title.
Signed-off-by: Florian Pritz <bluewind@xinu.at>
Diffstat (limited to 'apps/bookmarks')
-rw-r--r-- | apps/bookmarks/bookmarksHelper.php | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/apps/bookmarks/bookmarksHelper.php b/apps/bookmarks/bookmarksHelper.php index f66d98a8ccb..b445154f526 100644 --- a/apps/bookmarks/bookmarksHelper.php +++ b/apps/bookmarks/bookmarksHelper.php @@ -1,5 +1,52 @@ <?php +// Source: http://www.php.net/manual/de/function.curl-setopt.php#102121 +// This works around a safe_mode/open_basedir restriction +function curl_exec_follow(/*resource*/ $ch, /*int*/ &$maxredirect = null) { + $mr = $maxredirect === null ? 5 : intval($maxredirect); + if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) { + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0); + curl_setopt($ch, CURLOPT_MAXREDIRS, $mr); + } else { + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); + if ($mr > 0) { + $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); + + $rch = curl_copy_handle($ch); + curl_setopt($rch, CURLOPT_HEADER, true); + curl_setopt($rch, CURLOPT_NOBODY, true); + curl_setopt($rch, CURLOPT_FORBID_REUSE, false); + curl_setopt($rch, CURLOPT_RETURNTRANSFER, true); + do { + curl_setopt($rch, CURLOPT_URL, $newurl); + $header = curl_exec($rch); + if (curl_errno($rch)) { + $code = 0; + } else { + $code = curl_getinfo($rch, CURLINFO_HTTP_CODE); + if ($code == 301 || $code == 302) { + preg_match('/Location:(.*?)\n/', $header, $matches); + $newurl = trim(array_pop($matches)); + } else { + $code = 0; + } + } + } while ($code && --$mr); + curl_close($rch); + if (!$mr) { + if ($maxredirect === null) { + trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING); + } else { + $maxredirect = 0; + } + return false; + } + curl_setopt($ch, CURLOPT_URL, $newurl); + } + } + return curl_exec($ch); +} + function getURLMetadata($url) { //allow only http(s) and (s)ftp $protocols = '/^[hs]{0,1}[tf]{0,1}tp[s]{0,1}\:\/\//i'; @@ -12,7 +59,7 @@ function getURLMetadata($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $page = curl_exec($ch); + $page = curl_exec_follow($ch); curl_close($ch); @preg_match( "/<title>(.*)<\/title>/si", $page, $match ); |