diff --git a/core/modules/rest/tests/src/Functional/EntityResource/User/UserResourceTestBase.php b/core/modules/rest/tests/src/Functional/EntityResource/User/UserResourceTestBase.php
index 04fe435..199ac09 100644
--- a/core/modules/rest/tests/src/Functional/EntityResource/User/UserResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/EntityResource/User/UserResourceTestBase.php
@@ -213,7 +213,7 @@ public function testPatchDxForSecuritySensitiveBaseFields() {
       RequestOptions::HEADERS => [],
       RequestOptions::BODY => $this->serializer->encode($request_body, 'json'),
     ];
-    $response = $this->httpClient->request('POST', Url::fromRoute('user.login.http')->setRouteParameter('_format', 'json')->toString(), $request_options);
+    $response = $this->request('POST', Url::fromRoute('user.login.http')->setRouteParameter('_format', 'json'), $request_options);
     $this->assertSame(200, $response->getStatusCode());
   }
 
diff --git a/core/modules/rest/tests/src/Functional/ResourceTestBase.php b/core/modules/rest/tests/src/Functional/ResourceTestBase.php
index c346157..a044190 100644
--- a/core/modules/rest/tests/src/Functional/ResourceTestBase.php
+++ b/core/modules/rest/tests/src/Functional/ResourceTestBase.php
@@ -8,6 +8,8 @@
 use Drupal\Tests\BrowserTestBase;
 use Drupal\user\Entity\Role;
 use Drupal\user\RoleInterface;
+use function GuzzleHttp\Psr7\uri_for;
+use GuzzleHttp\Psr7\UriResolver;
 use GuzzleHttp\RequestOptions;
 use Psr\Http\Message\ResponseInterface;
 
@@ -136,9 +138,7 @@ public function setUp() {
     $this->resourceConfigStorage->delete($this->resourceConfigStorage->loadMultiple());
     $this->refreshTestStateAfterRestConfigChange();
 
-    // Set up a HTTP client that accepts relative URLs.
-    $this->httpClient = $this->container->get('http_client_factory')
-      ->fromOptions(['base_uri' => $this->baseUrl]);
+    $this->httpClient = $this->getSession()->getDriver()->getClient()->getClient();
   }
 
   /**
@@ -344,7 +344,9 @@ protected function grantPermissionsToTestedRole(array $permissions) {
   protected function request($method, Url $url, array $request_options) {
     $request_options[RequestOptions::HTTP_ERRORS] = FALSE;
     $request_options = $this->decorateWithXdebugCookie($request_options);
-    return $this->httpClient->request($method, $url->toString(), $request_options);
+    // Set up a HTTP client that accepts relative URLs.
+    $uri = UriResolver::resolve(uri_for($this->baseUrl), uri_for($url->toString()));
+    return $this->httpClient->request($method, $uri, $request_options);
   }
 
   /**
diff --git a/core/modules/rest/tests/src/Functional/ResourceTestBaseTest.php b/core/modules/rest/tests/src/Functional/ResourceTestBaseTest.php
new file mode 100644
index 0000000..e78a816
--- /dev/null
+++ b/core/modules/rest/tests/src/Functional/ResourceTestBaseTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\Tests\rest\Functional;
+
+use Drupal\Core\Url;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * @group rest
+ */
+class ResourceTestBaseTest extends ResourceTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['test_page_test'];
+
+  /**
+   * Ensures that HTTP client turns off curl timeout.
+   */
+  public function testCurlTimeout() {
+    $url = Url::fromRoute('test_page_test.slow_page');
+    $time_start = time();
+    $response = $this->request('GET', $url, []);
+    $time_end = time();
+    $this->assertSame(200, $response->getStatusCode());
+    $this->assertTrue(30 < $time_end - $time_start);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUpAuthorization($method) {}
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function assertResponseWhenMissingAuthentication(ResponseInterface $response) {}
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function assertNormalizationEdgeCases($method, Url $url, array $request_options) {}
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function assertAuthenticationEdgeCases($method, Url $url, array $request_options) {}
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getExpectedUnauthorizedAccessMessage($method) {}
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getExpectedBcUnauthorizedAccessMessage($method) {}
+
+}
diff --git a/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php b/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php
index 2de84e9..41aa23e 100644
--- a/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php
+++ b/core/modules/system/tests/modules/test_page_test/src/Controller/Test.php
@@ -108,4 +108,15 @@ public function renderPipeInLink() {
     return ['#markup' => '<a href="http://example.com">foo|bar|baz</a>'];
   }
 
+  /**
+   * Renders a page with more than 30 seconds (default cURL timeout value).
+   *
+   * @return array
+   *   A render array as expected by drupal_render()
+   */
+  public function renderSlowPage() {
+    sleep(42);
+    return ['#markup' => '42'];
+  }
+
 }
diff --git a/core/modules/system/tests/modules/test_page_test/test_page_test.routing.yml b/core/modules/system/tests/modules/test_page_test/test_page_test.routing.yml
index 5d84695..d179665 100644
--- a/core/modules/system/tests/modules/test_page_test/test_page_test.routing.yml
+++ b/core/modules/system/tests/modules/test_page_test/test_page_test.routing.yml
@@ -82,3 +82,11 @@ test_page_test.field_xpath:
     _form: '\Drupal\test_page_test\Form\TestForm'
   requirements:
     _access: 'TRUE'
+
+test_page_test.slow_page:
+  path: '/test-slow-page'
+  defaults:
+    _title: 'Slow Page'
+    _controller: '\Drupal\test_page_test\Controller\Test::renderSlowPage'
+  requirements:
+    _access: 'TRUE'
