PluginProbe
Gmail SMTP / trunk
Gmail SMTP vtrunk
1.2.3.21 1.2.3.20 trunk 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.9 1.2.0 1.2.3.14 1.2.3.15 1.2.3.16 1.2.3.18 1.2.3.5
gmail-smtp / google-api-php-client / vendor / guzzlehttp / guzzle / src / Handler / CurlVersion.php

CurlVersion.php in Gmail SMTP trunk, at google-api-php-client/vendor/guzzlehttp/guzzle/src/Handler/CurlVersion.php

162 lines 5.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace GuzzleHttp\Handler;
4
5 /**
6 * @internal
7 */
8 final class CurlVersion
9 {
10 private const MIN_VERSION = '7.21.2';
11
12 private const TLS_12_VERSION = '7.34.0';
13
14 private const TLS_13_VERSION = '7.52.0';
15
16 // curl 7.52.0 introduced HTTPS proxy support, advertised by a feature bit
17 // (a build can meet the version yet lack the feature). Earlier libcurl
18 // mishandles an https:// proxy: before 7.50.2 it silently downgrades to a
19 // plaintext HTTP proxy, and 7.50.2 through 7.51 reject it at connect time.
20 private const HTTPS_PROXY_VERSION = '7.52.0';
21
22 private const HANDLER_SHARING_VERSION = '7.35.0';
23
24 private const SSL_SESSION_SHARING_VERSION = '8.6.0';
25
26 /**
27 * @var array{version: string, features: int}|false|null
28 */
29 private static $versionInfo;
30
31 private function __construct()
32 {
33 }
34
35 public static function supportsCurlHandler(): bool
36 {
37 $version = self::getVersion();
38
39 return $version !== null && \version_compare($version, self::MIN_VERSION, '>=');
40 }
41
42 public static function supportsTls12(): bool
43 {
44 $version = self::getVersion();
45
46 return self::supportsSsl()
47 && \defined('CURL_SSLVERSION_TLSv1_2')
48 && $version !== null
49 && \version_compare($version, self::TLS_12_VERSION, '>=');
50 }
51
52 public static function supportsTls13(): bool
53 {
54 $version = self::getVersion();
55
56 return self::supportsSsl()
57 && \defined('CURL_SSLVERSION_TLSv1_3')
58 && $version !== null
59 && \version_compare($version, self::TLS_13_VERSION, '>=');
60 }
61
62 public static function supportsHttp2(): bool
63 {
64 $versionInfo = self::getVersionInfo();
65
66 return self::supportsTls12()
67 && \defined('CURL_VERSION_HTTP2')
68 && $versionInfo !== null
69 && 0 !== (\CURL_VERSION_HTTP2 & $versionInfo['features']);
70 }
71
72 public static function supportsHttpsProxy(): bool
73 {
74 $versionInfo = self::getVersionInfo();
75
76 // CURL_VERSION_HTTPS_PROXY is not defined on every supported PHP
77 // version; fall back to the curl.h bit value.
78 $httpsProxyFeature = \defined('CURL_VERSION_HTTPS_PROXY') ? \CURL_VERSION_HTTPS_PROXY : (1 << 21);
79
80 return $versionInfo !== null
81 && \version_compare($versionInfo['version'], self::HTTPS_PROXY_VERSION, '>=')
82 && 0 !== ($httpsProxyFeature & $versionInfo['features']);
83 }
84
85 public static function supportsHandlerSharing(): bool
86 {
87 $version = self::getVersion();
88
89 return $version !== null && \version_compare($version, self::HANDLER_SHARING_VERSION, '>=');
90 }
91
92 public static function ensureHandlerSharingSupported(): void
93 {
94 if (!self::supportsHandlerSharing()) {
95 throw new \InvalidArgumentException(\sprintf(
96 'The "transport_sharing" option requires libcurl %s or higher for cURL share handles.',
97 self::HANDLER_SHARING_VERSION
98 ));
99 }
100 }
101
102 public static function supportsSslSessionSharing(): bool
103 {
104 $version = self::getVersion();
105
106 return self::supportsSsl()
107 && $version !== null
108 && \version_compare($version, self::SSL_SESSION_SHARING_VERSION, '>=');
109 }
110
111 public static function ensureSslSessionSharingSupported(): void
112 {
113 if (!self::supportsSslSessionSharing()) {
114 throw new \InvalidArgumentException(\sprintf(
115 'The "transport_sharing" option requires libcurl %s or higher with SSL support for SSL session sharing.',
116 self::SSL_SESSION_SHARING_VERSION
117 ));
118 }
119 }
120
121 private static function supportsSsl(): bool
122 {
123 $versionInfo = self::getVersionInfo();
124
125 return \defined('CURL_VERSION_SSL')
126 && $versionInfo !== null
127 && 0 !== (\CURL_VERSION_SSL & $versionInfo['features']);
128 }
129
130 public static function getVersion(): ?string
131 {
132 $versionInfo = self::getVersionInfo();
133
134 return $versionInfo === null ? null : $versionInfo['version'];
135 }
136
137 /**
138 * @return array{version: string, features: int}|null
139 */
140 private static function getVersionInfo(): ?array
141 {
142 if (self::$versionInfo === null) {
143 if (!\function_exists('curl_version')) {
144 self::$versionInfo = false;
145 } else {
146 $versionInfo = \curl_version();
147 self::$versionInfo = \is_array($versionInfo)
148 && isset($versionInfo['version'], $versionInfo['features'])
149 && \is_string($versionInfo['version'])
150 && \is_int($versionInfo['features'])
151 ? [
152 'version' => $versionInfo['version'],
153 'features' => $versionInfo['features'],
154 ]
155 : false;
156 }
157 }
158
159 return self::$versionInfo === false ? null : self::$versionInfo;
160 }
161 }
162