Skip to content

HTTPD default 8Kb header limit check, to avoid 500 Internal Server Error #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 15, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion ChromePhp.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,11 @@ class ChromePhp
*/
const TABLE = 'table';

/**
* @var int
*/
const HTTPD_HEADER_LIMIT = 8192; // 8Kb - Default for most HTTPD Servers

/**
* @var int
*/
Expand Down Expand Up @@ -377,7 +382,35 @@ protected function _addRow(array $logs, $backtrace, $type)

protected function _writeHeader($data)
{
header(self::HEADER_NAME . ': ' . $this->_encode($data));
$header = self::HEADER_NAME . ': ' . $this->_encode($data);
// Most HTTPD servers have a default header line length limit of 8kb, must test to avoid 500 Internal Server Error.
if (strlen($header) > self::HTTPD_HEADER_LIMIT) {
$data['rows'] = [];
$data['rows'][] = [
[
'ChromePHP Error: The HTML header will surpass the limit of ' .
$this->_formatSize(self::HTTPD_HEADER_LIMIT) . ' (' . $this->_formatSize(strlen($header)) .
') - You can increase the HTTPD_HEADER_LIMIT on ChromePHP class, according to your Apache ' .
'LimitRequestFieldsize directive'
], '', self::ERROR
];
$header = self::HEADER_NAME . ': ' . $this->_encode($data);
}
header($header);
}

protected function _formatSize($arg) {
Copy link
Collaborator

@peter279k peter279k May 15, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like this method coding style is not same as other methods.

To be consistency, I think we should fix/organize coding style and I suggest we can follow the PSR-2 coding style :).

And the PHP_CodeSniffer is one of coding style check tool we can consider.

if ($arg > 0) {
$j = 0;
$ext = ["bytes","Kb","Mb","Gb","Tb"];
while ($arg >= pow(1024, $j)) ++$j; {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think the while loop usage syntax is good.

We should make this while syntax be readable if possible.

$arg = (round($arg / pow(1024, $j - 1) * 100) / 100).($ext[$j - 1]);
}

return $arg;
}

return "0Kb";
}

/**
Expand Down