diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2015-06-29 23:08:34 +0300 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2015-06-30 16:05:59 +0300 |
commit | 039a470a6a908c195571e2fa6c4cbb5f8485b265 (patch) | |
tree | 74915940a3c41cfdb18c50faadaa5eb6ec59528f | |
parent | 5dc7eebcdb6614622bf422a278452a20944d7221 (diff) |
Fixing content type detection and handle all local printErrorPage calls
-rw-r--r-- | remote.php | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/remote.php b/remote.php index 5b4f6e11902..0b43f949ad4 100644 --- a/remote.php +++ b/remote.php @@ -31,29 +31,50 @@ use Sabre\DAV\Exception\ServiceUnavailable; use Sabre\DAV\Server; /** + * Class RemoteException + * Dummy exception class to be use locally to identify certain conditions + */ +class RemoteException extends Exception { +} + +/** * @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') { + $isXmlContentType = strpos($request->getHeader('Content-Type'), 'text/xml'); + if ($isXmlContentType === 0) { // 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) { + if ($e instanceof RemoteException) { + switch ($e->getCode()) { + case OC_Response::STATUS_SERVICE_UNAVAILABLE: + throw new ServiceUnavailable($e->getMessage()); + case OC_Response::STATUS_NOT_FOUND: + throw new \Sabre\DAV\Exception\NotFound($e->getMessage()); + } + } $class = get_class($e); $msg = $e->getMessage(); throw new ServiceUnavailable("$class: $msg"); }); $server->exec(); } else { + $statusCode = OC_Response::STATUS_INTERNAL_SERVER_ERROR; if ($e instanceof \OC\ServiceUnavailableException ) { - OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE); - } else { - OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR); + $statusCode = OC_Response::STATUS_SERVICE_UNAVAILABLE; } \OCP\Util::writeLog('remote', $e->getMessage(), \OCP\Util::FATAL); - OC_Template::printExceptionErrorPage($e); + if ($e instanceof RemoteException) { + OC_Response::setStatus($e->getCode()); + OC_Template::printErrorPage($e->getMessage()); + } else { + OC_Response::setStatus($statusCode); + OC_Template::printExceptionErrorPage($e); + } } } @@ -63,16 +84,13 @@ try { if (\OCP\Util::needUpgrade()) { // since the behavior of apps or remotes are unpredictable during // an upgrade, return a 503 directly - OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE); - OC_Template::printErrorPage('Service unavailable'); - exit; + throw new RemoteException('Service unavailable', OC_Response::STATUS_SERVICE_UNAVAILABLE); } $request = \OC::$server->getRequest(); $pathInfo = $request->getPathInfo(); if ($pathInfo === false || $pathInfo === '') { - OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); - exit; + throw new RemoteException('Path not found', OC_Response::STATUS_NOT_FOUND); } if (!$pos = strpos($pathInfo, '/', 1)) { $pos = strlen($pathInfo); @@ -82,8 +100,7 @@ try { $file = \OC::$server->getConfig()->getAppValue('core', 'remote_' . $service); if(is_null($file)) { - OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); - exit; + throw new RemoteException('Path not found', OC_Response::STATUS_NOT_FOUND); } // force language as given in the http request |