summaryrefslogtreecommitdiffstats
path: root/remote.php
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2015-06-29 22:08:34 +0200
committerThomas Müller <thomas.mueller@tmit.eu>2015-06-30 15:05:59 +0200
commit039a470a6a908c195571e2fa6c4cbb5f8485b265 (patch)
tree74915940a3c41cfdb18c50faadaa5eb6ec59528f /remote.php
parent5dc7eebcdb6614622bf422a278452a20944d7221 (diff)
downloadnextcloud-server-039a470a6a908c195571e2fa6c4cbb5f8485b265.tar.gz
nextcloud-server-039a470a6a908c195571e2fa6c4cbb5f8485b265.zip
Fixing content type detection and handle all local printErrorPage calls
Diffstat (limited to 'remote.php')
-rw-r--r--remote.php41
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