[ Index ]

PHP Cross Reference of DokuWiki

title

Body

[close]

/lib/exe/ -> fetch.php (source)

   1  <?php
   2  /**
   3   * DokuWiki media passthrough file
   4   *
   5   * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
   6   * @author     Andreas Gohr <andi@splitbrain.org>
   7   */
   8  
   9  if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/../../');
  10  if (!defined('DOKU_DISABLE_GZIP_OUTPUT')) define('DOKU_DISABLE_GZIP_OUTPUT', 1);
  11  require_once (DOKU_INC.'inc/init.php');
  12  session_write_close(); //close session
  13  
  14  require_once (DOKU_INC.'inc/fetch.functions.php');
  15  
  16  if (defined('SIMPLE_TEST')) {
  17      $INPUT = new Input();
  18  }
  19  
  20  // BEGIN main
  21      $mimetypes = getMimeTypes();
  22  
  23      //get input
  24      $MEDIA  = stripctl(getID('media', false)); // no cleaning except control chars - maybe external
  25      $CACHE  = calc_cache($INPUT->str('cache'));
  26      $WIDTH  = $INPUT->int('w');
  27      $HEIGHT = $INPUT->int('h');
  28      $REV    = & $INPUT->ref('rev');
  29      //sanitize revision
  30      $REV = preg_replace('/[^0-9]/', '', $REV);
  31  
  32      list($EXT, $MIME, $DL) = mimetype($MEDIA, false);
  33      if($EXT === false) {
  34          $EXT  = 'unknown';
  35          $MIME = 'application/octet-stream';
  36          $DL   = true;
  37      }
  38  
  39      // check for permissions, preconditions and cache external files
  40      list($STATUS, $STATUSMESSAGE) = checkFileStatus($MEDIA, $FILE, $REV, $WIDTH, $HEIGHT);
  41  
  42      // prepare data for plugin events
  43      $data = array(
  44          'media'         => $MEDIA,
  45          'file'          => $FILE,
  46          'orig'          => $FILE,
  47          'mime'          => $MIME,
  48          'download'      => $DL,
  49          'cache'         => $CACHE,
  50          'ext'           => $EXT,
  51          'width'         => $WIDTH,
  52          'height'        => $HEIGHT,
  53          'status'        => $STATUS,
  54          'statusmessage' => $STATUSMESSAGE,
  55          'ispublic'      => media_ispublic($MEDIA),
  56      );
  57  
  58      // handle the file status
  59      $evt = new Doku_Event('FETCH_MEDIA_STATUS', $data);
  60      if($evt->advise_before()) {
  61          // redirects
  62          if($data['status'] > 300 && $data['status'] <= 304) {
  63              if (defined('SIMPLE_TEST')) return; //TestResponse doesn't recognize redirects
  64              send_redirect($data['statusmessage']);
  65          }
  66          // send any non 200 status
  67          if($data['status'] != 200) {
  68              http_status($data['status'], $data['statusmessage']);
  69          }
  70          // die on errors
  71          if($data['status'] > 203) {
  72              print $data['statusmessage'];
  73              if (defined('SIMPLE_TEST')) return;
  74              exit;
  75          }
  76      }
  77      $evt->advise_after();
  78      unset($evt);
  79  
  80      //handle image resizing/cropping
  81      if((substr($MIME, 0, 5) == 'image') && ($WIDTH || $HEIGHT)) {
  82          if($HEIGHT && $WIDTH) {
  83              $data['file'] = $FILE = media_crop_image($data['file'], $EXT, $WIDTH, $HEIGHT);
  84          } else {
  85              $data['file'] = $FILE = media_resize_image($data['file'], $EXT, $WIDTH, $HEIGHT);
  86          }
  87      }
  88  
  89      // finally send the file to the client
  90      $evt = new Doku_Event('MEDIA_SENDFILE', $data);
  91      if($evt->advise_before()) {
  92          sendFile($data['file'], $data['mime'], $data['download'], $data['cache'], $data['ispublic'], $data['orig']);
  93      }
  94      // Do something after the download finished.
  95      $evt->advise_after();  // will not be emitted on 304 or x-sendfile
  96  
  97  // END DO main
  98  
  99  //Setup VIM: ex: et ts=2 :