[ Index ] |
PHP Cross Reference of YOURLS |
[Summary view] [Print] [Text view]
1 <?php 2 3 declare(strict_types=1); 4 5 namespace MaxMind\WebService\Http; 6 7 use MaxMind\Exception\HttpException; 8 9 /** 10 * This class is for internal use only. Semantic versioning does not not apply. 11 * 12 * @internal 13 */ 14 class CurlRequest implements Request 15 { 16 /** 17 * @var \CurlHandle 18 */ 19 private $ch; 20 21 /** 22 * @var string 23 */ 24 private $url; 25 26 /** 27 * @var array 28 */ 29 private $options; 30 31 public function __construct(string $url, array $options) 32 { 33 $this->url = $url; 34 $this->options = $options; 35 $this->ch = $options['curlHandle']; 36 } 37 38 /** 39 * @throws HttpException 40 */ 41 public function post(string $body): array 42 { 43 $curl = $this->createCurl(); 44 45 curl_setopt($curl, \CURLOPT_POST, true); 46 curl_setopt($curl, \CURLOPT_POSTFIELDS, $body); 47 48 return $this->execute($curl); 49 } 50 51 public function get(): array 52 { 53 $curl = $this->createCurl(); 54 55 curl_setopt($curl, \CURLOPT_HTTPGET, true); 56 57 return $this->execute($curl); 58 } 59 60 /** 61 * @return \CurlHandle 62 */ 63 private function createCurl() 64 { 65 curl_reset($this->ch); 66 67 $opts = []; 68 $opts[\CURLOPT_URL] = $this->url; 69 70 if (!empty($this->options['caBundle'])) { 71 $opts[\CURLOPT_CAINFO] = $this->options['caBundle']; 72 } 73 74 $opts[\CURLOPT_ENCODING] = ''; 75 $opts[\CURLOPT_SSL_VERIFYHOST] = 2; 76 $opts[\CURLOPT_FOLLOWLOCATION] = false; 77 $opts[\CURLOPT_SSL_VERIFYPEER] = true; 78 $opts[\CURLOPT_RETURNTRANSFER] = true; 79 80 $opts[\CURLOPT_HTTPHEADER] = $this->options['headers']; 81 $opts[\CURLOPT_USERAGENT] = $this->options['userAgent']; 82 $opts[\CURLOPT_PROXY] = $this->options['proxy']; 83 84 // The defined()s are here as the *_MS opts are not available on older 85 // cURL versions 86 $connectTimeout = $this->options['connectTimeout']; 87 if (\defined('CURLOPT_CONNECTTIMEOUT_MS')) { 88 $opts[\CURLOPT_CONNECTTIMEOUT_MS] = ceil($connectTimeout * 1000); 89 } else { 90 $opts[\CURLOPT_CONNECTTIMEOUT] = ceil($connectTimeout); 91 } 92 93 $timeout = $this->options['timeout']; 94 if (\defined('CURLOPT_TIMEOUT_MS')) { 95 $opts[\CURLOPT_TIMEOUT_MS] = ceil($timeout * 1000); 96 } else { 97 $opts[\CURLOPT_TIMEOUT] = ceil($timeout); 98 } 99 100 curl_setopt_array($this->ch, $opts); 101 102 return $this->ch; 103 } 104 105 /** 106 * @param \CurlHandle $curl 107 * 108 * @throws HttpException 109 */ 110 private function execute($curl): array 111 { 112 $body = curl_exec($curl); 113 if ($errno = curl_errno($curl)) { 114 $errorMessage = curl_error($curl); 115 116 throw new HttpException( 117 "cURL error ({$errno}): {$errorMessage}", 118 0, 119 $this->url 120 ); 121 } 122 123 $statusCode = curl_getinfo($curl, \CURLINFO_HTTP_CODE); 124 $contentType = curl_getinfo($curl, \CURLINFO_CONTENT_TYPE); 125 126 return [ 127 $statusCode, 128 // The PHP docs say "Content-Type: of the requested document. NULL 129 // indicates server did not send valid Content-Type: header" for 130 // CURLINFO_CONTENT_TYPE. However, it will return FALSE if no header 131 // is set. To keep our types simple, we return null in this case. 132 ($contentType === false ? null : $contentType), 133 $body, 134 ]; 135 } 136 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sat Feb 22 05:10:06 2025 | Cross-referenced by PHPXref 0.7.1 |