function WebTestBase::curlExec

Initializes and executes a cURL request.

Parameters

$curl_options: An associative array of cURL options to set, where the keys are constants defined by the cURL library. For a list of valid options, see http://php.net/manual/function.curl-setopt.php

$redirect: FALSE if this is an initial request, TRUE if this request is the result of a redirect.

Return value

The content returned from the call to curl_exec().

See also

curlInitialize()

5 calls to WebTestBase::curlExec()
RESTTestBase::curlExec in core/modules/rest/src/Tests/RESTTestBase.php
This method is overridden to deal with a cURL quirk: the usage of CURLOPT_CUSTOMREQUEST cannot be unset on the cURL handle, so we need to override it every time it is omitted.
WebTestBase::drupalGet in core/modules/simpletest/src/WebTestBase.php
Retrieves a Drupal path or an absolute path.
WebTestBase::drupalHead in core/modules/simpletest/src/WebTestBase.php
Retrieves only the headers for a Drupal path or an absolute path.
WebTestBase::drupalPost in core/modules/simpletest/src/WebTestBase.php
Perform a POST HTTP request.
WebTestBase::drupalPostForm in core/modules/simpletest/src/WebTestBase.php
Executes a form submission.
1 method overrides WebTestBase::curlExec()
RESTTestBase::curlExec in core/modules/rest/src/Tests/RESTTestBase.php
This method is overridden to deal with a cURL quirk: the usage of CURLOPT_CUSTOMREQUEST cannot be unset on the cURL handle, so we need to override it every time it is omitted.

File

core/modules/simpletest/src/WebTestBase.php, line 589

Class

WebTestBase
Test case for typical Drupal tests.

Namespace

Drupal\simpletest

Code

protected function curlExec($curl_options, $redirect = FALSE) {
    $this->curlInitialize();
    if (!empty($curl_options[CURLOPT_URL])) {
        // cURL incorrectly handles URLs with a fragment by including the
        // fragment in the request to the server, causing some web servers
        // to reject the request citing "400 - Bad Request". To prevent
        // this, we strip the fragment from the request.
        // TODO: Remove this for Drupal 8, since fixed in curl 7.20.0.
        if (strpos($curl_options[CURLOPT_URL], '#')) {
            $original_url = $curl_options[CURLOPT_URL];
            $curl_options[CURLOPT_URL] = strtok($curl_options[CURLOPT_URL], '#');
        }
    }
    $url = empty($curl_options[CURLOPT_URL]) ? curl_getinfo($this->curlHandle, CURLINFO_EFFECTIVE_URL) : $curl_options[CURLOPT_URL];
    if (!empty($curl_options[CURLOPT_POST])) {
        // This is a fix for the Curl library to prevent Expect: 100-continue
        // headers in POST requests, that may cause unexpected HTTP response
        // codes from some webservers (like lighttpd that returns a 417 error
        // code). It is done by setting an empty "Expect" header field that is
        // not overwritten by Curl.
        $curl_options[CURLOPT_HTTPHEADER][] = 'Expect:';
    }
    $cookies = [];
    if (!empty($this->curlCookies)) {
        $cookies = $this->curlCookies;
    }
    foreach ($this->extractCookiesFromRequest(\Drupal::request()) as $cookie_name => $values) {
        foreach ($values as $value) {
            $cookies[] = $cookie_name . '=' . $value;
        }
    }
    // Merge additional cookies in.
    if (!empty($cookies)) {
        $curl_options += [
            CURLOPT_COOKIE => '',
        ];
        // Ensure any existing cookie data string ends with the correct separator.
        if (!empty($curl_options[CURLOPT_COOKIE])) {
            $curl_options[CURLOPT_COOKIE] = rtrim($curl_options[CURLOPT_COOKIE], '; ') . '; ';
        }
        $curl_options[CURLOPT_COOKIE] .= implode('; ', $cookies) . ';';
    }
    curl_setopt_array($this->curlHandle, $this->additionalCurlOptions + $curl_options);
    if (!$redirect) {
        // Reset headers, the session ID and the redirect counter.
        $this->sessionId = NULL;
        $this->headers = [];
        $this->redirectCount = 0;
    }
    $content = curl_exec($this->curlHandle);
    $status = curl_getinfo($this->curlHandle, CURLINFO_HTTP_CODE);
    // cURL incorrectly handles URLs with fragments, so instead of
    // letting cURL handle redirects we take of them ourselves to
    // to prevent fragments being sent to the web server as part
    // of the request.
    // TODO: Remove this for Drupal 8, since fixed in curl 7.20.0.
    if (in_array($status, [
        300,
        301,
        302,
        303,
        305,
        307,
    ]) && $this->redirectCount < $this->maximumRedirects) {
        if ($this->drupalGetHeader('location')) {
            $this->redirectCount++;
            $curl_options = [];
            $curl_options[CURLOPT_URL] = $this->drupalGetHeader('location');
            $curl_options[CURLOPT_HTTPGET] = TRUE;
            return $this->curlExec($curl_options, TRUE);
        }
    }
    $this->setRawContent($content);
    $this->url = isset($original_url) ? $original_url : curl_getinfo($this->curlHandle, CURLINFO_EFFECTIVE_URL);
    $message_vars = [
        '@method' => !empty($curl_options[CURLOPT_NOBODY]) ? 'HEAD' : (empty($curl_options[CURLOPT_POSTFIELDS]) ? 'GET' : 'POST'),
        '@url' => isset($original_url) ? $original_url : $url,
        '@status' => $status,
        '@length' => format_size(strlen($this->getRawContent())),
    ];
    $message = new FormattableMarkup('@method @url returned @status (@length).', $message_vars);
    $this->assertTrue($this->getRawContent() !== FALSE, $message, 'Browser');
    return $this->getRawContent();
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.