]> git.wh0rd.org - tt-rss.git/commitdiff
remove apache-specific x-sendfile stuff
authorAndrew Dolgov <noreply@fakecake.org>
Sun, 8 Oct 2017 14:10:05 +0000 (17:10 +0300)
committerAndrew Dolgov <noreply@fakecake.org>
Sun, 8 Oct 2017 14:14:56 +0000 (17:14 +0300)
implement a hook (HOOK_SEND_LOCAL_FILE) which plugins may use to send files
via httpd-specific implementation to increase performance typically on larger files

classes/handler/public.php
classes/pluginhost.php
include/functions.php
plugins/af_zz_imgproxy/init.php
plugins/cache_starred_images/init.php

index 7282adfd210172fa8b2598a64829a49a2d20fd37..317bc64db816d3a44f442dfab32bb749fc5c2cc4 100644 (file)
@@ -969,24 +969,9 @@ class Handler_Public extends Handler {
 
                        if (file_exists($filename)) {
                                header("Content-Disposition: inline; filename=\"$hash\"");
-                               $mimetype = mime_content_type($filename);
-
-                               /* See if we can use X-Sendfile */
-                               $xsendfile = false;
-                               if (function_exists('apache_get_modules') &&
-                                   array_search('mod_xsendfile', apache_get_modules()))
-                                       $xsendfile = true;
-
-                               if ($xsendfile) {
-                                       header("X-Sendfile: $filename");
-                                       header("Content-type: $mimetype");
-                                       header('Content-Disposition: inline; filename="' . basename($filename) . '"');
-                               } else {
-                                       header("Content-type: $mimetype");
-                                       $stamp = gmdate("D, d M Y H:i:s", filemtime($filename)). " GMT";
-                                       header("Last-Modified: $stamp", true);
-                                       readfile($filename);
-                               }
+
+                               send_local_file($filename);
+
                        } else {
                                header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
                                echo "File not found.";
index 571c30fb6c30a80a938956f87a5f85644be96d25..533e7ee911f59872b518dcb62d039d0acf911a3e 100644 (file)
@@ -55,6 +55,7 @@ class PluginHost {
        const HOOK_FORMAT_ARTICLE = 34;
        const HOOK_FORMAT_ARTICLE_CDM = 35;
        const HOOK_FEED_BASIC_INFO = 36;
+       const HOOK_SEND_LOCAL_FILE = 37;
 
        const KIND_ALL = 1;
        const KIND_SYSTEM = 2;
index 2034547474d7adb6fd1a2c1d4ff16f0b33f324ef..392042b901f2b109ded436659e0283f2acef9c01 100644 (file)
                }
        }
 
+       /*      this is essentially a wrapper for readfile() which allows plugins to hook
+               output with httpd-specific "fast" implementation i.e. X-Sendfile or whatever else
+
+               hook function should return true if request was handled (or at least attempted to)
+
+               note that this can be called without user context so the plugin to handle this
+               should be loaded systemwide in config.php */
+       function send_local_file($filename) {
+               if (file_exists($filename)) {
+                       $tmppluginhost = new PluginHost();
+
+                       $tmppluginhost->load(PLUGINS, PluginHost::KIND_SYSTEM);
+                       $tmppluginhost->load_data();
+
+                       foreach ($tmppluginhost->get_hooks(PluginHost::HOOK_SEND_LOCAL_FILE) as $plugin) {
+                               if ($plugin->hook_send_local_file($filename)) return true;
+                       }
+
+                       $mimetype = mime_content_type($filename);
+                       header("Content-type: $mimetype");
+
+                       $stamp = gmdate("D, d M Y H:i:s", filemtime($filename)) . " GMT";
+                       header("Last-Modified: $stamp", true);
+
+                       return readfile($filename);
+               } else {
+                       return false;
+               }
+       }
+
index 41fec4ac54a474d0a55d673112c438a55e929bb8..4cfca4180516612192316e42ff2f7fbf579a869d 100644 (file)
@@ -55,13 +55,9 @@ class Af_Zz_ImgProxy extends Plugin {
                header("Content-Disposition: inline; filename=\"".basename($local_filename)."\"");
 
                if (file_exists($local_filename)) {
-                       $mimetype = mime_content_type($local_filename);
-                       header("Content-type: $mimetype");
 
-                       $stamp = gmdate("D, d M Y H:i:s", filemtime($local_filename)). " GMT";
-                       header("Last-Modified: $stamp", true);
+                       send_local_file($local_filename);
 
-                       readfile($local_filename);
                } else {
                        $data = fetch_file_contents(array("url" => $url));
 
index 527e088d584f2f75e5901d8de7bf6c68bbd6ed85..82e7d1fbd6b46a0a675d51cf06a9122794da4172 100644 (file)
@@ -66,27 +66,11 @@ class Cache_Starred_Images extends Plugin implements IHandler {
                if ($hash) {
 
                        $filename = $this->cache_dir . "/" . basename($hash);
-                       $is_video = strpos($filename, ".mp4") !== FALSE;
 
                        if (file_exists($filename)) {
                                header("Content-Disposition: attachment; filename=\"$hash\"");
 
-                               /* See if we can use X-Sendfile */
-                               $xsendfile = false;
-                               if (function_exists('apache_get_modules') &&
-                                   array_search('mod_xsendfile', apache_get_modules()))
-                                       $xsendfile = true;
-
-                               if ($xsendfile) {
-                                       header("X-Sendfile: $filename");
-                                       header("Content-type: application/octet-stream");
-                                       header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
-                               } else {
-                                       header("Content-type: " . ($is_video ? "video/mp4" : "image/png"));
-                                       $stamp = gmdate("D, d M Y H:i:s", filemtime($filename)). " GMT";
-                                       header("Last-Modified: $stamp", true);
-                                       readfile($filename);
-                               }
+                               send_local_file($filename);
                        } else {
                                header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
                                echo "File not found.";