[tor-commits] [donate/master] Error handling fixes

peterh at torproject.org peterh at torproject.org
Tue May 11 21:17:51 UTC 2021


commit 76d4ac338d0fdf17033e789b5d8f0a389af9cd97
Author: Peter Haight <peterh at giantrabbit.com>
Date:   Wed Sep 16 12:30:26 2020 -0700

    Error handling fixes
    
    With moving the form to a different website we need to have some
    Access-Control headers set or the browser will block fetch requests.
    Slim doesn't apply the middleware when it's handling the response
    object for errors, so the middleware wasn't adding these headers so the
    browser was blocking the error results.
    
    The PHP errors are handled with a separate error handler so I had to
    repeat everything for those as well so that PHP errors will also get
    handled correctly.
    
    Issue #48541
---
 src/ErrorHandler.php    | 25 +++++++++++++++++--------
 src/PhpErrorHandler.php | 41 +++++++++++++++++++++++++++++++++++++++++
 src/dependencies.php    |  5 +++++
 3 files changed, 63 insertions(+), 8 deletions(-)

diff --git a/src/ErrorHandler.php b/src/ErrorHandler.php
index 81b0ccd6..82edfb01 100644
--- a/src/ErrorHandler.php
+++ b/src/ErrorHandler.php
@@ -13,6 +13,18 @@ class ErrorHandler extends \Slim\Handlers\Error {
     parent::__construct(FALSE);
   }
 
+  public function __invoke(ServerRequestInterface $request, ResponseInterface $response, \Exception $exception) {
+    $response = parent::__invoke($request, $response, $exception);
+    $torSiteBaseUrl = $this->container->get('settings')['torSiteBaseUrl'];
+    $response = $response->withHeader('Access-Control-Allow-Origin', $torSiteBaseUrl);
+    $response = $response->withHeader('Access-Control-Allow-Credentials', 'true');
+    $response = $response->withHeader('Access-Control-Allow-Headers', 'Content-Type');
+    return $response;
+  }
+
+  public function handlePhpError($request, $response, $error) {
+  }
+
   protected function writeToErrorLog($throwable) {
     $message = sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($throwable), $throwable->getMessage(), $throwable->getFile(), $throwable->getLine());
     $logger = $this->container->get('logger');
@@ -22,14 +34,11 @@ class ErrorHandler extends \Slim\Handlers\Error {
   protected function renderJsonErrorMessage(\Exception $exception)
   {
     $message = $exception->getMessage();
-    $response = array(
-      'errors' => array(
-        array(
-          'error_code' => $exception->getCode(),
-          'message' => $message
-        ),
-      ),
-    );
+    $response = [
+      'errors' => [
+        $message,
+      ]
+    ];
     return json_encode($response, JSON_PRETTY_PRINT);
   }
 }
diff --git a/src/PhpErrorHandler.php b/src/PhpErrorHandler.php
new file mode 100644
index 00000000..e573cde9
--- /dev/null
+++ b/src/PhpErrorHandler.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Tor;
+
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+class PhpErrorHandler extends \Slim\Handlers\PhpError {
+  public $container;
+
+  public function __construct($container) {
+    $this->container = $container;
+    parent::__construct(FALSE);
+  }
+
+  public function __invoke(ServerRequestInterface $request, ResponseInterface $response, \Throwable $error) {
+    $response = parent::__invoke($request, $response, $error);
+    $torSiteBaseUrl = $this->container->get('settings')['torSiteBaseUrl'];
+    $response = $response->withHeader('Access-Control-Allow-Origin', $torSiteBaseUrl);
+    $response = $response->withHeader('Access-Control-Allow-Credentials', 'true');
+    $response = $response->withHeader('Access-Control-Allow-Headers', 'Content-Type');
+    return $response;
+  }
+
+  protected function writeToErrorLog($throwable) {
+    $message = sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($throwable), $throwable->getMessage(), $throwable->getFile(), $throwable->getLine());
+    $logger = $this->container->get('logger');
+    $logger->error($message, array('exception' => $throwable, 'trace' => $throwable->getTrace()));
+  }
+
+  protected function renderJsonErrorMessage(\Throwable $error)
+  {
+    $message = $error->getMessage();
+    $response = [
+      'errors' => [
+        $message,
+      ]
+    ];
+    return json_encode($response, JSON_PRETTY_PRINT);
+  }
+}
diff --git a/src/dependencies.php b/src/dependencies.php
index 65058873..dce480db 100644
--- a/src/dependencies.php
+++ b/src/dependencies.php
@@ -67,6 +67,11 @@ $container['errorHandler'] = function($container) {
   return $error_handler;
 };
 
+$container['phpErrorHandler'] = function($container) {
+  $error_handler = new \Tor\PhpErrorHandler($container);
+  return $error_handler;
+};
+
 $container['ipRateLimiter'] = function($container) {
   return new \Tor\IpRateLimiter($container);
 };





More information about the tor-commits mailing list