Passed
Push — develop ( 070d6c...54cd90 )
by Jens
03:17
created

errorhandler.php ➔ canShowError()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 15
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
cc 5
eloc 10
c 2
b 0
f 1
nc 4
nop 0
dl 0
loc 15
rs 8.8571
1
<?php
2
set_exception_handler('exceptionHandler');
3
set_error_handler('errorHandler');
4
register_shutdown_function('shutdownHandler');
5
6
/**
7
 * An uncaught exception will result in the rendering
8
 * of the exception as though it were an error
9
 *
10
 * @param $e
11
 */
12
function exceptionHandler ($e) {
13
	renderError($e->getMessage(),$e->getFile(),$e->getLine(),$e->getCode(),$e->getTrace());
14
}
15
16
/**
17
 * When an error occures, render it properly.
18
 *
19
 * @param $errno
20
 * @param $errstr
21
 * @param $errfile
22
 * @param $errline
23
 */
24
function errorHandler ($errno, $errstr, $errfile, $errline) {
25
	renderError($errstr,$errfile,$errline,$errno,debug_backtrace());
26
}
27
28
/**
29
 * When an error occurs that kills the process, still try
30
 * to show it using a shutdownHandler.
31
 */
32
function shutdownHandler () {
33
	$error = error_get_last(); 
34
    if (isset($error['type'], $error['message'], $error['file'], $error['line'])) { 
35
        errorHandler($error['type'],$error['message'],$error['file'],$error['line']);
36
    }elseif ($error['type'] == 1) {
37
        dump($error);
38
    }
39
}
40
41
/**
42
 * Error handler specificly for json errors
43
 *
44
 * @param $file
45
 * @param $line
46
 */
47
function handleJsonError($file, $line) 
48
{
49
	$jsonErrorNr = json_last_error();
50
	$errstr = '';
51
	switch ($jsonErrorNr) {
52
        case JSON_ERROR_NONE:
53
            $errstr .= ' - No errors' . PHP_EOL;
54
        break;
55
        case JSON_ERROR_DEPTH:
56
            $errstr .= ' - Maximum stack depth exceeded' . PHP_EOL;
57
        break;
58
        case JSON_ERROR_STATE_MISMATCH:
59
            $errstr .= ' - Underflow or the modes mismatch' . PHP_EOL;
60
        break;
61
        case JSON_ERROR_CTRL_CHAR:
62
            $errstr .= ' - Unexpected control character found' . PHP_EOL;
63
        break;
64
        case JSON_ERROR_SYNTAX:
65
            $errstr .= ' - Syntax error, malformed JSON' . PHP_EOL;
66
        break;
67
        case JSON_ERROR_UTF8:
68
            $errstr .= ' - Malformed UTF-8 characters, possibly incorrectly encoded' . PHP_EOL;
69
        break;
70
        default:
71
            $errstr = ' - Unknown error' . PHP_EOL;
72
        break;
73
    }
74
	errorHandler ($jsonErrorNr, $errstr, $file, $line);
75
}
76
77
/**
78
 * Displays the error in a human readable fashion for developers.
79
 *
80
 * @param string $message
81
 * @param string $file
82
 * @param string $line
83
 * @param int    $code
84
 * @param array  $trace
85
 * @param string $httpHeader
86
 */
