Curl::request( string|WpOrgRequestsTransportStringable $url, array $headers = array(), string|array $data = array(), array $options = array() ): string

In this article

Perform a request

Parameters

$urlstring|WpOrgRequestsTransportStringablerequired
URL to request
$headersarrayoptional
Associative array of request headers

Default:array()

$datastring|arrayoptional
Data to send either as the POST body, or as parameters in the URL for a GET/HEAD

Default:array()

$optionsarrayoptional
Request options, see WpOrgRequestsRequests::response() for documentation

Default:array()

Return

string Raw HTTP result

Source

public function request($url, $headers = [], $data = [], $options = []) {
	if (InputValidator::is_string_or_stringable($url) === false) {
		throw InvalidArgument::create(1, '$url', 'string|Stringable', gettype($url));
	}

	if (is_array($headers) === false) {
		throw InvalidArgument::create(2, '$headers', 'array', gettype($headers));
	}

	if (!is_array($data) && !is_string($data)) {
		if ($data === null) {
			$data = '';
		} else {
			throw InvalidArgument::create(3, '$data', 'array|string', gettype($data));
		}
	}

	if (is_array($options) === false) {
		throw InvalidArgument::create(4, '$options', 'array', gettype($options));
	}

	$this->hooks = $options['hooks'];

	$this->setup_handle($url, $headers, $data, $options);

	$options['hooks']->dispatch('curl.before_send', [&$this->handle]);

	if ($options['filename'] !== false) {
		// phpcs:ignore WordPress.PHP.NoSilencedErrors -- Silenced the PHP native warning in favour of throwing an exception.
		$this->stream_handle = @fopen($options['filename'], 'wb');
		if ($this->stream_handle === false) {
			$error = error_get_last();
			throw new Exception($error['message'], 'fopen');
		}
	}

	$this->response_data       = '';
	$this->response_bytes      = 0;
	$this->response_byte_limit = false;
	if ($options['max_bytes'] !== false) {
		$this->response_byte_limit = $options['max_bytes'];
	}

	if (isset($options['verify'])) {
		if ($options['verify'] === false) {
			curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0);
			curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0);
		} elseif (is_string($options['verify'])) {
			curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']);
		}
	}

	if (isset($options['verifyname']) && $options['verifyname'] === false) {
		curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0);
	}

	curl_exec($this->handle);
	$response = $this->response_data;

	$options['hooks']->dispatch('curl.after_send', []);

	if (curl_errno($this->handle) === CURLE_WRITE_ERROR || curl_errno($this->handle) === CURLE_BAD_CONTENT_ENCODING) {
		// Reset encoding and try again
		curl_setopt($this->handle, CURLOPT_ENCODING, 'none');

		$this->response_data  = '';
		$this->response_bytes = 0;
		curl_exec($this->handle);
		$response = $this->response_data;
	}

	$this->process_response($response, $options);

	// Need to remove the $this reference from the curl handle.
	// Otherwise \WpOrg\Requests\Transport\Curl won't be garbage collected and the curl_close() will never be called.
	curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, null);
	curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, null);

	return $this->headers;
}

User Contributed Notes

You must log in before being able to contribute a note or feedback.