Passed
Push — master ( 169a1f...656146 )
by Radu
01:25
created

HttpResponse::getHeaders()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
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 getHeaders()
28
    {
29
        return $this->headers;
30
    }
31
32
    public function setStatus($statusCode)
33
    {
34
        if (!isset(Http::$statusCodes[$statusCode])) {
35
                throw new \WebServCo\Framework\Exceptions\ApplicationException(
36
                    sprintf('Invalid HTTP status code: %s', $statusCode)
37
                );
38
        }
39
        $this->statusCode = $statusCode;
40
        $this->statusText = Http::$statusCodes[$statusCode];
41
    }
42
43
    public function setHeader($name, $value)
44
    {
45
        switch ($name) {
46
            case 'Content-Type':
47
                $this->headers[$name] = $value . '; charset=' . $this->charset;
48
                break;
49
            default:
50
                $this->headers[$name] = $value;
51
                break;
52
        }
53
    }
54
55
    public function send(Request $request)
56
    {
57
        $this->sendHeaders($request);
58
        $this->sendContent();
59
        return $this->statusCode;
60
    }
61
62
    protected function sendHeader($name, $value, $statusCode)
63
    {
64
        header(
65
            sprintf('%s: %s', $name, $value),
66
            true,
67
            $statusCode
68
        );
69
        return true;
70
    }
71
72
    protected function sendHeaders(Request $request)
73
    {
74
        foreach ($this->headers as $name => $value) {
75
            if (is_array($value)) {
76
                foreach ($value as $item) {
77
                    $this->sendHeader($name, $item, $this->statusCode);
78
                }
79
            } else {
80
                $this->sendHeader($name, $value, $this->statusCode);
81
            }
82
        }
83
84
        $this->sendHeader('Content-length', strlen($this->content), $this->statusCode);
85
86
        $serverProtocol = $request->getServerProtocol();
87
        if (!empty($serverProtocol)) {
88
            header(
89
                sprintf(
90
                    '%s %s %s',
91
                    $serverProtocol,
92
                    $this->statusCode,
93
                    $this->statusText
94
                ),
95
                true,
96
                $this->statusCode
97
            );
98
        }
99
    }
100
101
    protected function sendContent()
102
    {
103
        echo $this->content;
104
    }
105
}
106