87
function renderError ($message='', $file='', $line='', $code=0, $trace=array(), $httpHeader = 'HTTP/1.0 500 Internal Server Error') {
88
    if (ob_get_contents()) ob_end_clean();
89
90
    if (canShowError()) {
91
        $file_lines = file_exists($file) ? file($file) : array();
92
        $range = ($line - 15) < 0 ? range(1, 30) : range($line - 15, $line + 15);
93
        $lines = array();
94
95
        foreach ($range as $line_number) {
96
            if(isset($file_lines[$line_number-1])) {
97
                $lines[$line_number] = $file_lines[$line_number-1];
98
            }
99
        }
100
101
        $error = array(
102
            'message' 		=> $message,
103
            'file' 			=> $file,
104
            'line' 			=> $line,
105
            'code' 			=> $code,
106
            'lines' 		=> $lines,
107
            'trace' 		=> $trace,
108
            'httpHeader' 	=> $httpHeader,
109
        );
110
111
        if (PHP_SAPI === 'cli') {
112
            renderCliException($message, $file, $line, $code, $trace, $lines);
113
        }
114
115
        if (file_exists(realpath(__DIR__) . '/errorviewdetailed.php')) {
116
            include(realpath(__DIR__) . '/errorviewdetailed.php');
117
        } else {
118
            header('Content-type: application/json');
119
            die(json_encode($error));
120
        }
121
        exit;
122
    } else {
123
        header($_SERVER['SERVER_PROTOCOL'] . $httpHeader, true);
124
        header('X-Error-Message: ' . $message);
125
        header('X-Error-File: ' . $file);
126
        header('X-Error-Line: ' . $line);
127
        if (file_exists(realpath(__DIR__) . '/errorviewcompact.php')) {
128
            include(realpath(__DIR__) . '/errorviewcompact.php');
129
        } else {
130
            header('Content-type: application/json');
131
            die(json_encode('An error occured.'));
132
        }
133
    }
134
}
135
136
function canShowError()
137
{
138
    if (PHP_SAPI === 'cli') {
139
        return true;
140
    }
141
    if (file_exists('../config.json') && !isset($_SESSION['cloudcontrol'])) {
142
        $config = file_get_contents('../config.json');
143
        $config = json_decode($config);
144
        if (isset($config->showErrorsToAll)) {
145
            return $config->showErrorsToAll;
146
        }
147
    } else {
148
        return true;
149
    }
150
}
151
152
function renderCliException($message, $file, $line, $code, $trace, $lines)
0 ignored issues
show
Unused Code introduced by
The parameter $code is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
153
{
154
    echo PHP_EOL;
155
    echo '------------------------------------------------------------------------------------------------------------------------------------------------' . PHP_EOL;
156
    echo '| THE FOLLOWING ERROR OCCURED                                                                                                                  |' . PHP_EOL;
157
    echo '------------------------------------------------------------------------------------------------------------------------------------------------' . PHP_EOL;
158
    echo PHP_EOL;
159
    echo '  ' . $message . PHP_EOL;
160
    echo PHP_EOL;
161
    echo '------------------------------------------------------------------------------------------------------------------------------------------------' . PHP_EOL;
162
    echo '| IN FILE                                                                                                                                      |' . PHP_EOL;
163
    echo '------------------------------------------------------------------------------------------------------------------------------------------------' . PHP_EOL;
164
    echo PHP_EOL;
165
    echo '  ' . $file . ':' . $line . PHP_EOL;
166
    echo PHP_EOL;
167
    echo '------------------------------------------------------------------------------------------------------------------------------------------------' . PHP_EOL;
168
    echo '| CONTENTS OF THE FILE                                                                                                                         |' . PHP_EOL;
169
    echo '------------------------------------------------------------------------------------------------------------------------------------------------' . PHP_EOL;
170
    echo PHP_EOL;
171
    foreach($lines as $nr => $currentLine) {
172
        echo ($nr == $line ? '* ' : '  ' ) . str_pad($nr, 3, "0", STR_PAD_LEFT) . ' ' . $currentLine;
173
    }
174
    echo PHP_EOL;
175
    echo '------------------------------------------------------------------------------------------------------------------------------------------------' . PHP_EOL;
176
    echo '| STACK TRACE                                                                                                                                  |' . PHP_EOL;
177
    echo '------------------------------------------------------------------------------------------------------------------------------------------------' . PHP_EOL;
178
    foreach($trace as $row) {
179
        echo (isset($row['file']) ? basename($row['file']) : '') . ':'
180
            . (isset($row['line']) ? $row['line'] : '') . "\t\t\t"
181
            . (isset($row['class']) ? $row['class'] : ' ') . "\t\t\t"
182
            . (isset($row['type']) ? $row['type'] : ' ') . "\t\t\t"
183
            . (isset($row['function']) ? $row['function'] : ' ') . PHP_EOL;
184
    }
185
    exit;
186
}