diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2015-06-29 15:47:05 +0200 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2015-06-30 15:05:59 +0200 |
commit | 5dc7eebcdb6614622bf422a278452a20944d7221 (patch) | |
tree | 9cca4a0fd9de49ee17d8d6c81e40f8bb1a711db0 /remote.php | |
parent | 3f3c603922bc57179fef5fbedaf6f28aa58293d1 (diff) | |
download | nextcloud-server-5dc7eebcdb6614622bf422a278452a20944d7221.tar.gz nextcloud-server-5dc7eebcdb6614622bf422a278452a20944d7221.zip |
Adding request specific exception handling - now with WebDAV responses - refs #17192
Diffstat (limited to 'remote.php')
-rw-r--r-- | remote.php | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/remote.php b/remote.php index c1077e42672..5b4f6e11902 100644 --- a/remote.php +++ b/remote.php @@ -25,6 +25,38 @@ * along with this program. If not, see <http://www.gnu.org/licenses/> * */ + +use OC\Connector\Sabre\ExceptionLoggerPlugin; +use Sabre\DAV\Exception\ServiceUnavailable; +use Sabre\DAV\Server; + +/** + * @param Exception $e + */ +function handleException(Exception $e) { + $request = \OC::$server->getRequest(); + // in case the request content type is text/xml - we assume it's a WebDAV request + if ($request->getHeader('Content-Type') === 'text/xml') { + // fire up a simple server to properly process the exception + $server = new Server(); + $server->addPlugin(new ExceptionLoggerPlugin('webdav', \OC::$server->getLogger())); + $server->on('beforeMethod', function () use ($e) { + $class = get_class($e); + $msg = $e->getMessage(); + throw new ServiceUnavailable("$class: $msg"); + }); + $server->exec(); + } else { + if ($e instanceof \OC\ServiceUnavailableException ) { + OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE); + } else { + OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR); + } + \OCP\Util::writeLog('remote', $e->getMessage(), \OCP\Util::FATAL); + OC_Template::printExceptionErrorPage($e); + } +} + try { require_once 'lib/base.php'; @@ -82,12 +114,6 @@ try { $baseuri = OC::$WEBROOT . '/remote.php/'.$service.'/'; require_once $file; -} catch (\OC\ServiceUnavailableException $ex) { - OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE); - \OCP\Util::writeLog('remote', $ex->getMessage(), \OCP\Util::FATAL); - OC_Template::printExceptionErrorPage($ex); } catch (Exception $ex) { - OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR); - \OCP\Util::writeLog('remote', $ex->getMessage(), \OCP\Util::FATAL); - OC_Template::printExceptionErrorPage($ex); + handleException($ex); } |