From: <lph...@us...> - 2011-06-08 20:41:29
|
Revision: 34839 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=34839&view=rev Author: lphuberdeau Date: 2011-06-08 20:41:22 +0000 (Wed, 08 Jun 2011) Log Message: ----------- [ENH] Use cache control headers to reduce bandwidth consumption Modified Paths: -------------- trunk/lib/core/Services/File/Controller.php trunk/lib/filegals/filegallib.php Modified: trunk/lib/core/Services/File/Controller.php =================================================================== --- trunk/lib/core/Services/File/Controller.php 2011-06-08 20:12:51 UTC (rev 34838) +++ trunk/lib/core/Services/File/Controller.php 2011-06-08 20:41:22 UTC (rev 34839) @@ -51,7 +51,7 @@ } $fileId = $this->uploadFile($gal_info, $info['name'], $info['size'], $info['type'], $info['data']); - $filegallib->attach_file_source($fileId, $url); + $filegallib->attach_file_source($fileId, $url, $info); return array( 'size' => $info['size'], Modified: trunk/lib/filegals/filegallib.php =================================================================== --- trunk/lib/filegals/filegallib.php 2011-06-08 20:12:51 UTC (rev 34838) +++ trunk/lib/filegals/filegallib.php 2011-06-08 20:41:22 UTC (rev 34839) @@ -3232,7 +3232,7 @@ } } - function get_info_from_url($url) + function get_info_from_url($url, $lastCheck = false, $eTag = false) { if (! $url) { return false; @@ -3245,12 +3245,22 @@ $client = TikiLib::lib('tiki')->get_http_client(); $client->setUri($url); + if ($lastCheck) { + $client->setHeaders('If-Modified-Since', gmdate('D, d M Y H:i:s T', $lastCheck)); + } + + if ($eTag) { + $client->setHeaders('If-None-Match', $eTag); + } + $response = $client->request(); - if ($response->isError()) { + if (! $response->isSuccessful()) { return false; } + $expiryDate = time(); + $result = $response->getBody(); if ($disposition = $response->getHeader('Content-Disposition')) { if (preg_match('/filename=[\'"]?([^;\'"]+)[\'"]?/i', $disposition, $parts)) { @@ -3258,6 +3268,19 @@ } } + // Check expires + if ($expires = $response->getHeader('Expires')) { + $potential = strtotime($expires); + $expiryDate = max($expiryDate, $potential); + } + + // Check cache-control for max-age, which has priority + if ($cacheControl = $response->getHeader('Cache-Control')) { + if (preg_match('/max-age=(\d+)/', $cacheControl, $parts)) { + $expiryDate = time() + $parts[1]; + } + } + if (class_exists('finfo')) { $finfo = new finfo(FILEINFO_MIME); $type = $finfo->buffer($result); @@ -3271,17 +3294,20 @@ 'size' => $size, 'type' => $type, 'name' => $name, + 'expires' => $expiryDate, + 'etag' => $response->getHeader('Etag'), ); } catch (Zend_Http_Exception $e) { return false; } } - function attach_file_source($fileId, $url) + function attach_file_source($fileId, $url, $info) { $attributelib = TikiLib::lib('attribute'); $attributelib->set_attribute('file', $fileId, 'tiki.content.source', $url); $attributelib->set_attribute('file', $fileId, 'tiki.content.lastcheck', time()); + $attributelib->set_attribute('file', $fileId, 'tiki.content.expires', $info['expires']); } function refresh_file($fileId) @@ -3292,12 +3318,21 @@ $attributes = $attributelib->get_attributes('file', $fileId); // Must have a source to begin with - if (! isset($attributes['tiki.content.source'], $attributes['tiki.content.lastcheck'])) { + if (! isset($attributes['tiki.content.source'])) { return false; } + $lastCheck = false; // Make sure not to flood the remote server with update requests - if ($attributes['tiki.content.lastcheck'] + $prefs['fgal_source_refresh_frequency'] > time()) { + if (isset($attributes['tiki.content.lastcheck'])) { + $lastCheck = $attributes['tiki.content.lastcheck']; + if ($lastCheck + $prefs['fgal_source_refresh_frequency'] > time()) { + return false; + } + } + + // Respect cache headers too + if (isset($attributes['tiki.content.expires']) && $attributes['tiki.content.expires'] > time()) { return false; } @@ -3312,10 +3347,20 @@ return false; } + $eTag = false; + if (isset($attributes['tiki.content.etag'])) { + $eTag = $attributes['tiki.content.etag']; + } + // Record as a check before checking in the case the server is overloaded and times out $attributelib->set_attribute('file', $fileId, 'tiki.content.lastcheck', time()); - $remote = $this->get_info_from_url($attributes['tiki.content.source']); + $remote = $this->get_info_from_url($attributes['tiki.content.source'], $lastCheck, $eTag); + $attributelib->set_attribute('file', $fileId, 'tiki.content.expires', $remote['expires']); + if ($remote['etag']) { + $attributelib->set_attribute('file', $fileId, 'tiki.content.etag', $remote['etag']); + } + if (! $remote) { return false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |