-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhttp_exception.php
More file actions
181 lines (164 loc) · 5.17 KB
/
http_exception.php
File metadata and controls
181 lines (164 loc) · 5.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<?php
class HttpException extends \Exception
{
/**
* List of additional headers
*
* @var array
*/
private $headers = array();
/**
* Body message
*
* @var string
*/
private $body = '';
/**
* List of HTTP status codes
*
* @link From http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
* @var array
*/
private $status = array(
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
418 => 'I\'m a teapot', // RFC 2324
419 => 'Authentication Timeout', // not in RFC 2616
420 => 'Method Failure', // Spring Framework
420 => 'Enhance Your Calm', // Twitter
422 => 'Unprocessable Entity', // WebDAV; RFC 4918
423 => 'Locked', // WebDAV; RFC 4918
424 => 'Failed Dependency', // WebDAV; RFC 4918
424 => 'Method Failure', // WebDAV)
425 => 'Unordered Collection', // Internet draft
426 => 'Upgrade Required', // RFC 2817
428 => 'Precondition Required', // RFC 6585
429 => 'Too Many Requests', // RFC 6585
431 => 'Request Header Fields Too Large', // RFC 6585
444 => 'No Response', // Nginx
449 => 'Retry With', // Microsoft
450 => 'Blocked by Windows Parental Controls', // Microsoft
451 => 'Unavailable For Legal Reasons', // Internet draft
451 => 'Redirect', // Microsoft
494 => 'Request Header Too Large', // Nginx
495 => 'Cert Error', // Nginx
496 => 'No Cert', // Nginx
497 => 'HTTP to HTTPS', // Nginx
499 => 'Client Closed Request', // Nginx
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
506 => 'Variant Also Negotiates', // RFC 2295
507 => 'Insufficient Storage', // WebDAV; RFC 4918
508 => 'Loop Detected', // WebDAV; RFC 5842
509 => 'Bandwidth Limit Exceeded', // Apache bw/limited extension
510 => 'Not Extended', // RFC 2774
511 => 'Network Authentication Required', // RFC 6585
598 => 'Network read timeout error', // Unknown
599 => 'Network connect timeout error', // Unknown
);
/**
* @param int[optional] $statusCode If NULL will use 500 as default
* @param string[optional] $message If NULL will use the default status phrase
* @param array[optional] $headers List of additional headers
*/
public function __construct($statusCode = 500, $message = null, array $headers = array()) {
if (null === $message && isset($this->status[$statusCode])) {
$message = $this->status[$statusCode];
}
parent::__construct($message, $statusCode);
$this->addHeaders($headers);
}
/**
* Returns the list of additional headers
*
* @return array
*/
public function getHeaders() {
return $this->headers;
}
/**
* @param string $header
*
* @return self
*/
public function addHeader($header) {
$this->headers[] = $header;
return $this;
}
/**
* @param array $headers
*
* @return self
*/
public function addHeaders(array $headers) {
foreach ($headers as $key => $header) {
if (!is_int($key)) {
$header = $key.': '.$header;
}
$this->addHeader($header);
}
return $this;
}
/**
* Return the body message.
*
* @return string
*/
public function getBody() {
return $this->body;
}
/**
* Define a body message.
*
* @param string $body
*
* @return self
*/
public function setBody($body) {
$this->body = (string) $body;
return $this;
}
/**
* Output an error as Http Response
*
* @return self
*/
public function getResponse() {
// add all headers to the response
foreach ($this->headers as $header) header($header);
// update the response code if avaliable
if ($this->code > 0) http_response_code($this->code);
// set output as JSON
header('Content-type:application/json');
// write the error body output
$body = $this->getBody();
echo json_encode(array(
'error' => array(
'code' => $this->getCode(),
'message' => $this->getMessage(),
'details' => empty($body) ? $this->status[$this->getCode()] : $body
)
));
exit();
}
}