Fixing content type detection and handle all local printErrorPage calls
This commit is contained in:
parent
5dc7eebcdb
commit
039a470a6a
39
remote.php
39
remote.php
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue