Fixing content type detection and handle all local printErrorPage calls

This commit is contained in:
Thomas Müller 2015-06-29 22:08:34 +02:00
parent 5dc7eebcdb
commit 039a470a6a
1 changed files with 29 additions and 12 deletions

View File

@ -30,31 +30,52 @@ use OC\Connector\Sabre\ExceptionLoggerPlugin;
use Sabre\DAV\Exception\ServiceUnavailable; use Sabre\DAV\Exception\ServiceUnavailable;
use Sabre\DAV\Server; use Sabre\DAV\Server;
/**
* Class RemoteException
* Dummy exception class to be use locally to identify certain conditions
*/
class RemoteException extends Exception {
}
/** /**
* @param Exception $e * @param Exception $e
*/ */
function handleException(Exception $e) { function handleException(Exception $e) {
$request = \OC::$server->getRequest(); $request = \OC::$server->getRequest();
// in case the request content type is text/xml - we assume it's a WebDAV request // 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 // fire up a simple server to properly process the exception
$server = new Server(); $server = new Server();
$server->addPlugin(new ExceptionLoggerPlugin('webdav', \OC::$server->getLogger())); $server->addPlugin(new ExceptionLoggerPlugin('webdav', \OC::$server->getLogger()));
$server->on('beforeMethod', function () use ($e) { $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); $class = get_class($e);
$msg = $e->getMessage(); $msg = $e->getMessage();
throw new ServiceUnavailable("$class: $msg"); throw new ServiceUnavailable("$class: $msg");
}); });
$server->exec(); $server->exec();
} else { } else {
$statusCode = OC_Response::STATUS_INTERNAL_SERVER_ERROR;
if ($e instanceof \OC\ServiceUnavailableException ) { if ($e instanceof \OC\ServiceUnavailableException ) {
OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE); $statusCode = OC_Response::STATUS_SERVICE_UNAVAILABLE;
} else {
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
} }
\OCP\Util::writeLog('remote', $e->getMessage(), \OCP\Util::FATAL); \OCP\Util::writeLog('remote', $e->getMessage(), \OCP\Util::FATAL);
if ($e instanceof RemoteException) {
OC_Response::setStatus($e->getCode());
OC_Template::printErrorPage($e->getMessage());
} else {
OC_Response::setStatus($statusCode);
OC_Template::printExceptionErrorPage($e); OC_Template::printExceptionErrorPage($e);
} }
}
} }
try { try {
@ -63,16 +84,13 @@ try {
if (\OCP\Util::needUpgrade()) { if (\OCP\Util::needUpgrade()) {
// since the behavior of apps or remotes are unpredictable during // since the behavior of apps or remotes are unpredictable during
// an upgrade, return a 503 directly // an upgrade, return a 503 directly
OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE); throw new RemoteException('Service unavailable', OC_Response::STATUS_SERVICE_UNAVAILABLE);
OC_Template::printErrorPage('Service unavailable');
exit;
} }
$request = \OC::$server->getRequest(); $request = \OC::$server->getRequest();
$pathInfo = $request->getPathInfo(); $pathInfo = $request->getPathInfo();
if ($pathInfo === false || $pathInfo === '') { if ($pathInfo === false || $pathInfo === '') {
OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); throw new RemoteException('Path not found', OC_Response::STATUS_NOT_FOUND);
exit;
} }
if (!$pos = strpos($pathInfo, '/', 1)) { if (!$pos = strpos($pathInfo, '/', 1)) {
$pos = strlen($pathInfo); $pos = strlen($pathInfo);
@ -82,8 +100,7 @@ try {
$file = \OC::$server->getConfig()->getAppValue('core', 'remote_' . $service); $file = \OC::$server->getConfig()->getAppValue('core', 'remote_' . $service);
if(is_null($file)) { if(is_null($file)) {
OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); throw new RemoteException('Path not found', OC_Response::STATUS_NOT_FOUND);
exit;
} }
// force language as given in the http request // force language as given in the http request