forked from Luracast/Restler-Framework
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRestException.php
138 lines (128 loc) · 3.86 KB
/
RestException.php
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
<?php
namespace Luracast\Restler;
use Exception;
/**
* Special Exception for raising API errors
* that can be used in API methods
*
* @category Framework
* @package Restler
* @subpackage exception
* @author R.Arul Kumaran <arul@luracast.com>
* @copyright 2010 Luracast
* @license http://www.opensource.org/licenses/lgpl-license.php LGPL
* @link http://luracast.com/products/restler/
*/
class RestException extends Exception
{
/**
* HTTP status codes
*
* @var array
*/
public static $codes = array(
100 => 'Continue',
101 => 'Switching Protocols',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => '(Unused)',
307 => 'Temporary Redirect',
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',
429 => 'Too Many Requests', //still in draft but used for rate limiting
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported'
);
private $details;
private $stage;
/**
* @param string $httpStatusCode http status code
* @param string|null $errorMessage error message
* @param array $details any extra detail about the exception
* @param Exception $previous previous exception if any
*/
public function __construct($httpStatusCode, $errorMessage = null, array $details = array(), Exception $previous = null)
{
$events = Scope::get('Restler')->getEvents();
if(count($events)<= 1){
$this->stage = 'setup';
} else {
$this->stage = $previous ? $events[count($events)-2] : end($events);
}
$this->details = $details;
parent::__construct($errorMessage, $httpStatusCode, $previous);
}
/**
* Get extra details about the exception
*
* @return array details array
*/
public function getDetails()
{
return $this->details;
}
public function getStage()
{
return $this->stage;
}
public function getStages()
{
$e = Scope::get('Restler')->getEvents();
$i = array_search($this->stage, $e);
return array(
'success' => array_slice($e, 0, $i),
'failure' => array_slice($e, $i),
);
}
public function getErrorMessage()
{
$statusCode = $this->getCode();
$message = $this->getMessage();
if (isset(RestException::$codes[$statusCode])) {
$message = RestException::$codes[$statusCode] .
(empty($message) ? '' : ': ' . $message);
}
return $message;
}
public function getSource()
{
$e = $this;
while ($e->getPrevious()) {
$e = $e->getPrevious();
}
return basename($e->getFile()) . ':'
. $e->getLine() . ' at '
. $this->getStage() . ' stage';
}
}