1: <?php
2:
3: namespace PHPixie\HTTP\Responses;
4:
5: use PHPixie\HTTP\Context;
6: use PHPixie\HTTP\Data\Headers;
7: use PHPixie\HTTP\Messages;
8: use Psr\Http\Message\ResponseInterface;
9: use Psr\Http\Message\StreamInterface;
10:
11: /**
12: * HTTP response representation
13: */
14: class Response
15: {
16: /**
17: * @var Messages
18: */
19: protected $messages;
20:
21: /**
22: * @var Headers
23: */
24: protected $headers;
25:
26: /**
27: * @var int
28: */
29: protected $statusCode = 200;
30:
31: /**
32: * @var string
33: */
34: protected $reasonPhrase;
35:
36: /**
37: * @var StreamInterface
38: */
39: protected $body;
40:
41: /**
42: * Constructor
43: * @param Messages $messages
44: * @param Headers $headers
45: * @param StreamInterface $body
46: * @param int $statusCode
47: * @param string $reasonPhrase
48: */
49: public function __construct($messages, $headers, $body, $statusCode = 200, $reasonPhrase = null)
50: {
51: $this->messages = $messages;
52: $this->headers = $headers;
53: $this->body = $body;
54: $this->statusCode = $statusCode;
55: $this->reasonPhrase = $reasonPhrase;
56: }
57:
58: /**
59: * Headers
60: * @return Headers
61: */
62: public function headers()
63: {
64: return $this->headers;
65: }
66:
67: /**
68: * Body stream
69: * @return StreamInterface
70: */
71: public function body()
72: {
73: return $this->body;
74: }
75:
76: /**
77: * Status code
78: * @return int
79: */
80: public function statusCode()
81: {
82: return $this->statusCode;
83: }
84:
85: /**
86: * Status phrase
87: * @return string|null
88: */
89: public function reasonPhrase()
90: {
91: return $this->reasonPhrase;
92: }
93:
94: /**
95: * Set status code and phrase
96: * @param int $code
97: * @param string|null $reasonPhrase
98: */
99: public function setStatus($code, $reasonPhrase = null)
100: {
101: $this->statusCode = $code;
102: $this->reasonPhrase = $reasonPhrase;
103: }
104:
105: /**
106: * Get PSR-7 response representation
107: * @param Context|null $context HTTP context
108: * @return ResponseInterface
109: */
110: public function asResponseMessage($context = null)
111: {
112: return $this->messages->response(
113: '1.1',
114: $this->mergeContextHeaders($context),
115: $this->body,
116: $this->statusCode,
117: $this->reasonPhrase
118: );
119: }
120:
121: /**
122: * Merge headers from HTTP context
123: * @param Context $context
124: * @return array
125: */
126: protected function mergeContextHeaders($context)
127: {
128: $headers = $this->headers->asArray();
129:
130: if($context === null ) {
131: return $headers;
132: }
133:
134: $cookieUpdates = $context->cookies()->updates();
135: if(empty($cookieUpdates)) {
136: return $headers;
137: }
138:
139: $cookieHeaders = array();
140: foreach($cookieUpdates as $update) {
141: $cookieHeaders[] = $update->asHeader();
142: }
143:
144: foreach($headers as $name => $value) {
145: if(strtolower($name) === 'set-cookie') {
146: foreach($cookieHeaders as $header) {
147: $headers[$name][] = $header;
148: }
149: return $headers;
150: }
151: }
152:
153: $headers['Set-Cookie'] = $cookieHeaders;
154: return $headers;
155: }
156: }