Merge branch 'MDL-69355-master-filebuffer' of git://github.com/mudrd8mz/moodle into...
authorSara Arjona <sara@moodle.com>
Mon, 5 Oct 2020 16:33:34 +0000 (18:33 +0200)
committerSara Arjona <sara@moodle.com>
Mon, 5 Oct 2020 16:33:34 +0000 (18:33 +0200)
1  2 
lib/filelib.php

diff --combined lib/filelib.php
@@@ -2234,23 -2234,27 +2234,27 @@@ function readfile_accel($file, $mimetyp
          }
      }
  
-     if ($filesize > 10000000) {
-         // for large files try to flush and close all buffers to conserve memory
-         while(@ob_get_level()) {
-             if (!@ob_end_flush()) {
-                 break;
-             }
-         }
-     }
-     // Send this header after we have flushed the buffers so that if we fail
-     // later can remove this because it wasn't sent.
      header('Content-Length: ' . $filesize);
  
      if (!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'HEAD') {
          exit;
      }
  
+     while (ob_get_level()) {
+         $handlerstack = ob_list_handlers();
+         $activehandler = array_pop($handlerstack);
+         if ($activehandler === 'default output handler') {
+             // We do not expect any content in the buffer when we are serving files.
+             $buffercontents = ob_get_clean();
+             if ($buffercontents !== '') {
+                 error_log('Non-empty default output handler buffer detected while serving the file ' . $file);
+             }
+         } else {
+             // Some handlers such as zlib output compression may have file signature buffered - flush it.
+             ob_end_flush();
+         }
+     }
      // send the whole file content
      if (is_object($file)) {
          $file->readfile();
@@@ -3018,7 -3022,7 +3022,7 @@@ class curl 
      private $cookie   = false;
      /** @var bool tracks multiple headers in response - redirect detection */
      private $responsefinished = false;
 -    /** @var security helper class, responsible for checking host/ports against blacklist/whitelist entries.*/
 +    /** @var security helper class, responsible for checking host/ports against allowed/blocked entries.*/
      private $securityhelper;
      /** @var bool ignoresecurity a flag which can be supplied to the constructor, allowing security to be bypassed. */
      private $ignoresecurity;
       * @return bool
       */
      protected function request($url, $options = array()) {
 -        // Reset here so that the data is valid when result returned from cache, or if we return due to a blacklist hit.
 +        // Reset here so that the data is valid when result returned from cache, or if we return due to a blocked URL hit.
          $this->reset_request_state_vars();
  
          if ((defined('PHPUNIT_TEST') && PHPUNIT_TEST)) {
              }
          }
  
 -        // If curl security is enabled, check the URL against the blacklist before calling curl_exec.
 -        // Note: This will only check the base url. In the case of redirects, the blacklist is also after the curl_exec.
 +        // If curl security is enabled, check the URL against the list of blocked URLs before calling curl_exec.
 +        // Note: This will only check the base url. In the case of redirects, the blocking check is also after the curl_exec.
          if (!$this->ignoresecurity && $this->securityhelper->url_is_blocked($url)) {
              $this->error = $this->securityhelper->get_blocked_url_string();
              return $this->error;
          $this->errno = curl_errno($curl);
          // Note: $this->response and $this->rawresponse are filled by $hits->formatHeader callback.
  
 -        // In the case of redirects (which curl blindly follows), check the post-redirect URL against the blacklist entries too.
 +        // In the case of redirects (which curl blindly follows), check the post-redirect URL against the list of blocked list too.
          if (intval($this->info['redirect_count']) > 0 && !$this->ignoresecurity
              && $this->securityhelper->url_is_blocked($this->info['url'])) {
              $this->reset_request_state_vars();