// curl wrapper. If binary flag is true, return binary
// results.
+// Set the cookiejar argument to a string (e.g. "/tmp/friendica-cookies.txt")
+// to preserve cookies from one request to the next.
if(! function_exists('fetch_url')) {
-function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_content=Null) {
+function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_content=Null, $cookiejar = 0) {
$stamp1 = microtime(true);
@curl_setopt($ch, CURLOPT_HEADER, true);
- @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
- @curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
+ if($cookiejar) {
+ curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
+ curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
+ }
+
+// These settings aren't needed. We're following the location already.
+// @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
+// @curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
if (!is_null($accept_content)){
curl_setopt($ch,CURLOPT_HTTPHEADER, array (
if (($new_location_info["path"] == "") AND ($new_location_info["host"] != ""))
$newurl = $new_location_info["scheme"]."://".$new_location_info["host"].$old_location_info["path"];
- //$matches = array();
- //preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
- //$newurl = trim(array_pop($matches));
+ $matches = array();
+ if (preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches)) {
+ $newurl = trim(array_pop($matches));
+ }
if(strpos($newurl,'/') === 0)
- $newurl = $url . $newurl;
- $url_parsed = @parse_url($newurl);
- if (isset($url_parsed)) {
+ $newurl = $old_location_info["scheme"]."://".$old_location_info["host"].$newurl;
+ if (filter_var($newurl, FILTER_VALIDATE_URL)) {
$redirects++;
- return fetch_url($newurl,$binary,$redirects,$timeout);
+ return fetch_url($newurl,$binary,$redirects,$timeout,$accept_content,$cookiejar);
}
}
$a->set_curl_code($http_code);
+ $a->set_curl_content_type($curl_info['content_type']);
$body = substr($s,strlen($header));
$a->set_curl_headers($header);
preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
$newurl = trim(array_pop($matches));
if(strpos($newurl,'/') === 0)
- $newurl = $url . $newurl;
- $url_parsed = @parse_url($newurl);
- if (isset($url_parsed)) {
+ $newurl = $old_location_info["scheme"] . "://" . $old_location_info["host"] . $newurl;
+ if (filter_var($newurl, FILTER_VALIDATE_URL)) {
$redirects++;
return fetch_url($newurl,false,$redirects,$timeout);
}
}
if(count($links)) {
foreach($links as $link)
- if($link['@attributes']['rel'] && $link['@attributes']['rel'] === 'lrdd')
+ if($link['@attributes']['rel'] && $link['@attributes']['rel'] === 'lrdd' && (!$link['@attributes']['type'] || $link['@attributes']['type'] === 'application/xrd+xml'))
$tpl = $link['@attributes']['template'];
}
if(! strpos($tpl,'{uri}'))
$xrd_timeout = intval(get_config('system','xrd_timeout'));
$redirects = 0;
- $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 20));
+ $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 20), "application/xrd+xml");
logger('fetch_xrd_links: ' . $xml, LOGGER_DATA);
if(! function_exists('validate_url')) {
function validate_url(&$url) {
-
// no naked subdomains (allow localhost for tests)
if(strpos($url,'.') === false && strpos($url,'/localhost/') === false)
return false;
`alias` = '%s',
`pubkey` = '%s',
`updated` = '%s'
- WHERE `url` = '%s' AND `network` = '%s' LIMIT 1",
+ WHERE `url` = '%s' AND `network` = '%s'",
dbesc($arr['name']),
dbesc($arr['photo']),
dbesc($arr['request']),
}
-function scale_external_images($s, $include_link = true, $scale_replace = false) {
+function scale_external_images($srctext, $include_link = true, $scale_replace = false) {
$a = get_app();
// Picture addresses can contain special characters
- $s = htmlspecialchars_decode($s);
+ $s = htmlspecialchars_decode($srctext);
$matches = null;
$c = preg_match_all('/\[img.*?\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
$scaled = str_replace($scale_replace[0], $scale_replace[1], $mtch[1]);
else
$scaled = $mtch[1];
- $i = fetch_url($scaled);
+ $i = @fetch_url($scaled);
+ if(! $i)
+ return $srctext;
$cachefile = get_cachefile(hash("md5", $scaled));
if ($cachefile != '') {