Summary:
Ref T1806. Ref T7173. Depends on D14047.
Currently, all exception handling is in this big messy clump in `AphrontDefaultApplicationConfiguration`.
Split it out into modular classes. This will let a future change add new classes in the Phacility cluster which intercept particular exceptions we care about and replaces the default, generic responses with more useful, tailored responses.
Test Plan:
{F777391}
- Hit a Conduit error (made a method throw).
- Hit an Ajax error (made comment preview throw).
- Hit a high security error (tried to edit TOTP).
- Hit a rate limiting error (added a bunch of email addresses).
- Hit a policy error (tried to look at something with no permission).
- Hit an arbitrary exception (made a randomc ontroller throw).
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T1806, T7173
Differential Revision: https://secure.phabricator.com/D14049
39 lines
924 B
PHP
39 lines
924 B
PHP
<?php
|
|
|
|
final class PhabricatorAjaxRequestExceptionHandler
|
|
extends PhabricatorRequestExceptionHandler {
|
|
|
|
public function getRequestExceptionHandlerPriority() {
|
|
return 110000;
|
|
}
|
|
|
|
public function getRequestExceptionHandlerDescription() {
|
|
return pht('Responds to requests made by AJAX clients.');
|
|
}
|
|
|
|
public function canHandleRequestException(
|
|
AphrontRequest $request,
|
|
Exception $ex) {
|
|
// For non-workflow requests, return a Ajax response.
|
|
return ($request->isAjax() && !$request->isWorkflow());
|
|
}
|
|
|
|
public function handleRequestException(
|
|
AphrontRequest $request,
|
|
Exception $ex) {
|
|
|
|
// Log these; they don't get shown on the client and can be difficult
|
|
// to debug.
|
|
phlog($ex);
|
|
|
|
$response = new AphrontAjaxResponse();
|
|
$response->setError(
|
|
array(
|
|
'code' => get_class($ex),
|
|
'info' => $ex->getMessage(),
|
|
));
|
|
return $response;
|
|
}
|
|
|
|
}
|