Adding request specific exception handling - now with WebDAV responses - refs #17192

This commit is contained in:
Thomas Müller 2015-06-29 15:47:05 +02:00
parent 3f3c603922
commit 5dc7eebcdb
1 changed files with 33 additions and 7 deletions

View File

@ -25,6 +25,38 @@
* along with this program. If not, see <http://www.gnu.org/licenses/> * 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 { try {
require_once 'lib/base.php'; require_once 'lib/base.php';
@ -82,12 +114,6 @@ try {
$baseuri = OC::$WEBROOT . '/remote.php/'.$service.'/'; $baseuri = OC::$WEBROOT . '/remote.php/'.$service.'/';
require_once $file; 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) { } catch (Exception $ex) {
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR); handleException($ex);
\OCP\Util::writeLog('remote', $ex->getMessage(), \OCP\Util::FATAL);
OC_Template::printExceptionErrorPage($ex);
} }