From b878dde667393f17c71d2297b6772a1d7070383c Mon Sep 17 00:00:00 2001
From: Lee Rowlands <lee.rowlands@previousnext.com.au>
Date: Tue, 19 Nov 2024 15:54:40 +1000
Subject: [PATCH] Revert "Issue #3486972 by catch, longwave:
 DefaultExceptionHtmlSubscriber should not clone the request for
 400/BadRequestException"

This reverts commit a4dbd3f2d3df1a81bd0718caeb2bce2fa0171ddf.
---
 .../DefaultExceptionHtmlSubscriber.php        | 10 ---
 .../ExceptionLoggingSubscriberTest.php        | 74 ++++++++++---------
 2 files changed, 41 insertions(+), 43 deletions(-)

diff --git a/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php
index 4642d434fcf6..615f2ee3c01d 100644
--- a/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/DefaultExceptionHtmlSubscriber.php
@@ -92,16 +92,6 @@ public function on4xx(ExceptionEvent $event) {
     }
   }
 
-  /**
-   * Handles a 400 error for HTML.
-   *
-   * @param \Symfony\Component\HttpKernel\Event\ExceptionEvent $event
-   *   The event to process.
-   */
-  public function on400(ExceptionEvent $event): void {
-    throw $event->getThrowable();
-  }
-
   /**
    * Handles a 401 error for HTML.
    *
diff --git a/core/tests/Drupal/KernelTests/Core/EventSubscriber/ExceptionLoggingSubscriberTest.php b/core/tests/Drupal/KernelTests/Core/EventSubscriber/ExceptionLoggingSubscriberTest.php
index 77507fbf8c4a..785a52c981be 100644
--- a/core/tests/Drupal/KernelTests/Core/EventSubscriber/ExceptionLoggingSubscriberTest.php
+++ b/core/tests/Drupal/KernelTests/Core/EventSubscriber/ExceptionLoggingSubscriberTest.php
@@ -9,7 +9,6 @@
 use Drupal\KernelTests\KernelTestBase;
 use Symfony\Component\ErrorHandler\BufferingLogger;
 use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpKernel\Exception\HttpException;
 
 /**
  * Tests that HTTP exceptions are logged correctly.
@@ -32,55 +31,64 @@ class ExceptionLoggingSubscriberTest extends KernelTestBase {
 
   /**
    * Tests \Drupal\Core\EventSubscriber\ExceptionLoggingSubscriber::onException().
-   *
-   * @dataProvider exceptionDataProvider
    */
-  public function testExceptionLogging(int $error_code, string $channel, int $log_level, string $exception = ''): void {
+  public function testExceptionLogging(): void {
     $http_kernel = \Drupal::service('http_kernel');
 
+    $channel_map = [
+      400 => 'client error',
+      401 => 'client error',
+      403 => 'access denied',
+      404 => 'page not found',
+      405 => 'client error',
+      408 => 'client error',
+      // Do not check the 500 status code here because it would be caught by
+      // Drupal\Core\EventSubscriberExceptionTestSiteSubscriber which has lower
+      // priority.
+      501 => 'php',
+      502 => 'php',
+      503 => 'php',
+    ];
+
+    $level_map = [
+      400 => RfcLogLevel::WARNING,
+      401 => RfcLogLevel::WARNING,
+      403 => RfcLogLevel::WARNING,
+      404 => RfcLogLevel::WARNING,
+      405 => RfcLogLevel::WARNING,
+      408 => RfcLogLevel::WARNING,
+      501 => RfcLogLevel::ERROR,
+      502 => RfcLogLevel::ERROR,
+      503 => RfcLogLevel::ERROR,
+    ];
+
     // Ensure that noting is logged.
     $this->assertEmpty($this->container->get($this->testLogServiceName)->cleanLogs());
 
     // Temporarily disable error log as the ExceptionLoggingSubscriber logs 5xx
     // HTTP errors using error_log().
     $error_log = ini_set('error_log', '/dev/null');
-    $request = Request::create('/test-http-response-exception/' . $error_code);
-
-    if ($exception) {
-      $this->expectException($exception);
+    foreach ($channel_map as $code => $channel) {
+      $request = Request::create('/test-http-response-exception/' . $code);
+      $http_kernel->handle($request);
     }
-    $http_kernel->handle($request);
     ini_set('error_log', $error_log);
 
+    $expected_channels = array_values($channel_map);
+    $expected_levels = array_values($level_map);
+
     $logs = $this->container->get($this->testLogServiceName)->cleanLogs();
-    $this->assertEquals($channel, $logs[0][2]['channel']);
-    $this->assertEquals($log_level, $logs[0][0]);
+    foreach ($expected_channels as $key => $expected_channel) {
+      $this->assertEquals($expected_channel, $logs[$key][2]['channel']);
+      $this->assertEquals($expected_levels[$key], $logs[$key][0]);
 
-    // Verify that @backtrace_string is removed from client error.
-    if ($logs[0][2]['channel'] === 'client error') {
-      $this->assertArrayNotHasKey('@backtrace_string', $logs[0][2]);
+      // Verify that @backtrace_string is removed from client error.
+      if ($logs[$key][2]['channel'] === 'client error') {
+        $this->assertArrayNotHasKey('@backtrace_string', $logs[$key][2]);
+      }
     }
   }
 
-  public static function exceptionDataProvider(): array {
-    return [
-      // When a BadRequestException is thrown, DefaultHttpExceptionSubscriber
-      // will rethrow the exception.
-      [400, 'client error', RfcLogLevel::WARNING, HttpException::class],
-      [401, 'client error', RfcLogLevel::WARNING],
-      [403, 'access denied', RfcLogLevel::WARNING],
-      [404, 'page not found', RfcLogLevel::WARNING],
-      [405, 'client error', RfcLogLevel::WARNING],
-      [408, 'client error', RfcLogLevel::WARNING],
-      // Do not check the 500 status code here because it would be caught by
-      // Drupal\Core\EventSubscriberExceptionTestSiteSubscriber which has lower
-      // priority.
-      [501, 'php', RfcLogLevel::ERROR],
-      [502, 'php', RfcLogLevel::ERROR],
-      [503, 'php', RfcLogLevel::ERROR],
-    ];
-  }
-
   /**
    * {@inheritdoc}
    */
-- 
GitLab