private function _fetch(
        $uri,
        $method = \Zend_Http_Client::GET,
        $body = '',
        $test = false,
        $testApiKey = null,
        $logError = true
    ) {
        $apiKey = ($test == true) ? $testApiKey : $this->config->getApiKey();

        // Correctly format $body string
        if (is_array($body) == true) {
            $body = http_build_query($body);
        }

        // Client headers
        $headers = [
            self::FASTLY_HEADER_AUTH  . ': ' . $apiKey,
            'Accept: application/json'
        ];

        // Client options
        $options = [];

        // Request method specific header & option changes
        switch ($method) {
            case \Zend_Http_Client::DELETE:
                $options[CURLOPT_CUSTOMREQUEST] = \Zend_Http_Client::DELETE;
                break;
            case \Zend_Http_Client::PUT:
                $headers[] = 'Content-Type: application/x-www-form-urlencoded';
                $options[CURLOPT_CUSTOMREQUEST] = \Zend_Http_Client::PUT;

                if ($body != '') {
                    $options[CURLOPT_POSTFIELDS] = $body;
                }

                break;
            case \Zend_Http_Client::PATCH:
                $options[CURLOPT_CUSTOMREQUEST] = \Zend_Http_Client::PATCH;
                $headers[] = 'Content-Type: text/json';

                if ($body != '') {
                    $options[CURLOPT_POSTFIELDS] = $body;
                }

                break;
        }

        /** @var \Magento\Framework\HTTP\Adapter\Curl $client */
        $client = $this->curlFactory->create();

        // Execute request
        $client->setOptions($options);
        $client->write($method, $uri, '1.1', $headers, $body);
        $response = $client->read();
        $client->close();

        // Parse response
        $responseBody = \Zend_Http_Response::extractBody($response);
        $responseCode = \Zend_Http_Response::extractCode($response);
        $responseMessage = \Zend_Http_Response::extractMessage($response);

        // Return error based on response code
        if ($responseCode == '429') {
            throw new LocalizedException(__($responseMessage));
        } elseif ($responseCode != '200') {
            if ($logError == true) {
                $this->logger->critical('Return status ' . $responseCode, $uri);
            }

            return false;
        }

        return json_decode($responseBody);
    }