Detect aborted connection in OC\Files\View and stop writing data to the

output buffer

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
This commit is contained in:
Côme Chilliet 2023-09-04 14:56:06 +02:00
parent 79c2353d7f
commit cb2a6d688f
No known key found for this signature in database
GPG key ID: A3E2F658B28C760A
2 changed files with 10 additions and 5 deletions

View file

@ -428,6 +428,7 @@ class View {
$chunkSize = 524288; // 512 kB chunks
while (!feof($handle)) {
echo fread($handle, $chunkSize);
$this->checkConnectionStatus();
flush();
}
fclose($handle);
@ -480,6 +481,7 @@ class View {
$len = $chunkSize;
}
echo fread($handle, $len);
$this->checkConnectionStatus();
flush();
}
return ftell($handle) - $from;
@ -490,6 +492,14 @@ class View {
return false;
}
private function checkConnectionStatus(): void {
$connectionStatus = \connection_status();
if ($connectionStatus !== 0) {
throw new \RuntimeException("Connection lost. Status: $connectionStatus");
}
}
/**
* @param string $path
* @return mixed
@ -1053,7 +1063,6 @@ class View {
public function fromTmpFile($tmpFile, $path) {
$this->assertPathLength($path);
if (Filesystem::isValidPath($path)) {
// Get directory that the file is going into
$filePath = dirname($path);
@ -1809,7 +1818,6 @@ class View {
* @return boolean
*/
private function targetIsNotShared(IStorage $targetStorage, string $targetInternalPath) {
// note: cannot use the view because the target is already locked
$fileId = (int)$targetStorage->getCache()->getId($targetInternalPath);
if ($fileId === -1) {

View file

@ -238,9 +238,6 @@ class OC_Files {
OC::$server->getLogger()->logException($ex);
$l = \OC::$server->getL10N('lib');
$hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
if ($event && $event->getErrorMessage() !== null) {
$hint .= ' ' . $event->getErrorMessage();
}
\OC_Template::printErrorPage($l->t('Cannot download file'), $hint, 200);
}
}