Browse Source

return proper error code when reporting exception fails in remote.php

Signed-off-by: Robin Appelman <robin@icewind.nl>
Robin Appelman 1 year ago
parent
commit
4dbcfa387a
1 changed files with 37 additions and 33 deletions
  1. 37 33
      remote.php

+ 37 - 33
remote.php

@@ -50,42 +50,46 @@ class RemoteException extends Exception {
  * @param Exception|Error $e
  */
 function handleException($e) {
-	$request = \OC::$server->getRequest();
-	// in case the request content type is text/xml - we assume it's a WebDAV request
-	$isXmlContentType = strpos($request->getHeader('Content-Type'), 'text/xml');
-	if ($isXmlContentType === 0) {
-		// fire up a simple server to properly process the exception
-		$server = new Server();
-		if (!($e instanceof RemoteException)) {
-			// we shall not log on RemoteException
-			$server->addPlugin(new ExceptionLoggerPlugin('webdav', \OC::$server->get(LoggerInterface::class)));
-		}
-		$server->on('beforeMethod:*', function () use ($e) {
-			if ($e instanceof RemoteException) {
-				switch ($e->getCode()) {
-					case 503:
-						throw new ServiceUnavailable($e->getMessage());
-					case 404:
-						throw new \Sabre\DAV\Exception\NotFound($e->getMessage());
-				}
+	try {
+		$request = \OC::$server->getRequest();
+		// in case the request content type is text/xml - we assume it's a WebDAV request
+		$isXmlContentType = strpos($request->getHeader('Content-Type'), 'text/xml');
+		if ($isXmlContentType === 0) {
+			// fire up a simple server to properly process the exception
+			$server = new Server();
+			if (!($e instanceof RemoteException)) {
+				// we shall not log on RemoteException
+				$server->addPlugin(new ExceptionLoggerPlugin('webdav', \OC::$server->get(LoggerInterface::class)));
 			}
-			$class = get_class($e);
-			$msg = $e->getMessage();
-			throw new ServiceUnavailable("$class: $msg");
-		});
-		$server->exec();
-	} else {
-		$statusCode = 500;
-		if ($e instanceof \OC\ServiceUnavailableException) {
-			$statusCode = 503;
-		}
-		if ($e instanceof RemoteException) {
-			// we shall not log on RemoteException
-			OC_Template::printErrorPage($e->getMessage(), '', $e->getCode());
+			$server->on('beforeMethod:*', function () use ($e) {
+				if ($e instanceof RemoteException) {
+					switch ($e->getCode()) {
+						case 503:
+							throw new ServiceUnavailable($e->getMessage());
+						case 404:
+							throw new \Sabre\DAV\Exception\NotFound($e->getMessage());
+					}
+				}
+				$class = get_class($e);
+				$msg = $e->getMessage();
+				throw new ServiceUnavailable("$class: $msg");
+			});
+			$server->exec();
 		} else {
-			\OC::$server->get(LoggerInterface::class)->error($e->getMessage(), ['app' => 'remote','exception' => $e]);
-			OC_Template::printExceptionErrorPage($e, $statusCode);
+			$statusCode = 500;
+			if ($e instanceof \OC\ServiceUnavailableException) {
+				$statusCode = 503;
+			}
+			if ($e instanceof RemoteException) {
+				// we shall not log on RemoteException
+				OC_Template::printErrorPage($e->getMessage(), '', $e->getCode());
+			} else {
+				\OC::$server->get(LoggerInterface::class)->error($e->getMessage(), ['app' => 'remote','exception' => $e]);
+				OC_Template::printExceptionErrorPage($e, $statusCode);
+			}
 		}
+	} catch (\Exception $e) {
+		OC_Template::printExceptionErrorPage($e, 500);
 	}
 }