blob: 0dc63526b23292bf40c07f60c24ef17ffacd7057 [file] [log] [blame]
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01001<?php
2
3declare(strict_types=1);
4
5namespace Ddeboer\Imap\Message;
6
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01007final class Headers extends Parameters
8{
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01009 public function __construct(\stdClass $headers)
10 {
11 parent::__construct();
12
13 // Store all headers as lowercase
14 $headers = \array_change_key_case((array) $headers);
15
16 foreach ($headers as $key => $value) {
17 $this[$key] = $this->parseHeader($key, $value);
18 }
19 }
20
21 /**
22 * Get header.
23 *
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020024 * @return null|int|\stdClass[]|string
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010025 */
26 public function get(string $key)
27 {
28 return parent::get(\strtolower($key));
29 }
30
31 /**
32 * Parse header.
33 *
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020034 * @param int|\stdClass[]|string $value
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010035 *
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020036 * @return int|\stdClass[]|string
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010037 */
38 private function parseHeader(string $key, $value)
39 {
40 switch ($key) {
41 case 'msgno':
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020042 \assert(\is_string($value));
43
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010044 return (int) $value;
45 case 'from':
46 case 'to':
47 case 'cc':
48 case 'bcc':
49 case 'reply_to':
50 case 'sender':
51 case 'return_path':
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020052 \assert(\is_array($value));
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010053 /** @var \stdClass $address */
54 foreach ($value as $address) {
55 if (isset($address->mailbox)) {
56 $address->host = $address->host ?? null;
57 $address->personal = isset($address->personal) ? $this->decode($address->personal) : null;
58 }
59 }
60
61 return $value;
62 case 'date':
63 case 'subject':
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020064 \assert(\is_string($value));
65
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010066 return $this->decode($value);
67 }
68
69 return $value;
70 }
71}