Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
37 / 37
100.00% covered (success)
100.00%
12 / 12
CRAP
100.00% covered (success)
100.00%
1 / 1
AbstractResponse
100.00% covered (success)
100.00%
37 / 37
100.00% covered (success)
100.00%
12 / 12
23
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
8
 setVersion
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getVersion
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setCode
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 getCode
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setMessage
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getMessage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isSuccess
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
3
 isRedirect
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 isError
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 isClientError
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 isServerError
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * Pop PHP Framework (http://www.popphp.org/)
4 *
5 * @link       https://github.com/popphp/popphp-framework
6 * @author     Nick Sagona, III <dev@nolainteractive.com>
7 * @copyright  Copyright (c) 2009-2023 NOLA Interactive, LLC. (http://www.nolainteractive.com)
8 * @license    http://www.popphp.org/license     New BSD License
9 */
10
11/**
12 * @namespace
13 */
14namespace Pop\Http;
15
16/**
17 * Abstract HTTP request class
18 *
19 * @category   Pop
20 * @package    Pop\Http
21 * @author     Nick Sagona, III <dev@nolainteractive.com>
22 * @copyright  Copyright (c) 2009-2023 NOLA Interactive, LLC. (http://www.nolainteractive.com)
23 * @license    http://www.popphp.org/license     New BSD License
24 * @version    4.1.0
25 */
26abstract class AbstractResponse extends AbstractHttp
27{
28
29    /**
30     * Response codes & messages
31     * @var array
32     */
33    protected static $responseCodes = [
34        // Informational 1xx
35        100 => 'Continue',
36        101 => 'Switching Protocols',
37        102 => 'Processing',
38
39        // Success 2xx
40        200 => 'OK',
41        201 => 'Created',
42        202 => 'Accepted',
43        203 => 'Non-Authoritative Information',
44        204 => 'No Content',
45        205 => 'Reset Content',
46        206 => 'Partial Content',
47        207 => 'Multi-Status',
48        208 => 'Already Reported',
49        226 => 'IM Used',
50
51        // Redirection 3xx
52        300 => 'Multiple Choices',
53        301 => 'Moved Permanently',
54        302 => 'Found',
55        303 => 'See Other',
56        304 => 'Not Modified',
57        305 => 'Use Proxy',
58        306 => 'Switch Proxy',
59        307 => 'Temporary Redirect',
60        308 => 'Permanent Redirect',
61
62        // Client Error 4xx
63        400 => 'Bad Request',
64        401 => 'Unauthorized',
65        402 => 'Payment Required',
66        403 => 'Forbidden',
67        404 => 'Not Found',
68        405 => 'Method Not Allowed',
69        406 => 'Not Acceptable',
70        407 => 'Proxy Authentication Required',
71        408 => 'Request Timeout',
72        409 => 'Conflict',
73        410 => 'Gone',
74        411 => 'Length Required',
75        412 => 'Precondition Failed',
76        413 => 'Payload Too Large',
77        414 => 'URI Too Long',
78        415 => 'Unsupported Media Type',
79        416 => 'Range Not Satisfiable',
80        417 => 'Expectation Failed',
81        421 => 'Misdirected Request',
82        422 => 'Unprocessable Entity',
83        423 => 'Locked',
84        424 => 'Failed Dependency',
85        426 => 'Upgrade Required',
86        428 => 'Precondition Required',
87        429 => 'Too Many Requests',
88        431 => 'Request Header Fields Too Large',
89        451 => 'Unavailable For Legal Reasons',
90
91        // Server Error 5xx
92        500 => 'Internal Server Error',
93        501 => 'Not Implemented',
94        502 => 'Bad Gateway',
95        503 => 'Service Unavailable',
96        504 => 'Gateway Timeout',
97        505 => 'HTTP Version Not Supported',
98        506 => 'Variant Also Negotiates',
99        507 => 'Insufficient Storage',
100        508 => 'Loop Detected',
101        509 => 'Bandwidth Limit Exceeded',
102        510 => 'Not Extended',
103        511 => 'Network Authentication Required'
104    ];
105
106    /**
107     * HTTP version for response, i.e. 1.0, 1.1, 2.0, 3.0, etc.
108     * @var string
109     */
110    protected $version = 1.1;
111
112    /**
113     * Response code
114     * @var int
115     */
116    protected $code = null;
117
118    /**
119     * Response message
120     * @var string
121     */
122    protected $message = null;
123
124    /**
125     * Constructor
126     *
127     * Instantiate the response object
128     *
129     * @param  array $config
130     */
131    public function __construct(array $config = [])
132    {
133        // Check for config values and set defaults
134        if (!isset($config['version'])) {
135            $config['version'] = '1.1';
136        }
137        if (!isset($config['code'])) {
138            $config['code'] = 200;
139        }
140
141        $this->setVersion($config['version'])
142            ->setCode($config['code']);
143
144        if (!isset($config['message'])) {
145            $config['message'] = self::$responseCodes[$config['code']];
146        }
147        if (!isset($config['headers']) || (isset($config['headers']) && !is_array($config['headers']))) {
148            $config['headers'] = ['Content-Type' => 'text/html'];
149        }
150        if (!isset($config['body'])) {
151            $config['body'] = null;
152        }
153
154        $this->setMessage($config['message'])
155            ->addHeaders($config['headers'])
156            ->setBody($config['body']);
157    }
158
159    /**
160     * Set the response version
161     *
162     * @param  float|string $version
163     * @return AbstractResponse
164     */
165    public function setVersion($version)
166    {
167        $this->version = $version;
168        return $this;
169    }
170
171    /**
172     * Get the response HTTP version
173     *
174     * @return float|string
175     */
176    public function getVersion()
177    {
178        return $this->version;
179    }
180
181    /**
182     * Set the response code
183     *
184     * @param  int $code
185     * @throws \Pop\Http\Exception
186     * @return AbstractResponse
187     */
188    public function setCode($code = 200)
189    {
190        if (!array_key_exists($code, self::$responseCodes)) {
191            throw new \Pop\Http\Exception('The header code ' . $code . ' is not allowed.');
192        }
193
194        $this->code    = $code;
195        $this->message = self::$responseCodes[$code];
196
197        return $this;
198    }
199
200    /**
201     * Get the response code
202     *
203     * @return string
204     */
205    public function getCode()
206    {
207        return $this->code;
208    }
209
210    /**
211     * Set the response message
212     *
213     * @param  string $message
214     * @return AbstractResponse
215     */
216    public function setMessage($message = null)
217    {
218        $this->message = $message;
219        return $this;
220    }
221
222    /**
223     * Get the response HTTP message
224     *
225     * @return string
226     */
227    public function getMessage()
228    {
229        return $this->message;
230    }
231
232
233    /**
234     * Determine if the response is a success
235     *
236     * @return boolean
237     */
238    public function isSuccess()
239    {
240        $type = floor($this->code / 100);
241        return (($type == 1) || ($type == 2) || ($type == 3));
242    }
243
244    /**
245     * Determine if the response is a redirect
246     *
247     * @return boolean
248     */
249    public function isRedirect()
250    {
251        $type = floor($this->code / 100);
252        return ($type == 3);
253    }
254
255    /**
256     * Determine if the response is an error
257     *
258     * @return boolean
259     */
260    public function isError()
261    {
262        $type = floor($this->code / 100);
263        return (($type == 4) || ($type == 5));
264    }
265
266    /**
267     * Determine if the response is a client error
268     *
269     * @return boolean
270     */
271    public function isClientError()
272    {
273        $type = floor($this->code / 100);
274        return ($type == 4);
275    }
276
277    /**
278     * Determine if the response is a server error
279     *
280     * @return boolean
281     */
282    public function isServerError()
283    {
284        $type = floor($this->code / 100);
285        return ($type == 5);
286    }
287
288}