Completed
Push — master ( 092247...6dd5e4 )
by Stéphane
06:20 queued 03:28
created

ResponseFactory::parseHeaders()   B

Complexity

Conditions 7
Paths 3

Size

Total Lines 21
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 7

Importance

Changes 2
Bugs 1 Features 0
Metric Value
c 2
b 1
f 0
dl 0
loc 21
ccs 12
cts 12
cp 1
rs 7.551
cc 7
eloc 12
nc 3
nop 2
crap 7
1
<?php
2
/**
3
 * This file is part of the bee4/transport package.
4
 * For the full copyright and license information, please view the LICENSE
5
 * file that was distributed with this source code.
6
 *
7
 * @copyright Bee4 2015
8
 * @author  Stephane HULARD <[email protected]>
9
 * @package Bee4\Transport\Message
10
 */
11
12
namespace Bee4\Transport\Message;
13
14
use Bee4\Transport\Handle\ExecutionInfos;
15
16
/**
17
 * Build a response from an Handle response
18
 * @package Bee4\Transport\Message
19
 */
20
class ResponseFactory
21
{
22
    /**
23
     * Build a new reponse object from handle execution result
24
     * @param  string                  $content Response content
25
     * @param  ExecutionInfos          $infos   Execution details
26
     * @param  Request\AbstractRequest $request
27
     * @return Response
28
     */
29
    public static function build(
30
        $content,
31
        ExecutionInfos $infos,
32
        Request\AbstractRequest $request
33
    ) {
34
        $response = new Response($request);
35
        $response->setStatus($infos->status);
36
        $response->setTransactionTime($infos->transactionTime);
37
        $response->setExecutionInfos($infos);
38
39
        //Populate request headers with all really sent headers
40
        if (!empty($infos->headers)) {
41
            self::parseHeaders(
42
                $infos->headers,
43
                $request
44
            );
45
        }
46
47
        //Headers are returned with content, so we extract it
48
        $content = self::parseHeaders($content, $response);
49
50
        $response->setBody($content);
51
52
        return $response;
53
    }
54
55
    /**
56
     * Parse headers from content and populate response with it
57
     * @param string $content
58
     * @param \Bee4\Transport\Message\AbstractMessage $message
59
     * @return string
60
     */
61 3
    public static function parseHeaders($content, AbstractMessage $message)
62
    {
63 3
        $namespace = explode('\\', get_class($message));
64 3
        $name = strtoupper(array_pop($namespace));
65
66 3
        if (strpos($content, 'HTTP/') === 0 || strpos($content, $name) === 0) {
67 3
            $line = self::nibbleLine($content);
68 3
            if (preg_match('/^HTTP\/[0-9]{1}\.[0-9]{1} (?P<code>[0-9]+) (?P<message>.*)$/', $line, $matches) &&
69 3
                $matches["code"] == "100"
70
            ) {
71 1
                self::nibbleLine($content);
72
            }
73 3
            while (($line = self::nibbleLine($content)) != "") {
74 3
                if (preg_match('/^([A-Za-z\-]+): (.*)/', $line, $matches)) {
75 3
                    $message->addHeader($matches[1], $matches[2]);
76
                }
77
            }
78
        }
79
80 3
        return $content;
81
    }
82
83
    /**
84
     * Read a line inside a string, remove the read line from the string and return the line
85
     * @param string $content
86
     * @param string $eol
87
     * @return string
88
     */
89 3
    private static function nibbleLine(&$content, $eol = "\r\n")
90
    {
91 3
        $line = substr($content, 0, strpos($content, $eol));
92 3
        $content = substr($content, strlen($line)+2);
93 3
        return $line;
94
    }
95
}
96