FullHttpMessageFormatter::addBody()   A
last analyzed

Complexity

Conditions 5
Paths 4

Size

Total Lines 22
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 5

Importance

Changes 5
Bugs 1 Features 0
Metric Value
cc 5
eloc 11
c 5
b 1
f 0
nc 4
nop 2
dl 0
loc 22
ccs 9
cts 9
cp 1
crap 5
rs 9.6111
1
<?php
2
3
namespace Http\Message\Formatter;
4
5
use Http\Message\Formatter;
6
use Psr\Http\Message\MessageInterface;
7
use Psr\Http\Message\RequestInterface;
8
use Psr\Http\Message\ResponseInterface;
9
10
/**
11
 * A formatter that prints the complete HTTP message.
12
 *
13
 * @author Tobias Nyholm <[email protected]>
14
 */
15
class FullHttpMessageFormatter implements Formatter
16
{
17
    /**
18
     * The maximum length of the body.
19
     *
20
     * @var int|null
21
     */
22
    private $maxBodyLength;
23
24
    /**
25
     * @param int|null $maxBodyLength
26
     */
27 10
    public function __construct($maxBodyLength = 1000)
28
    {
29 10
        $this->maxBodyLength = $maxBodyLength;
30 10
    }
31
32
    /**
33
     * {@inheritdoc}
34
     */
35 4
    public function formatRequest(RequestInterface $request)
36
    {
37 4
        $message = sprintf(
38 4
            "%s %s HTTP/%s\n",
39 4
            $request->getMethod(),
40 4
            $request->getRequestTarget(),
41 4
            $request->getProtocolVersion()
42
        );
43
44 4
        foreach ($request->getHeaders() as $name => $values) {
45 4
            $message .= $name.': '.implode(', ', $values)."\n";
46
        }
47
48 4
        return $this->addBody($request, $message);
49
    }
50
51
    /**
52
     * {@inheritdoc}
53
     */
54 4
    public function formatResponse(ResponseInterface $response)
55
    {
56 4
        $message = sprintf(
57 4
            "HTTP/%s %s %s\n",
58 4
            $response->getProtocolVersion(),
59 4
            $response->getStatusCode(),
60 4
            $response->getReasonPhrase()
61
        );
62
63 4
        foreach ($response->getHeaders() as $name => $values) {
64 4
            $message .= $name.': '.implode(', ', $values)."\n";
65
        }
66
67 4
        return $this->addBody($response, $message);
68
    }
69
70
    /**
71
     * Add the message body if the stream is seekable.
72
     *
73
     * @param string $message
74
     *
75
     * @return string
76
     */
77
    private function addBody(MessageInterface $request, $message)
78 8
    {
79
        $message .= "\n";
80 8
        $stream = $request->getBody();
81 8
        if (!$stream->isSeekable() || 0 === $this->maxBodyLength) {
82
            // Do not read the stream
83 4
            return $message;
84
        }
85
86 4
        $data = $stream->__toString();
87 2
        $stream->rewind();
88
89 2
        // all non-printable ASCII characters and <DEL> except for \t, \r, \n
90
        if (preg_match('/([\x00-\x09\x0C\x0E-\x1F\x7F])/', $data)) {
91
            return $message.'[binary stream omitted]';
92 4
        }
93
94 4
        if (null === $this->maxBodyLength) {
95
            return $message.$data;
96
        }
97
98
        return $message.mb_substr($data, 0, $this->maxBodyLength);
99
    }
100
}
101