Passed
Push — master ( c01c31...d9cbe6 )
by Radu
01:46
created

HttpResponse::setHeader()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
nc 2
nop 2
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
1
<?php
2
namespace WebServCo\Framework;
3
4
use WebServCo\Framework\Http;
5
use WebServCo\Framework\Libraries\Request;
6
7
final class HttpResponse extends \WebServCo\Framework\AbstractResponse implements
8
    \WebServCo\Framework\Interfaces\ResponseInterface
9
{
10
    protected $statusText;
11
    protected $headers;
12
    protected $charset;
13
14
    public function __construct($content = null, $statusCode = 200, $headers = [])
15
    {
16
        $this->setStatus($statusCode);
17
18
        $this->charset = 'utf-8';
19
20
        foreach ($headers as $name => $value) {
21
            $this->setHeader($name, $value);
22
        }
23
24
        $this->setContent($content);
25
    }
26
27
    public function setStatus($statusCode)
28
    {
29
        if (!isset(Http::$statusCodes[$statusCode])) {
30
                throw new \WebServCo\Framework\Exceptions\ApplicationException(
31
                    sprintf('Invalid HTTP status code: %s', $statusCode)
32
                );
33
        }
34
        $this->statusCode = $statusCode;
35
        $this->statusText = Http::$statusCodes[$statusCode];
36
    }
37
38
    public function setHeader($name, $value)
39
    {
40
        switch ($name) {
41
            case 'Content-Type':
42
                $this->headers[$name] = $value . '; charset=' . $this->charset;
43
                break;
44
            default:
45
                $this->headers[$name] = $value;
46
        }
47
    }
48
49
    public function send(Request $request)
50
    {
51
        $this->sendHeaders($request);
52
        $this->sendContent();
53
        return $this->statusCode;
54
    }
55
56
    protected function sendHeaders(Request $request)
57
    {
58
        foreach ($this->headers as $name => $value) {
59
            header(
60
                sprintf('%s: %s', $name, $value),
61
                true,
62
                $this->statusCode
63
            );
64
        }
65
66
        $contentLength = strlen($this->content);
67
        header(
68
            sprintf('Content-length: %s', $contentLength),
69
            true,
70
            $this->statusCode
71
        );
72
73
        $serverProtocol = $request->getServerProtocol();
74
        if (!empty($serverProtocol)) {
75
            header(
76
                sprintf(
77
                    '%s %s %s',
78
                    $serverProtocol,
79
                    $this->statusCode,
80
                    $this->statusText
81
                ),
82
                true,
83
                $this->statusCode
84
            );
85
        }
86
    }
87
88
    protected function sendContent()
89
    {
90
        echo $this->content;
91
    }
92
}
93