Merge branch 'patch-1' into 'dev'

Return image modification date on remote fetch for caching

See merge request hubzilla/core!1383
This commit is contained in:
Mario 2018-11-09 16:51:36 +01:00
commit 4bf3fdd898

View File

@ -485,11 +485,11 @@ function guess_image_type($filename, $headers = '') {
$h = explode("\n",$headers); $h = explode("\n",$headers);
foreach ($h as $l) { foreach ($h as $l) {
list($k,$v) = array_map("trim", explode(":", trim($l), 2)); list($k,$v) = array_map("trim", explode(":", trim($l), 2));
$hdrs[$k] = $v; $hdrs[strtolower($k)] = $v;
} }
logger('Curl headers: '.var_export($hdrs, true), LOGGER_DEBUG); logger('Curl headers: '.var_export($hdrs, true), LOGGER_DEBUG);
if (array_key_exists('Content-Type', $hdrs)) if (array_key_exists('content-type', $hdrs))
$type = $hdrs['Content-Type']; $type = $hdrs['content-type'];
} }
if (is_null($type)){ if (is_null($type)){
@ -570,22 +570,48 @@ function delete_thing_photo($url,$ob_hash) {
function import_xchan_photo($photo,$xchan,$thing = false) { /**
* @brief fetches an photo from external site and prepares its miniatures.
*
* @param string $photo
* external URL to fetch base image
* @param string $xchan
* channel unique hash
* @param boolean $thing
* TRUE if this is a thing URL
* @param boolean $force
* TRUE if ignore image modification date check (force fetch)
*
* @return array of results
* * \e string \b 0 => local URL to full image
* * \e string \b 1 => local URL to standard thumbnail
* * \e string \b 2 => local URL to micro thumbnail
* * \e string \b 3 => image type
* * \e boolean \b 4 => TRUE if fetch failure
* * \e string \b 5 => modification date
*/
function import_xchan_photo($photo,$xchan,$thing = false,$force = false) {
$modified = '';
$flags = (($thing) ? PHOTO_THING : PHOTO_XCHAN); $flags = (($thing) ? PHOTO_THING : PHOTO_XCHAN);
$album = (($thing) ? 'Things' : 'Contact Photos'); $album = (($thing) ? 'Things' : 'Contact Photos');
logger('import_xchan_photo: updating channel photo from ' . $photo . ' for ' . $xchan, LOGGER_DEBUG); logger('import_xchan_photo: updating channel photo from ' . $photo . ' for ' . $xchan, LOGGER_DEBUG);
if($thing) if($thing) {
$hash = photo_new_resource(); $hash = photo_new_resource();
}
else { else {
$r = q("select resource_id from photo where xchan = '%s' and photo_usage = %d and imgscale = 4 limit 1", $r = q("select resource_id, edited, mimetype from photo where xchan = '%s' and photo_usage = %d and imgscale = 4 limit 1",
dbesc($xchan), dbesc($xchan),
intval(PHOTO_XCHAN) intval(PHOTO_XCHAN)
); );
if($r) { if($r) {
$hash = $r[0]['resource_id']; $hash = $r[0]['resource_id'];
$modified = $r[0]['edited'];
$type = $r[0]['mimetype'];
} }
else { else {
$hash = photo_new_resource(); $hash = photo_new_resource();
@ -598,29 +624,37 @@ function import_xchan_photo($photo,$xchan,$thing = false) {
if($photo) { if($photo) {
$filename = basename($photo); $filename = basename($photo);
if($force || $modified == '') {
$result = z_fetch_url($photo,true); $result = z_fetch_url($photo,true);
}
else {
$h = array('headers' => array("If-Modified-Since: " . gmdate("D, d M Y H:i:s", strtotime($modified . "Z")) . " GMT"));
$result = z_fetch_url($photo,true,0,$h);
}
if($result['success']) { if($result['success']) {
$img_str = $result['body']; $img_str = $result['body'];
$type = guess_image_type($photo, $result['header']); $type = guess_image_type($photo, $result['header']);
$modified = gmdate('Y-m-d H:i:s', (preg_match('/last-modified: (.+) \S+/i', $result['header'], $o) ? strtotime($o[1] . 'Z') : time()));
$h = explode("\n",$result['header']); if(is_null($type))
if($h) {
foreach($h as $hl) {
if(stristr($hl,'content-type:')) {
if(! stristr($hl,'image/')) {
$photo_failure = true; $photo_failure = true;
} }
} elseif($result['return_code'] = 304) {
} $photo = z_root() . '/photo/' . $hash . '-4';
} $thumb = z_root() . '/photo/' . $hash . '-5';
} $micro = z_root() . '/photo/' . $hash . '-6';
} }
else { else {
$photo_failure = true; $photo_failure = true;
} }
if(! $photo_failure) { }
else {
$photo_failure = true;
}
if(! $photo_failure && $result['return_code'] != 304) {
$img = photo_factory($img_str, $type); $img = photo_factory($img_str, $type);
if($img->is_valid()) { if($img->is_valid()) {
$width = $img->getWidth(); $width = $img->getWidth();
@ -679,13 +713,15 @@ function import_xchan_photo($photo,$xchan,$thing = false) {
} }
} }
if($photo_failure) { if($photo_failure) {
$photo = z_root() . '/' . get_default_profile_photo(); $default = get_default_profile_photo();
$photo = z_root() . '/' . $default;
$thumb = z_root() . '/' . get_default_profile_photo(80); $thumb = z_root() . '/' . get_default_profile_photo(80);
$micro = z_root() . '/' . get_default_profile_photo(48); $micro = z_root() . '/' . get_default_profile_photo(48);
$type = 'image/png'; $type = 'image/png';
$modified = gmdate('Y-m-d H:i:s', filemtime($default));
} }
return(array($photo,$thumb,$micro,$type,$photo_failure)); return(array($photo,$thumb,$micro,$type,$photo_failure,$modified));
} }
@ -700,18 +736,10 @@ function import_channel_photo_from_url($photo,$aid,$uid) {
$img_str = $result['body']; $img_str = $result['body'];
$type = guess_image_type($photo, $result['header']); $type = guess_image_type($photo, $result['header']);
$h = explode("\n",$result['header']); if(is_null($type))
if($h) {
foreach($h as $hl) {
if(stristr($hl,'content-type:')) {
if(! stristr($hl,'image/')) {
$photo_failure = true; $photo_failure = true;
} }
} }
}
}
}
}
else { else {
$photo_failure = true; $photo_failure = true;
} }