range support fix and passed test
This commit is contained in:
parent
40898ae313
commit
f924ead8f8
|
@ -1062,19 +1062,25 @@ App::get('/v1/storage/buckets/:bucketId/files/:fileId/download')
|
|||
$size = $device->getFileSize($path);
|
||||
|
||||
// Range header
|
||||
list($unit, $range) = explode('=', $request->getHeader('Range'));
|
||||
if($unit == 'bytes' && !empty($range)) {
|
||||
list($start, $end) = explode('-', $range);
|
||||
$start = (int) $start;
|
||||
$end = (int) $end;
|
||||
if(($start > $end) || $end > $size) {
|
||||
throw new Exception('Invalid Range', 400);
|
||||
$rangeHeader = $request->getHeader('range');
|
||||
if(!empty($rangeHeader)) {
|
||||
list($unit, $range) = explode('=', $rangeHeader);
|
||||
if($unit == 'bytes' && !empty($range)) {
|
||||
list($rangeStart, $rangeEnd) = explode('-', $range);
|
||||
$rangeStart = (int) $rangeStart;
|
||||
$rangeEnd = (int) $rangeEnd;
|
||||
if(($rangeStart > $rangeEnd) || $rangeEnd > $size) {
|
||||
throw new Exception('Invalid range', 400);
|
||||
}
|
||||
|
||||
$response
|
||||
->addHeader('Accept-Ranges', 'bytes')
|
||||
->addHeader('Content-Range', 'bytes ' . $rangeStart . '-' . $rangeEnd . '/' . $size)
|
||||
->addHeader('Content-Length', $rangeEnd - $rangeStart + 1)
|
||||
->setStatusCode(Response::STATUS_CODE_PARTIALCONTENT);
|
||||
} else {
|
||||
throw new Exception('Invalid range', 400);
|
||||
}
|
||||
|
||||
$response->addHeader('Accept-Ranges', 'bytes');
|
||||
$response->addHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $size);
|
||||
$response->addHeader('Content-Length', $end - $start + 1);
|
||||
$response->send($device->read($path, $start, $end));
|
||||
}
|
||||
|
||||
$source = '';
|
||||
|
@ -1099,9 +1105,16 @@ App::get('/v1/storage/buckets/:bucketId/files/:fileId/download')
|
|||
}
|
||||
|
||||
if(!empty($source)) {
|
||||
if(!empty($rangeHeader)) {
|
||||
$response->send(substr($source, $rangeStart, ($rangeEnd - $rangeStart + 1)));
|
||||
}
|
||||
$response->send($source);
|
||||
}
|
||||
|
||||
if(!empty($rangeHeader)) {
|
||||
$response->send($device->read($path, $rangeStart, ($rangeEnd - $rangeStart + 1)));
|
||||
}
|
||||
|
||||
if ($size > APP_STORAGE_READ_BUFFER) {
|
||||
$response->addHeader('Content-Length', $device->getFileSize($path));
|
||||
$chunk = 2000000; // Max chunk of 2 mb
|
||||
|
|
|
@ -282,6 +282,22 @@ trait StorageBase
|
|||
$this->assertEquals('image/png', $file5['headers']['content-type']);
|
||||
$this->assertNotEmpty($file5['body']);
|
||||
|
||||
// Test ranged download
|
||||
$file51 = $this->client->call(Client::METHOD_GET, '/storage/buckets/' . $bucketId . '/files/' . $data['fileId'] . '/download', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
'Range' => 'bytes=0-99',
|
||||
], $this->getHeaders()));
|
||||
|
||||
$path = __DIR__ . '/../../../resources/logo.png';
|
||||
$originalChunk = \file_get_contents($path, false, null, 0, 100);
|
||||
|
||||
$this->assertEquals(206, $file51['headers']['status-code']);
|
||||
$this->assertEquals('attachment; filename="logo.png"', $file51['headers']['content-disposition']);
|
||||
$this->assertEquals('image/png', $file51['headers']['content-type']);
|
||||
$this->assertNotEmpty($file51['body']);
|
||||
$this->assertEquals($originalChunk, $file51['body']);
|
||||
|
||||
$file6 = $this->client->call(Client::METHOD_GET, '/storage/buckets/' . $bucketId . '/files/' . $data['fileId'] . '/view', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $this->getProject()['$id'],
|
||||
|
|
Loading…
Reference in a new issue