Completed
Pull Request — master (#16)
by
unknown
02:53
created

HttpResponse::getContent()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
c 0
b 0
f 0
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Http;
4
5
class HttpResponse implements Response
6
{
7
    private $version = '1.1';
8
    private $statusCode = 200;
9
    private $statusText = 'OK';
10
    private $headers = [];
11
    private $cookies = [];
12
    private $content;
13
14
    private $statusTexts = [
15
        100 => 'Continue',
16
        101 => 'Switching Protocols',
17
        102 => 'Processing',
18
        200 => 'OK',
19
        201 => 'Created',
20
        202 => 'Accepted',
21
        203 => 'Non-Authoritative Information',
22
        204 => 'No Content',
23
        205 => 'Reset Content',
24
        206 => 'Partial Content',
25
        207 => 'Multi-Status',
26
        208 => 'Already Reported',
27
        226 => 'IM Used',
28
        300 => 'Multiple Choices',
29
        301 => 'Moved Permanently',
30
        302 => 'Found',
31
        303 => 'See Other',
32
        304 => 'Not Modified',
33
        305 => 'Use Proxy',
34
        306 => 'Reserved',
35
        307 => 'Temporary Redirect',
36
        308 => 'Permanent Redirect',
37
        400 => 'Bad Request',
38
        401 => 'Unauthorized',
39
        402 => 'Payment Required',
40
        403 => 'Forbidden',
41
        404 => 'Not Found',
42
        405 => 'Method Not Allowed',
43
        406 => 'Not Acceptable',
44
        407 => 'Proxy Authentication Required',
45
        408 => 'Request Timeout',
46
        409 => 'Conflict',
47
        410 => 'Gone',
48
        411 => 'Length Required',
49
        412 => 'Precondition Failed',
50
        413 => 'Request Entity Too Large',
51
        414 => 'Request-URI Too Long',
52
        415 => 'Unsupported Media Type',
53
        416 => 'Requested Range Not Satisfiable',
54
        417 => 'Expectation Failed',
55
        418 => 'I\'m a teapot',
56
        422 => 'Unprocessable Entity',
57
        423 => 'Locked',
58
        424 => 'Failed Dependency',
59
        425 => 'Reserved for WebDAV advanced collections expired proposal',
60
        426 => 'Upgrade Required',
61
        428 => 'Precondition Required',
62
        429 => 'Too Many Requests',
63
        431 => 'Request Header Fields Too Large',
64
        500 => 'Internal Server Error',
65
        501 => 'Not Implemented',
66
        502 => 'Bad Gateway',
67
        503 => 'Service Unavailable',
68
        504 => 'Gateway Timeout',
69
        505 => 'HTTP Version Not Supported',
70
        506 => 'Variant Also Negotiates',
71
        507 => 'Insufficient Storage',
72
        508 => 'Loop Detected',
73
        510 => 'Not Extended',
74
        511 => 'Network Authentication Required',
75
    ];
76
77
    /**
78
     * Sets the HTTP status code.
79
     *
80
     * @param  integer $statusCode
81
     * @param  string  $statusText (optional)
82
     * @return void
83
     */
84
    public function setStatusCode($statusCode, $statusText = null)
85
    {
86
        if ($statusText === null
87
            && array_key_exists((int) $statusCode, $this->statusTexts)
88
        ) {
89
            $statusText = $this->statusTexts[$statusCode];
90
        }
91
92
        $this->statusCode = (int) $statusCode;
93
        $this->statusText = (string) $statusText;
94
    }
95
96
    /**
97
     * Returns the HTTP status code
98
     * @return int
99
     */
100
    public function getStatusCode()
101
    {
102
        return $this->statusCode;
103
    }
104
105
    /**
106
     * Adds a header with the given name.
107
     *
108
     * @param  string $name
109
     * @param  string $value
110
     * @return void
111
     */
112
    public function addHeader($name, $value)
113
    {
114
        $this->headers[$name][] = (string) $value;
115
    }
116
117
    /**
118
     * Sets a new header for the given name.
119
     *
120
     * Replaces all headers with the same names.
121
     *
122
     * @param  string $name
123
     * @param  string $value
124
     * @return void
125
     */
126
    public function setHeader($name, $value)
127
    {
128
        $this->headers[$name] = [
129
            (string) $value,
130
        ];
131
    }
132
133
    /**
134
     * Returns an array with the HTTP headers.
135
     *
136
     * @return array
137
     */
138
    public function getHeaders()
139
    {
140
        $headers = array_merge(
141
            $this->getRequestLineHeaders(),
142
            $this->getStandardHeaders(),
143
            $this->getCookieHeaders()
144
        );
145
146
        return $headers;
147
    }
148
149
    /**
150
     * Adds a new cookie.
151
     *
152
     * @param  Cookie $cookie
153
     * @return void
154
     */
155
    public function addCookie(Cookie $cookie)
156
    {
157
        $this->cookies[$cookie->getName()] = $cookie;
158
    }
159
160
    /**
161
     * Deletes a cookie.
162
     *
163
     * @param  Cookie $cookie
164
     * @return void
165
     */
166
    public function deleteCookie(Cookie $cookie)
167
    {
168
        $cookie->setValue('');
169
        $cookie->setMaxAge(-1);
170
        $this->cookies[$cookie->getName()] = $cookie;
171
    }
172
173
    /**
174
     * Sets the body content.
175
     *
176
     * @param  string $content
177
     * @return void
178
     */
179
    public function setContent($content)
180
    {
181
        $this->content = (string) $content;
182
    }
183
184
    /**
185
     * Returns the body content.
186
     *
187
     * @return string
188
     */
189
    public function getContent()
190
    {
191
        return $this->content;
192
    }
193
194
    /**
195
     * Sets the headers for a redirect.
196
     *
197
     * @param  string $url
198
     * @return void
199
     */
200
    public function redirect($url)
201
    {
202
        $this->setHeader('Location', $url);
203
        $this->setStatusCode(301);
204
    }
205
    
206
    /**
207
     * Sends the headers and content
208
     *
209
     * @codeCoverageIgnore This function can not be tested because it uses native php functions
210
     * @return void
211
     */
212
    public function send() 
213
    {
214
        foreach ($response->getHeaders() as $header) {
0 ignored issues
show
Bug introduced by
The variable $response does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
215
            header($header);
216
        }
217
218
        echo $response->getContent();
219
    }
220
221
    private function getRequestLineHeaders()
222
    {
223
        $headers = [];
224
225
        $requestLine = sprintf(
226
            'HTTP/%s %s %s',
227
            $this->version,
228
            $this->statusCode,
229
            $this->statusText
230
        );
231
232
        $headers[] = trim($requestLine);
233
234
        return $headers;
235
    }
236
237
    private function getStandardHeaders()
238
    {
239
        $headers = [];
240
241
        foreach ($this->headers as $name => $values) {
242
            foreach ($values as $value) {
243
                $headers[] = "$name: $value";
244
            }
245
        }
246
247
        return $headers;
248
    }
249
250
    private function getCookieHeaders()
251
    {
252
        $headers = [];
253
254
        foreach ($this->cookies as $cookie) {
255
            $headers[] = 'Set-Cookie: ' . $cookie->getHeaderString();
256
        }
257
258
        return $headers;
259
    }
260
}
261