Completed
Push — master ( 5b2039...ff2518 )
by Marcel
06:16
created

MessageSerializer::headers()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 18
ccs 11
cts 11
cp 1
rs 9.4285
cc 3
eloc 10
nc 3
nop 1
crap 3
1
<?php
2
3
namespace UMA\Psr7Hmac\Internal;
4
5
use Psr\Http\Message\MessageInterface;
6
use Psr\Http\Message\RequestInterface;
7
use Psr\Http\Message\ResponseInterface;
8
9
final class MessageSerializer
10
{
11
    const SP = ' ';
12
    const CRLF = "\r\n";
13
14
    /**
15
     * Returns the string representation of an HTTP message.
16
     *
17
     * @param MessageInterface $message Message to convert to a string.
18
     *
19
     * @return string
20
     *
21
     * @throws \InvalidArgumentException When $message is neither an implementation
22
     *                                   of RequestInterface nor ResponseInterface.
23
     */
24 169
    public static function serialize(MessageInterface $message)
25
    {
26 169
        return self::startLine($message).self::headers($message).self::CRLF.$message->getBody();
27
    }
28
29 169
    private static function startLine(MessageInterface $message)
30
    {
31 169
        if ($message instanceof RequestInterface) {
32 112
            return self::requestLine($message);
33 57
        } elseif ($message instanceof ResponseInterface) {
34 56
            return self::statusLine($message);
35
        } else {
36 1
            throw new \InvalidArgumentException('Unknown message type');
37
        }
38
    }
39
40 168
    private static function headers(MessageInterface $message)
41
    {
42 168
        $headers = array_change_key_case($message->getHeaders(), CASE_LOWER);
43
44 168
        unset($headers['host']);
45
46 168
        ksort($headers);
47
48 168
        $msg = '';
49 168
        foreach ($headers as $name => $values) {
50 154
            $values = is_array($values) ?
51 154
                $values : [$values];
52
53 154
            $msg .= mb_strtolower($name).':'.self::SP.implode(',', $values).self::CRLF;
54 168
        }
55
56 168
        return $msg;
57
    }
58
59 112
    private static function requestLine(RequestInterface $request)
60
    {
61 112
        $method = $request->getMethod();
62 112
        $target = self::fixTarget(trim($request->getRequestTarget()));
63 112
        $protocol = 'HTTP/'.$request->getProtocolVersion();
64 112
        $host = $request->getUri()->getHost();
65
66 112
        return $method.self::SP.$target.self::SP.$protocol.self::CRLF."host: $host".self::CRLF;
67
    }
68
69 56
    private static function statusLine(ResponseInterface $response)
70
    {
71 56
        $protocol = 'HTTP/'.$response->getProtocolVersion();
72 56
        $statusCode = $response->getStatusCode();
73 56
        $reasonPhrase = $response->getReasonPhrase();
74
75 56
        return $protocol.self::SP.$statusCode.self::SP.$reasonPhrase.self::CRLF;
76
    }
77
78 112
    private static function fixTarget($target)
79
    {
80 112
        if (!array_key_exists('query', $parsedTarget = parse_url($target))) {
81 98
            return $target;
82
        }
83
84 14
        parse_str($parsedTarget['query'], $query);
85
86 14
        ksort($query);
87
88 14
        return $parsedTarget['path'].'?'.http_build_query($query);
89
    }
90
}
91