Completed
Push — master ( d1aac8...7341fe )
by Dominik
03:00
created

AbstractMessage::getHeaderLine()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace Saxulum\HttpMessage;
4
5
use Psr\Http\Message\MessageInterface;
6
use Psr\Http\Message\StreamInterface;
7
8
abstract class AbstractMessage implements MessageInterface
9
{
10
    /**
11
     * @var string|null
12
     */
13
    protected $protocolVersion;
14
15
    const PROTOCOL_VERSION_1_0 = '1.0';
16
    const PROTOCOL_VERSION_1_1 = '1.1';
17
18
    /**
19
     * @var string[]|array
20
     */
21
    protected $headers;
22
23
    /**
24
     * @var StreamInterface
25
     */
26
    protected $body;
27
28
    /**
29
     * {@inheritdoc}
30
     */
31
    public function getProtocolVersion(): string
32
    {
33
        return (string) $this->protocolVersion;
34
    }
35
36
    /**
37
     * {@inheritdoc}
38
     */
39
    public function withProtocolVersion($version): self
40
    {
41
        return $this->with(['protocolVersion' => $version]);
42
    }
43
44
    /**
45
     * {@inheritdoc}
46
     */
47
    public function getHeaders(): array
48
    {
49
        return $this->headers;
50
    }
51
52
    /**
53
     * {@inheritdoc}
54
     */
55
    public function hasHeader($name): bool
56
    {
57
        return null !== $this->getOriginalHeaderName($name);
58
    }
59
60
    /**
61
     * {@inheritdoc}
62
     */
63
    public function getHeader($name): array
64
    {
65
        if (null === $originalHeaderName = $this->getOriginalHeaderName($name)) {
66
            return [];
67
        }
68
69
        return $this->headers[$originalHeaderName];
70
    }
71
72
    /**
73
     * {@inheritdoc}
74
     */
75
    public function getHeaderLine($name): string
76
    {
77
        return implode(',', $this->getHeader($name));
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83 View Code Duplication
    public function withHeader($name, $value): self
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
84
    {
85
        $originalHeaderName = $this->getOriginalHeaderName($name) ?? $name;
86
87
        $headers = $this->headers;
88
        $headers[$originalHeaderName] = $this->prepareHeader($value);
89
90
        return $this->with(['headers' => $headers]);
91
    }
92
93
    /**
94
     * {@inheritdoc}
95
     */
96 View Code Duplication
    public function withAddedHeader($name, $value)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
97
    {
98
        $originalHeaderName = $this->getOriginalHeaderName($name) ?? $name;
99
100
        $headers = $this->headers;
101
        $headers[$originalHeaderName] = $this->prepareHeader($value, $headers[$originalHeaderName] ?? []);
102
103
        return $this->with(['headers' => $headers]);
104
    }
105
106
    /**
107
     * {@inheritdoc}
108
     */
109
    public function withoutHeader($name)
110
    {
111
        $headers = $this->headers;
112
        if (null !== $originalHeaderName = $this->getOriginalHeaderName($name)) {
113
            unset($headers[$originalHeaderName]);
114
        }
115
116
        return $this->with(['headers' => $headers]);
117
    }
118
119
    /**
120
     * @return StreamInterface
121
     */
122
    public function getBody(): StreamInterface
123
    {
124
        return $this->body;
125
    }
126
127
    /**
128
     * {@inheritdoc}
129
     */
130
    public function withBody(StreamInterface $body)
131
    {
132
        return $this->with(['body' => $body]);
133
    }
134
135
    /**
136
     * @param array $parameters
137
     *
138
     * @return AbstractMessage
139
     */
140
    abstract protected function with(array $parameters);
141
142
    /**
143
     * @param string $name
144
     *
145
     * @return string|null
146
     */
147
    private function getOriginalHeaderName(string $name)
148
    {
149
        if ([] === $this->headers) {
150
            return null;
151
        }
152
153
        $lowerName = strtolower($name);
154
        foreach ($this->headers as $header => $values) {
155
            if ($lowerName === strtolower($header)) {
156
                return $header;
157
            }
158
        }
159
160
        return null;
161
    }
162
163
    /**
164
     * @param array|string $value
165
     * @param array        $originalValue
166
     *
167
     * @return array
168
     */
169
    private function prepareHeader($value, array $originalValue = []): array
170
    {
171
        return array_merge($originalValue, is_array($value) ? $value : [$value]);
172
    }
173
}
174