From 9a87c72a533121b83c56075947a3e27c853b2188 Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Mon, 8 Oct 2007 20:50:19 +0200
Subject: [PATCH] X-Sendfile support for fetch.php

This patch enables the use of the X-Sendfile extension offered by certain
webservers to deliver static files after running a dynamic script. This
combines the flexibility of a PHP file to check for authorization, caching
and resizing with the low memory footprint and high performance of static
file delivery of the webserver.

See http://blog.lighttpd.net/articles/2006/07/02/x-sendfile for details

darcs-hash:20071008185019-7ad00-1e6d4768fb60d58955e4253c7786eaf8cf13d0bb.gz
---
 conf/dokuwiki.php                               |  1 +
 lib/exe/fetch.php                               | 16 ++++++++++++++--
 lib/plugins/config/lang/en/lang.php             |  5 +++++
 lib/plugins/config/settings/config.metadata.php |  1 +
 4 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php
index c041d0bee..bd92f4730 100644
--- a/conf/dokuwiki.php
+++ b/conf/dokuwiki.php
@@ -118,6 +118,7 @@ $conf['rss_update'] = 5*60;              //Update the RSS feed every n minutes (
 $conf['recent_days'] = 7;                //How many days of recent changes to keep. (days)
 $conf['rss_show_summary'] = 1;           //Add revision summary to title? 0|1
 $conf['broken_iua']  = 0;                //Platform with broken ignore_user_abort (IIS+CGI) 0|1
+$conf['xsendfile']   = 0;                //Use X-Sendfile (1 = lighttpd, 2 = standard)
 
 //Set target to use when creating links - leave empty for same window
 $conf['target']['wiki']      = '';
diff --git a/lib/exe/fetch.php b/lib/exe/fetch.php
index 71ec2870b..d29ed9f64 100644
--- a/lib/exe/fetch.php
+++ b/lib/exe/fetch.php
@@ -104,16 +104,28 @@ function sendFile($file,$mime,$cache){
     header('Cache-Control: must-revalidate, no-transform, post-check=0, pre-check=0');
     header('Pragma: public');
   }
-  header('Accept-Ranges: bytes');
   //send important headers first, script stops here if '304 Not Modified' response
   http_conditionalRequest($fmtime);
-  list($start,$len) = http_rangeRequest(filesize($file));
+
 
   //application mime type is downloadable
   if(substr($mime,0,11) == 'application'){
     header('Content-Disposition: attachment; filename="'.basename($file).'";');
   }
 
+  //use x-sendfile header to pass the delivery to compatible webservers
+  if($conf['xsendfile'] == 1){
+    header("X-LIGHTTPD-send-file: $file");
+    exit;
+  }elseif($conf['xsendfile'] == 2){
+    header("X-Sendfile: $file");
+    exit;
+  }
+
+  //support download continueing
+  header('Accept-Ranges: bytes');
+  list($start,$len) = http_rangeRequest(filesize($file));
+
   // send file contents
   $fp = @fopen($file,"rb");
   if($fp){
diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php
index e0b9a95af..639c138f3 100644
--- a/lib/plugins/config/lang/en/lang.php
+++ b/lib/plugins/config/lang/en/lang.php
@@ -125,6 +125,7 @@ $lang['hidepages']   = 'Hide matching pages (regular expressions)';
 $lang['send404']     = 'Send "HTTP 404/Page Not Found" for non existing pages';
 $lang['sitemap']     = 'Generate Google sitemap (days)';
 $lang['broken_iua']  = 'Is the ignore_user_abort function broken on your system? This could cause a non working search index. IIS+PHP/CGI is known to be broken. See <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> for more info.';
+$lang['xsendfile']   = 'Use the X-Sendfile header to let the webserver deliver static files? Your webserver needs to support this.';
 
 $lang['rss_type']    = 'XML feed type';
 $lang['rss_linkto']  = 'XML feed links to';
@@ -199,3 +200,7 @@ $lang['compression_o_0']   = 'none';
 $lang['compression_o_gz']  = 'gzip';
 $lang['compression_o_bz2'] = 'bz2';
 
+/* xsendfile header */
+$lang['xsendfile_o_0'] = "don't use";
+$lang['xsendfile_o_1'] = 'Propritary lighttpd header (before release 1.5)';
+$lang['xsendfile_o_2'] = 'Standard X-Sendfile header';
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index 3609b0cf5..1f886737d 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -172,6 +172,7 @@ $meta['rss_update']  = array('numeric');
 $meta['recent_days'] = array('numeric');
 $meta['rss_show_summary'] = array('onoff');
 $meta['broken_iua']  = array('onoff');
+$meta['xsendfile']   = array('multichoice','_choices' => array(0,1,2));
 
 $meta['_network']    = array('fieldset');
 $meta['proxy____host'] = array('string','_pattern' => '#^(|[a-z0-9\-\.+]+)$#i');
-- 
GitLab