• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mlocati / PayWay / 5212705470

pending completion
5212705470

push

github

mlocati
Initial version

1803 of 1803 new or added lines in 47 files covered. (100.0%)

1313 of 1803 relevant lines covered (72.82%)

1.53 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/Http/Driver/Curl.php
1
<?php
2

3
namespace MLocati\PayWay\Http\Driver;
4

5
use MLocati\PayWay\Exception\NetworkUnavailable;
6
use MLocati\PayWay\Http\Driver;
7
use MLocati\PayWay\Http\Response;
8

9
class Curl implements Driver
10
{
11
    /**
12
     * {@inheritdoc}
13
     *
14
     * @see \MLocati\PayWay\Http\Driver::send()
15
     */
16
    public function send($url, $method, array $headers, $body = '')
17
    {
18
        $ch = function_exists('curl_init') ? curl_init() : '';
×
19
        if (!$ch) {
×
20
            throw new NetworkUnavailable('curl_init() failed');
×
21
        }
22
        try {
23
            $responseHeaders = [];
×
24
            $options = [
×
25
                CURLOPT_URL => $url,
×
26
                CURLOPT_FOLLOWLOCATION => true,
×
27
                CURLOPT_RETURNTRANSFER => true,
×
28
                CURLOPT_HEADERFUNCTION => function ($ch, $header) use (&$responseHeaders) {
×
29
                    $this->collectHeader($header, $responseHeaders);
×
30

31
                    return strlen($header);
×
32
                },
×
33
            ];
×
34
            $method = strtoupper($method);
×
35
            switch ($method) {
36
                case 'GET':
×
37
                    $options[CURLOPT_HTTPGET] = true;
×
38
                    break;
×
39
                case 'POST':
×
40
                    $options[CURLOPT_POST] = true;
×
41
                    break;
×
42
                case 'PUT':
×
43
                    $options[CURLOPT_PUT] = true;
×
44
                    break;
×
45
                case 'HEAD':
×
46
                    $options[CURLOPT_NOBODY] = true;
×
47
                    break;
×
48
                default:
49
                    $options[CURLOPT_CUSTOMREQUEST] = $method;
×
50
                    break;
×
51
            }
52
            $body = (string) $body;
×
53
            if ($body !== '') {
×
54
                $options[CURLOPT_POSTFIELDS] = $body;
×
55
            }
56
            $serializedHeaders = $this->serializeHeaders($headers);
×
57
            if ($serializedHeaders !== []) {
×
58
                $options[CURLOPT_HTTPHEADER] = $serializedHeaders;
×
59
            }
60
            if (!curl_setopt_array($ch, $options)) {
×
61
                throw new NetworkUnavailable($this->describeCurlError($ch, 'curl_setopt_array() failed: %s'));
×
62
            }
63
            $responseBody = curl_exec($ch);
×
64
            if ($responseBody === false) {
×
65
                throw new NetworkUnavailable($this->describeCurlError($ch, 'curl_exec() failed: %s'));
×
66
            }
67
            $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
×
68
        } finally {
69
            curl_close($ch);
×
70
        }
71

72
        return new Response($responseCode, $responseHeaders, $responseBody);
×
73
    }
74

75
    /**
76
     * @return string[]
77
     */
78
    protected function serializeHeaders(array $headers)
79
    {
80
        $result = [];
×
81
        foreach ($headers as $key => $value) {
×
82
            if (is_array($value)) {
×
83
                foreach ($value as $item) {
×
84
                    $result[] = "{$key}: {$item}";
×
85
                }
86
            } else {
87
                $result[] = "{$key}: {$value}";
×
88
            }
89
        }
90

91
        return $result;
×
92
    }
93

94
    /**
95
     * @param string $header
96
     */
97
    protected function collectHeader($header, array &$responseHeaders)
98
    {
99
        $match = null;
×
100
        $header = trim($header);
×
101
        if ($header === '') {
×
102
            return;
×
103
        }
104
        if (preg_match('/^(?<name>[^:]*?)\s*:\s*(?<value>.*)$/', $header, $match)) {
×
105
            $name = $match['name'];
×
106
            $value = $match['value'];
×
107
        } else {
108
            $name = $header;
×
109
            $value = '';
×
110
        }
111
        foreach (array_keys($responseHeaders) as $alreadyName) {
×
112
            if (strcasecmp($alreadyName, $name) === 0) {
×
113
                if (is_string($responseHeaders[$alreadyName])) {
×
114
                    $responseHeaders[$alreadyName] = [$responseHeaders[$alreadyName], $value];
×
115
                } else {
116
                    $responseHeaders[$alreadyName][] = $value;
×
117
                }
118
                break;
×
119
            }
120
        }
121
        $responseHeaders[$name] = $value;
×
122
    }
123

124
    /**
125
     * @param resource|\CurlHandle $ch
126
     * @param string $messagePattern
127
     */
128
    protected function describeCurlError($ch, $messagePattern)
129
    {
130
        $errorMessage = curl_error($ch);
×
131
        $errorMessage = is_string($errorMessage) ? trim($errorMessage) : '';
×
132
        if ($errorMessage === '') {
×
133
            $errorCode = curl_errno($ch);
×
134
            if (!empty($errorCode)) {
×
135
                $errorMessage = "cURL error #{$errorCode}";
×
136
            }
137
        }
138
        if ($errorMessage === '') {
×
139
            $errorMessage = 'unknows error';
×
140
        }
141

142
        return sprintf($messagePattern, $errorMessage);
×
143
    }
144
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc