From a9fb8c7b89def45a3754fb383ce3e76488ed7156 Mon Sep 17 00:00:00 2001 From: KyleK Date: Sun, 14 Sep 2014 14:18:01 +0200 Subject: Replace header() with Common::sendHeader() when possible --- core/API/ApiRenderer.php | 4 ++-- core/BaseFactory.php | 3 ++- core/Common.php | 7 +------ core/DataTable/Renderer.php | 3 ++- core/DataTable/Renderer/Csv.php | 2 +- core/DataTable/Renderer/Json.php | 2 +- core/Error.php | 9 ++++++--- core/ExceptionHandler.php | 5 ++--- core/Piwik.php | 5 ++--- core/ProxyHttp.php | 27 ++++++++++++++------------- core/Url.php | 9 ++++++++- core/View.php | 8 ++++++-- core/testMinimumPhpVersion.php | 6 ++++-- misc/others/geoipUpdateRows.php | 4 +--- misc/proxy-hide-piwik-url/piwik.php | 31 ++++++++++++++++++++++--------- plugins/API/Renderer/Console.php | 5 +++-- plugins/API/Renderer/Csv.php | 6 +++--- plugins/API/Renderer/Html.php | 4 ++-- plugins/API/Renderer/Original.php | 2 +- plugins/API/Renderer/Php.php | 2 +- plugins/API/Renderer/Rss.php | 6 +++--- plugins/API/Renderer/Tsv.php | 3 ++- plugins/API/Renderer/Xml.php | 3 ++- plugins/Installation/Controller.php | 2 +- plugins/Overlay/Controller.php | 2 +- plugins/Proxy/Controller.php | 2 +- 26 files changed, 94 insertions(+), 68 deletions(-) diff --git a/core/API/ApiRenderer.php b/core/API/ApiRenderer.php index 924bd46aab..4a75f3d6e6 100644 --- a/core/API/ApiRenderer.php +++ b/core/API/ApiRenderer.php @@ -8,10 +8,10 @@ */ namespace Piwik\API; +use Exception; use Piwik\Common; use Piwik\DataTable\Renderer; use Piwik\DataTable; -use Exception; use Piwik\Piwik; use Piwik\Plugin; @@ -116,7 +116,7 @@ abstract class ApiRenderer } $availableRenderers = implode(', ', $availableRenderers); - @header('Content-Type: text/plain; charset=utf-8'); + Common::sendHeader('Content-Type: text/plain; charset=utf-8'); throw new Exception(Piwik::translate('General_ExceptionInvalidRendererFormat', array($format, $availableRenderers))); } diff --git a/core/BaseFactory.php b/core/BaseFactory.php index e24b6dfc02..6f09f952ef 100644 --- a/core/BaseFactory.php +++ b/core/BaseFactory.php @@ -9,6 +9,7 @@ namespace Piwik; use Exception; +use Piwik\Common; /** * Base class for all factory types. @@ -34,7 +35,7 @@ abstract class BaseFactory $className = static::getClassNameFromClassId($classId); if (!class_exists($className)) { - @header('Content-Type: text/plain; charset=utf-8'); + Common::sendHeader('Content-Type: text/plain; charset=utf-8'); throw new Exception(static::getInvalidClassIdExceptionMessage($classId)); } diff --git a/core/Common.php b/core/Common.php index 5d5c35c764..c345c1d17d 100644 --- a/core/Common.php +++ b/core/Common.php @@ -1053,12 +1053,7 @@ class Common public static function sendHeader($header, $replace = true) { // don't send header in CLI mode - if(Common::isPhpCliMode()) { - return; - } - if (isset($GLOBALS['PIWIK_TRACKER_LOCAL_TRACKING']) && $GLOBALS['PIWIK_TRACKER_LOCAL_TRACKING']) { - @header($header, $replace); - } else { + if(!Common::isPhpCliMode() and !headers_sent()) { header($header, $replace); } } diff --git a/core/DataTable/Renderer.php b/core/DataTable/Renderer.php index e366cc2ec8..5705b3e205 100644 --- a/core/DataTable/Renderer.php +++ b/core/DataTable/Renderer.php @@ -9,6 +9,7 @@ namespace Piwik\DataTable; use Exception; +use Piwik\Common; use Piwik\DataTable; use Piwik\Metrics; use Piwik\Piwik; @@ -100,7 +101,7 @@ abstract class Renderer extends BaseFactory */ protected function renderHeader() { - @header('Content-Type: text/plain; charset=utf-8'); + Common::sendHeader('Content-Type: text/plain; charset=utf-8'); } /** diff --git a/core/DataTable/Renderer/Csv.php b/core/DataTable/Renderer/Csv.php index ae7d2acbb3..064dbd6db1 100644 --- a/core/DataTable/Renderer/Csv.php +++ b/core/DataTable/Renderer/Csv.php @@ -341,7 +341,7 @@ class Csv extends Renderer } // silent fail otherwise unit tests fail - @header('Content-Disposition: attachment; filename="' . $fileName . '"', true); + Common::sendHeader('Content-Disposition: attachment; filename="' . $fileName . '"', true); ProxyHttp::overrideCacheControlHeaders(); } diff --git a/core/DataTable/Renderer/Json.php b/core/DataTable/Renderer/Json.php index 2a5575c945..8fea38a658 100644 --- a/core/DataTable/Renderer/Json.php +++ b/core/DataTable/Renderer/Json.php @@ -79,7 +79,7 @@ class Json extends Renderer public static function sendHeaderJSON() { - @header('Content-Type: application/json; charset=utf-8'); + Common::sendHeader('Content-Type: application/json; charset=utf-8'); } private function convertDataTableToArray($table) diff --git a/core/Error.php b/core/Error.php index 7cff6fac0b..f7decbbc16 100644 --- a/core/Error.php +++ b/core/Error.php @@ -8,6 +8,11 @@ */ namespace Piwik; +use Piwik\Common; +use Piwik\Log; +use Piwik\Piwik; +use Piwik\Version; + require_once PIWIK_INCLUDE_PATH . '/core/Log.php'; /** @@ -143,9 +148,7 @@ class Error return; } - if (!Common::isPhpCliMode()) { - @header('Content-Type: text/html; charset=utf-8'); - } + Common::sendHeader('Content-Type: text/html; charset=utf-8'); $htmlString = ''; $htmlString .= "\n
diff --git a/core/ExceptionHandler.php b/core/ExceptionHandler.php index 8d5f9c595e..0e526225d5 100644 --- a/core/ExceptionHandler.php +++ b/core/ExceptionHandler.php @@ -9,6 +9,7 @@ namespace Piwik; use Piwik\API\ResponseBuilder; +use Piwik\Common; use Piwik\Plugin; /** @@ -46,9 +47,7 @@ class ExceptionHandler public static function formatScreenMessage(&$message, $level, $tag, $datetime, $log) { if ($message instanceof \Exception) { - if (!Common::isPhpCliMode()) { - @header('Content-Type: text/html; charset=utf-8'); - } + Common::sendHeader('Content-Type: text/html; charset=utf-8'); $outputFormat = strtolower(Common::getRequestVar('format', 'html', 'string')); $response = new ResponseBuilder($outputFormat); diff --git a/core/Piwik.php b/core/Piwik.php index ccaee84962..7a782033a2 100644 --- a/core/Piwik.php +++ b/core/Piwik.php @@ -9,6 +9,7 @@ namespace Piwik; use Exception; +use Piwik\Common; use Piwik\Db\Adapter; use Piwik\Db\Schema; use Piwik\Db; @@ -76,9 +77,7 @@ class Piwik */ public static function exitWithErrorMessage($message) { - if (!Common::isPhpCliMode()) { - @header('Content-Type: text/html; charset=utf-8'); - } + Common::sendHeader('Content-Type: text/html; charset=utf-8'); $output = "\n" . "
" . diff --git a/core/ProxyHttp.php b/core/ProxyHttp.php index cb1fa654d3..4fee4c1520 100644 --- a/core/ProxyHttp.php +++ b/core/ProxyHttp.php @@ -77,12 +77,12 @@ class ProxyHttp // set some HTTP response headers self::overrideCacheControlHeaders('public'); - @header('Vary: Accept-Encoding'); - @header('Content-Disposition: inline; filename=' . basename($file)); + Common::sendHeader('Vary: Accept-Encoding'); + Common::sendHeader('Content-Disposition: inline; filename=' . basename($file)); if ($expireFarFutureDays) { // Required by proxy caches potentially in between the browser and server to cache the request indeed - @header(self::getExpiresHeaderForFutureDay($expireFarFutureDays)); + Common::sendHeader(self::getExpiresHeaderForFutureDay($expireFarFutureDays)); } // Return 304 if the file has not modified since @@ -143,18 +143,18 @@ class ProxyHttp } } - @header('Last-Modified: ' . $lastModified); + Common::sendHeader('Last-Modified: ' . $lastModified); if (!$phpOutputCompressionEnabled) { - @header('Content-Length: ' . ($byteEnd - $byteStart)); + Common::sendHeader('Content-Length: ' . ($byteEnd - $byteStart)); } if (!empty($contentType)) { - @header('Content-Type: ' . $contentType); + Common::sendHeader('Content-Type: ' . $contentType); } if ($compressed) { - @header('Content-Encoding: ' . $encoding); + Common::sendHeader('Content-Encoding: ' . $encoding); } if (!_readfile($file, $byteStart, $byteEnd)) { @@ -209,12 +209,12 @@ class ProxyHttp public static function overrideCacheControlHeaders($override = null) { if ($override || self::isHttps()) { - @header('Pragma: '); - @header('Expires: '); + Common::sendHeader('Pragma: '); + Common::sendHeader('Expires: '); if (in_array($override, array('public', 'private', 'no-cache', 'no-store'))) { - @header("Cache-Control: $override, must-revalidate"); + Common::sendHeader("Cache-Control: $override, must-revalidate"); } else { - @header('Cache-Control: must-revalidate'); + Common::sendHeader('Cache-Control: must-revalidate'); } } } @@ -228,11 +228,12 @@ class ProxyHttp protected static function setHttpStatus($status) { if (strpos(PHP_SAPI, '-fcgi') === false) { - @header($_SERVER['SERVER_PROTOCOL'] . ' ' . $status); + $key = $_SERVER['SERVER_PROTOCOL']; } else { // FastCGI - @header('Status: ' . $status); + $key = 'Status:'; } + Common::sendHeader($key . ' ' . $status); } /** diff --git a/core/Url.php b/core/Url.php index 376138b608..89496515db 100644 --- a/core/Url.php +++ b/core/Url.php @@ -10,6 +10,13 @@ namespace Piwik; use Exception; +use Piwik\Config; +use Piwik\Common; +use Piwik\Ip; +use Piwik\ProxyHttp; +use Piwik\Session; +use Piwik\UrlHelper; + /** * Provides URL related helper methods. * @@ -478,7 +485,7 @@ class Url if (UrlHelper::isLookLikeUrl($url) || strpos($url, 'index.php') === 0 ) { - @header("Location: $url"); + Common::sendHeader("Location: $url"); } else { echo "Invalid URL to redirect to."; } diff --git a/core/View.php b/core/View.php index c62c0eed78..bc02e4c792 100644 --- a/core/View.php +++ b/core/View.php @@ -9,8 +9,12 @@ namespace Piwik; use Exception; +use Piwik\Access; use Piwik\AssetManager\UIAssetCacheBuster; +use Piwik\Common; use Piwik\Plugins\UsersManager\API as APIUsersManager; +use Piwik\SettingsPiwik; +use Piwik\Version; use Piwik\View\ViewInterface; use Twig_Environment; @@ -246,9 +250,9 @@ class View implements ViewInterface ProxyHttp::overrideCacheControlHeaders('no-store'); - @header('Content-Type: ' . $this->contentType); + Common::sendHeader('Content-Type: ' . $this->contentType); // always sending this header, sometimes empty, to ensure that Dashboard embed loads (which could call this header() multiple times, the last one will prevail) - @header('X-Frame-Options: ' . (string)$this->xFrameOptions); + Common::sendHeader('X-Frame-Options: ' . (string)$this->xFrameOptions); return $this->renderTwigTemplate(); } diff --git a/core/testMinimumPhpVersion.php b/core/testMinimumPhpVersion.php index 5a67f53716..bce404c9e6 100644 --- a/core/testMinimumPhpVersion.php +++ b/core/testMinimumPhpVersion.php @@ -89,8 +89,10 @@ if (!function_exists('Piwik_ExitWithMessage')) { */ function Piwik_ExitWithMessage($message, $optionalTrace = false, $optionalLinks = false, $optionalLinkBack = false) { - @header('Content-Type: text/html; charset=utf-8'); - @header('HTTP/1.1 500 Internal Server Error'); + if (!headers_sent()) { + header('Content-Type: text/html; charset=utf-8'); + header('HTTP/1.1 500 Internal Server Error'); + } if ($optionalTrace) { $optionalTrace = 'Backtrace:
' . $optionalTrace . '
'; diff --git a/misc/others/geoipUpdateRows.php b/misc/others/geoipUpdateRows.php index df480d395d..b90a2d376c 100755 --- a/misc/others/geoipUpdateRows.php +++ b/misc/others/geoipUpdateRows.php @@ -89,9 +89,7 @@ if (!Common::isPhpCliMode()) { function geoipUpdateError($message) { Log::error($message); - if (!Common::isPhpCliMode()) { - @header('HTTP/1.1 500 Internal Server Error', $replace = true, $responseCode = 500); - } + Common::sendHeader('HTTP/1.1 500 Internal Server Error', $replace = true, $responseCode = 500); exit; } diff --git a/misc/proxy-hide-piwik-url/piwik.php b/misc/proxy-hide-piwik-url/piwik.php index 846a82313b..19493aeccc 100644 --- a/misc/proxy-hide-piwik-url/piwik.php +++ b/misc/proxy-hide-piwik-url/piwik.php @@ -24,6 +24,19 @@ $TOKEN_AUTH = 'xyz'; // Maximum time, in seconds, to wait for the Piwik server to return the 1*1 GIF $timeout = 5; +function sendHeader($header, $replace = true) +{ + headers_sent() || header($head, $replace); +} + +function arrayValue($array, $key, $value = null) +{ + if (!empty($array[$key])) { + $value = $array[$key]; + } + return $value; +} + // DO NOT MODIFY BELOW // --------------------------- // 1) PIWIK.JS PROXY: No _GET parameter, we serve the JS file @@ -40,18 +53,18 @@ if (empty($_GET)) { $lastModified = time() - 86400; // set HTTP response headers - header('Vary: Accept-Encoding'); + sendHeader('Vary: Accept-Encoding'); // Returns 304 if not modified since if (!empty($modifiedSince) && $modifiedSince < $lastModified) { - header(sprintf("%s 304 Not Modified", $_SERVER['SERVER_PROTOCOL'])); + sendHeader(sprintf("%s 304 Not Modified", $_SERVER['SERVER_PROTOCOL'])); } else { - header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); - @header('Content-Type: application/javascript; charset=UTF-8'); + sendHeader('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); + sendHeader('Content-Type: application/javascript; charset=UTF-8'); if ($piwikJs = file_get_contents($PIWIK_URL . 'piwik.js')) { echo $piwikJs; } else { - header($_SERVER['SERVER_PROTOCOL'] . '505 Internal server error'); + sendHeader($_SERVER['SERVER_PROTOCOL'] . '505 Internal server error'); } } exit; @@ -65,10 +78,10 @@ $url = sprintf("%spiwik.php?cip=%s&token_auth=%s&", $PIWIK_URL, getVisitIp(), $T foreach ($_GET as $key => $value) { $url .= $key . '=' . urlencode($value) . '&'; } -header("Content-Type: image/gif"); +sendHeader("Content-Type: image/gif"); $stream_options = array('http' => array( - 'user_agent' => @$_SERVER['HTTP_USER_AGENT'], - 'header' => sprintf("Accept-Language: %s\r\n", @str_replace(array("\n", "\t", "\r"), "", $_SERVER['HTTP_ACCEPT_LANGUAGE'])), + 'user_agent' => arrayValue($_SERVER, 'HTTP_USER_AGENT', ''), + 'header' => sprintf("Accept-Language: %s\r\n", str_replace(array("\n", "\t", "\r"), "", arrayValue($_SERVER, 'HTTP_ACCEPT_LANGUAGE', ''))), 'timeout' => $timeout )); $ctx = stream_context_create($stream_options); @@ -88,5 +101,5 @@ function getVisitIp() return $_SERVER[$ipKey]; } } - return @$_SERVER['REMOTE_ADDR']; + return arrayValue($_SERVER, 'REMOTE_ADDR'); } diff --git a/plugins/API/Renderer/Console.php b/plugins/API/Renderer/Console.php index d0798413e6..40794ef8e9 100644 --- a/plugins/API/Renderer/Console.php +++ b/plugins/API/Renderer/Console.php @@ -9,6 +9,7 @@ namespace Piwik\Plugins\API\Renderer; use Piwik\API\ApiRenderer; +use Piwik\Common; use Piwik\DataTable\Renderer; use Piwik\DataTable; @@ -17,14 +18,14 @@ class Console extends ApiRenderer public function renderException($message, \Exception $exception) { - @header('Content-Type: text/plain; charset=utf-8'); + self::sendHeader(); return 'Error: ' . $message; } public function sendHeader() { - @header('Content-Type: text/plain; charset=utf-8'); + Common::sendHeader('Content-Type: text/plain; charset=utf-8'); } } diff --git a/plugins/API/Renderer/Csv.php b/plugins/API/Renderer/Csv.php index f7c3b0f01e..468a3a2588 100644 --- a/plugins/API/Renderer/Csv.php +++ b/plugins/API/Renderer/Csv.php @@ -19,13 +19,13 @@ class Csv extends ApiRenderer public function renderSuccess($message) { - @header("Content-Disposition: attachment; filename=piwik-report-export.csv"); + Common::sendHeader("Content-Disposition: attachment; filename=piwik-report-export.csv"); return "message\n" . $message; } public function renderException($message, \Exception $exception) { - @header('Content-Type: text/html; charset=utf-8', true); + Common::sendHeader('Content-Type: text/html; charset=utf-8', true); return 'Error: ' . $message; } @@ -54,7 +54,7 @@ class Csv extends ApiRenderer public function sendHeader() { - @header("Content-Type: application/vnd.ms-excel", true); + Common::sendHeader("Content-Type: application/vnd.ms-excel", true); ProxyHttp::overrideCacheControlHeaders(); } } diff --git a/plugins/API/Renderer/Html.php b/plugins/API/Renderer/Html.php index cd41209083..4037c35b4e 100644 --- a/plugins/API/Renderer/Html.php +++ b/plugins/API/Renderer/Html.php @@ -18,7 +18,7 @@ class Html extends ApiRenderer public function renderException($message, \Exception $exception) { - @header('Content-Type: text/plain; charset=utf-8', true); + Common::sendHeader('Content-Type: text/plain; charset=utf-8', true); return nl2br($message); } @@ -45,7 +45,7 @@ class Html extends ApiRenderer public function sendHeader() { - @header('Content-Type: text/html; charset=utf-8', true); + Common::sendHeader('Content-Type: text/html; charset=utf-8', true); } } diff --git a/plugins/API/Renderer/Original.php b/plugins/API/Renderer/Original.php index 5249258fd8..33722b7026 100644 --- a/plugins/API/Renderer/Original.php +++ b/plugins/API/Renderer/Original.php @@ -50,7 +50,7 @@ class Original extends ApiRenderer public function sendHeader() { - @header('Content-Type: text/plain; charset=utf-8'); + Common::sendHeader('Content-Type: text/plain; charset=utf-8'); } /** diff --git a/plugins/API/Renderer/Php.php b/plugins/API/Renderer/Php.php index afeda22988..b55db23abd 100644 --- a/plugins/API/Renderer/Php.php +++ b/plugins/API/Renderer/Php.php @@ -56,7 +56,7 @@ class Php extends ApiRenderer public function sendHeader() { - @header('Content-Type: text/plain; charset=utf-8'); + Common::sendHeader('Content-Type: text/plain; charset=utf-8'); } /** diff --git a/plugins/API/Renderer/Rss.php b/plugins/API/Renderer/Rss.php index b93f2d9ded..3ee1c287bc 100644 --- a/plugins/API/Renderer/Rss.php +++ b/plugins/API/Renderer/Rss.php @@ -18,7 +18,7 @@ class Rss extends ApiRenderer public function renderException($message, \Exception $exception) { - @header('Content-Type: text/plain; charset=utf-8'); + self::sendHeader('plain'); return 'Error: ' . $message; } @@ -42,9 +42,9 @@ class Rss extends ApiRenderer return $this->renderDataTable($array); } - public function sendHeader() + public function sendHeader($type = "xml") { - @header('Content-Type: text/xml; charset=utf-8'); + Common::sendHeader('Content-Type: text/' . $type . '; charset=utf-8'); } diff --git a/plugins/API/Renderer/Tsv.php b/plugins/API/Renderer/Tsv.php index 015ba44175..c5505159e0 100644 --- a/plugins/API/Renderer/Tsv.php +++ b/plugins/API/Renderer/Tsv.php @@ -8,6 +8,7 @@ */ namespace Piwik\Plugins\API\Renderer; +use Piwik\Common; use Piwik\DataTable\Renderer; use Piwik\DataTable; @@ -16,7 +17,7 @@ class Tsv extends Csv public function renderSuccess($message) { - @header("Content-Disposition: attachment; filename=piwik-report-export.csv"); + Common::sendHeader("Content-Disposition: attachment; filename=piwik-report-export.csv"); return "message\t" . $message; } diff --git a/plugins/API/Renderer/Xml.php b/plugins/API/Renderer/Xml.php index ff68b4f79b..99092ee057 100644 --- a/plugins/API/Renderer/Xml.php +++ b/plugins/API/Renderer/Xml.php @@ -9,6 +9,7 @@ namespace Piwik\Plugins\API\Renderer; use Piwik\API\ApiRenderer; +use Piwik\Common; use Piwik\DataTable\Renderer; use Piwik\DataTable; @@ -33,7 +34,7 @@ class Xml extends ApiRenderer public function sendHeader() { - @header('Content-Type: text/xml; charset=utf-8'); + Common::sendHeader('Content-Type: text/xml; charset=utf-8'); } } diff --git a/plugins/Installation/Controller.php b/plugins/Installation/Controller.php index 567a3cbe2e..d3da5402f0 100644 --- a/plugins/Installation/Controller.php +++ b/plugins/Installation/Controller.php @@ -454,7 +454,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin */ public function getBaseCss() { - @header('Content-Type: text/css'); + Common::sendHeader('Content-Type: text/css'); return AssetManager::getInstance()->getCompiledBaseCss()->getContent(); } diff --git a/plugins/Overlay/Controller.php b/plugins/Overlay/Controller.php index 35b6f5a793..26de399636 100644 --- a/plugins/Overlay/Controller.php +++ b/plugins/Overlay/Controller.php @@ -133,7 +133,7 @@ class Controller extends \Piwik\Plugin\Controller $site = $sitesManager->getSiteFromId($idSite); $urls = $sitesManager->getSiteUrlsFromId($idSite); - @header('Content-Type: text/html; charset=UTF-8'); + Common::sendHeader('Content-Type: text/html; charset=UTF-8'); return '