Completed
Push — master ( 1d50a1...cf5ce4 )
by Frederik
01:57
created

OptimalEncodedHeaderValue::__construct()   B

Complexity

Conditions 6
Paths 10

Size

Total Lines 31

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 21
CRAP Score 6.0033

Importance

Changes 0
Metric Value
dl 0
loc 31
ccs 21
cts 22
cp 0.9545
rs 8.8017
c 0
b 0
f 0
cc 6
nc 10
nop 2
crap 6.0033
1
<?php
2
declare(strict_types=1);
3
4
namespace Genkgo\Mail\Header;
5
6
use Genkgo\Mail\Stream\OptimalTransferEncodedPhraseStream;
7
use Genkgo\Mail\Stream\OptimalTransferEncodedTextStream;
8
9
final class OptimalEncodedHeaderValue
10
{
11
    private const FOLDING = "\r\n ";
12
13
    /**
14
     * @var string
15
     */
16
    private $encoded;
17
18
    /**
19
     * @var string
20
     */
21
    private $encoding = '7bit';
22
23
    /**
24
     * @param string $value
25
     * @param bool $phrase
26
     */
27 148
    public function __construct(string $value, bool $phrase = false)
28
    {
29 148
        if ($phrase === true) {
30 51
            $encoded = new OptimalTransferEncodedPhraseStream($value, 68, self::FOLDING);
31
32 51
            $this->encoding = $encoded->getMetadata(['transfer-encoding'])['transfer-encoding'];
33
        } else {
34 120
            $encoded = new OptimalTransferEncodedTextStream($value, 68, self::FOLDING);
35
36 120
            $this->encoding = $encoded->getMetadata(['transfer-encoding'])['transfer-encoding'];
37
        }
38
39 148
        switch ($this->encoding) {
40 148
            case '7bit':
41 11
            case '8bit':
42 140
                $this->encoded = (string) $encoded;
43 140
                break;
44 11
            case 'base64':
45 8
                $this->encoded = \sprintf('=?%s?B?%s?=', 'UTF-8', (string) $encoded);
46 8
                break;
47 3
            case 'quoted-printable':
48 3
                $this->encoded = \str_replace(
49 3
                    self::FOLDING,
50 3
                    '?=' . self::FOLDING . '=?UTF-8?Q?',
51 3
                    \sprintf('=?%s?Q?%s?=', 'UTF-8', (string) $encoded)
52
                );
53 3
                break;
54
            default:
55
                throw new \UnexpectedValueException('Unknown encoding ' . $this->encoding);
56
        }
57 148
    }
58
59
    /**
60
     * @return string
61
     */
62 148
    public function __toString(): string
63
    {
64 148
        return $this->encoded;
65
    }
66
67
    /**
68
     * @return string
69
     */
70 42
    public function getEncoding(): string
71
    {
72 42
        return $this->encoding;
73
    }
74
75
    /**
76
     * @param string $value
77
     * @return OptimalEncodedHeaderValue
78
     */
79 51
    public static function forPhrase(string $value): self
80
    {
81 51
        return new self($value, true);
82
    }
83
}
84