Completed
Pull Request — master (#94)
by
unknown
11:19
created

CurlCommandFormatter::formatRequest()   D

Complexity

Conditions 9
Paths 63

Size

Total Lines 40
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 27
CRAP Score 9.1738

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 40
ccs 27
cts 31
cp 0.871
rs 4.909
cc 9
eloc 26
nc 63
nop 1
crap 9.1738
1
<?php
2
3
namespace Http\Message\Formatter;
4
5
use Http\Message\Formatter;
6
use Psr\Http\Message\RequestInterface;
7
use Psr\Http\Message\ResponseInterface;
8
9
/**
10
 * A formatter that prints a cURL command for HTTP requests.
11
 *
12
 * @author Tobias Nyholm <[email protected]>
13
 */
14
class CurlCommandFormatter implements Formatter
15
{
16
    /**
17
     * {@inheritdoc}
18
     */
19 5
    public function formatRequest(RequestInterface $request)
20
    {
21 5
        $command = sprintf('curl %s', escapeshellarg((string) $request->getUri()->withFragment('')));
22 5
        if ('1.0' === $request->getProtocolVersion()) {
23
            $command .= ' --http1.0';
24 5
        } elseif ('2.0' === $request->getProtocolVersion()) {
25 1
            $command .= ' --http2';
26 1
        }
27
28 5
        $method = strtoupper($request->getMethod());
29 5
        if ('HEAD' === $method) {
30
            $command .= ' --head';
31 5
        } elseif ('GET' !== $method) {
32 3
            $command .= ' --request '.$method;
33 3
        }
34
35 5
        $command .= $this->getHeadersAsCommandOptions($request);
36
37 5
        $body = $request->getBody();
38 5
        if ($body->getSize() > 0) {
39 3
            if ($body->isSeekable()) {
40 2
                $data = $body->__toString();
41 2
                $body->rewind();
42 2
                if (preg_match('/[\x00-\x1F\x7F]/', $data)) {
43 1
                    $data = '[binary stream omitted]';
44 1
                }
45 2
            } else {
46 1
                $data = '[non-seekable stream omitted]';
47
            }
48
            
49 3
            $escapedData = @escapeshellarg($data);
50 3
            if (empty($escapedData)) {
51
                $escapedData = 'We couldn\'t not escape the data properly';
52
            }
53
54 3
            $command .= sprintf(' --data %s', $escapedData);
55 3
        }
56
57 5
        return $command;
58
    }
59
60
    /**
61
     * {@inheritdoc}
62
     */
63 1
    public function formatResponse(ResponseInterface $response)
64
    {
65 1
        return '';
66
    }
67
68
    /**
69
     * @param RequestInterface $request
70
     *
71
     * @return string
72
     */
73 5
    private function getHeadersAsCommandOptions(RequestInterface $request)
74
    {
75 5
        $command = '';
76 5
        foreach ($request->getHeaders() as $name => $values) {
77 2
            if ('host' === strtolower($name) && $values[0] === $request->getUri()->getHost()) {
78
                continue;
79
            }
80
81 2
            if ('user-agent' === strtolower($name)) {
82 1
                $command .= sprintf(' -A %s', escapeshellarg($values[0]));
83
84 1
                continue;
85
            }
86
87 1
            $command .= sprintf(' -H %s', escapeshellarg($name.': '.$request->getHeaderLine($name)));
88 5
        }
89
90 5
        return $command;
91
    }
92
}
93