gzipEnabled = extension_loaded('zlib'); } /** * {@inheritdoc} */ public function get($url, array $options = []) { return $this->request('GET', $url, $options); } /** * {@inheritdoc} */ public function post($url, array $options = [], $body = '') { return $this->request('POST', $url, $options, $body); } /** * Create a stream context for given request * * @param string $method Request method * @param array $options Request options * @param string $body Request body * @return resource */ protected function createContext($method, array $options, $body) { $contextOptions = [ 'ssl' => ['verify_peer' => $this->sslVerifyPeer], 'http' => [ 'method' => $method, 'timeout' => $this->timeout, 'header' => $this->generateHeaders($options, $body), 'content' => $body ] ]; return stream_context_create($contextOptions); } /** * Decompress given page if applicable * * @param string $content Response body, potentially compressed * @return string Response body, uncompressed */ protected function decompress($content) { if ($this->gzipEnabled && substr($content, 0, 2) === "\x1f\x8b") { return gzdecode($content); } return $content; } /** * Generate a list of headers for given request * * @param array $options Request options * @param string $body Request body * @return string[] */ protected function generateHeaders(array $options, $body) { $options += ['headers' => []]; if ($this->gzipEnabled) { $options['headers'][] = 'Accept-Encoding: gzip'; } $options['headers'][] = 'Content-Length: ' . strlen($body); return $options['headers']; } /** * Execute an HTTP request * * @param string $method Request method * @param string $url Request URL * @param array $options Request options * @param string $body Request body * @return string|bool Response body or FALSE */ protected function request($method, $url, array $options, $body = '') { $response = @file_get_contents($url, false, $this->createContext($method, $options, $body)); if ($response === false) { return false; } $response = $this->decompress($response); if (!empty($options['returnHeaders'])) { $response = implode("\r\n", $http_response_header) . "\r\n\r\n" . $response; } return $response; } }