ResponseFactory::parseHeaders()   B
last analyzed

Complexity

Conditions 7
Paths 3

Size

Total Lines 21
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 17
CRAP Score 7

Importance

Changes 2
Bugs 1 Features 0
Metric Value
c 2
b 1
f 0
dl 0
loc 21
ccs 17
cts 17
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\HandleInterface;
15
16
/**
17
 * Build a response from cURL response
18
 * @package Bee4\Transport\Message
19
 */
20
class ResponseFactory
21
{
22
    /**
23
     * Build a new reponse object from cURL execution result
24
     * @param string $content Response content
25
     * @param Handle $handle Curl handle used to perform request which generate response
26
     * @param Request\AbstractRequest $request
27
     * @return Response
28
     */
29 10
    public static function build(
30
        $content,
31
        HandleInterface $handle,
32
        Request\AbstractRequest $request
33
    ) {
34 10
        $response = new Response($request);
35
36 10
        $response->setStatus($handle->getInfo('http_code'));
37 10
        $response->setTransactionTime($handle->getInfo('total_time'));
38
39
        //Populate request headers with all really sent headers
40 10
        if ($handle->hasInfo('request_header')) {
41 9
            self::parseHeaders(
42 9
                $handle->getInfo('request_header'),
43
                $request
44 9
            );
45 9
        }
46
47
        //Headers are returned with content, so we extract it
48 10
        $content = self::parseHeaders($content, $response);
49
50 10
        $response->setBody($content);
51
52 10
        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 13
    public static function parseHeaders($content, AbstractMessage $message)
62
    {
63 13
        $namespace = explode('\\', get_class($message));
64 13
        $name = strtoupper(array_pop($namespace));
65
66 13
        if (strpos($content, 'HTTP/') === 0 || strpos($content, $name) === 0) {
67 12
            $line = self::nibbleLine($content);
68 12
            if (preg_match('/^HTTP\/[0-9]{1}\.[0-9]{1} (?P<code>[0-9]+) (?P<message>.*)$/', $line, $matches) &&
69 12
                $matches["code"] == "100"
70 12
            ) {
71 1
                self::nibbleLine($content);
72 1
            }
73 12
            while (($line = self::nibbleLine($content)) != "") {
74 12
                if (preg_match('/^([A-Za-z\-]+): (.*)/', $line, $matches)) {
75 12
                    $message->addHeader($matches[1], $matches[2]);
76 12
                }
77 12
            }
78 12
        }
79
80 13
        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 12
    private static function nibbleLine(&$content, $eol = "\r\n")
90
    {
91 12
        $line = substr($content, 0, strpos($content, $eol));
92 12
        $content = substr($content, strlen($line)+2);
93 12
        return $line;
94
    }
95
}
96