Test digest check for resumable upload

pull/4903/head
Chocobozzz 2022-04-19 14:25:33 +02:00
parent 77d0ae7b20
commit 33ac85bf61
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
2 changed files with 48 additions and 8 deletions

View File

@ -5,6 +5,7 @@ import * as chai from 'chai'
import { pathExists, readdir, stat } from 'fs-extra'
import { join } from 'path'
import { buildAbsoluteFixturePath } from '@shared/core-utils'
import { sha1 } from '@shared/extra-utils'
import { HttpStatusCode, VideoPrivacy } from '@shared/models'
import { cleanupTests, createSingleServer, PeerTubeServer, setAccessTokensToServers, setDefaultVideoChannel } from '@shared/server-commands'
@ -59,8 +60,9 @@ describe('Test resumable upload', function () {
contentLength?: number
contentRange?: string
contentRangeBuilder?: (start: number, chunk: any) => string
digestBuilder?: (chunk: any) => string
}) {
const { token, pathUploadId, expectedStatus, contentLength, contentRangeBuilder } = options
const { token, pathUploadId, expectedStatus, contentLength, contentRangeBuilder, digestBuilder } = options
const size = await buildSize(defaultFixture, options.size)
const absoluteFilePath = buildAbsoluteFixturePath(defaultFixture)
@ -72,6 +74,7 @@ describe('Test resumable upload', function () {
size,
contentLength,
contentRangeBuilder,
digestBuilder,
expectedStatus
})
}
@ -122,13 +125,14 @@ describe('Test resumable upload', function () {
describe('Directory cleaning', function () {
it('Should correctly delete files after an upload', async function () {
const uploadId = await prepareUpload()
await sendChunks({ pathUploadId: uploadId })
await server.videos.endResumableUpload({ pathUploadId: uploadId })
// FIXME: https://github.com/kukhariev/node-uploadx/pull/524/files#r852989382
// it('Should correctly delete files after an upload', async function () {
// const uploadId = await prepareUpload()
// await sendChunks({ pathUploadId: uploadId })
// await server.videos.endResumableUpload({ pathUploadId: uploadId })
expect(await countResumableUploads()).to.equal(0)
})
// expect(await countResumableUploads()).to.equal(0)
// })
it('Should not delete files after an unfinished upload', async function () {
await prepareUpload()
@ -252,6 +256,29 @@ describe('Test resumable upload', function () {
const result2 = await sendChunks({ pathUploadId: uploadId1 })
expect(result2.headers['x-resumable-upload-cached']).to.not.exist
})
it('Should refuse an invalid digest', async function () {
const uploadId = await prepareUpload({ token: server.accessToken })
await sendChunks({
pathUploadId: uploadId,
token: server.accessToken,
digestBuilder: () => 'sha=' + 'a'.repeat(40),
expectedStatus: 460
})
})
it('Should accept an appropriate digest', async function () {
const uploadId = await prepareUpload({ token: server.accessToken })
await sendChunks({
pathUploadId: uploadId,
token: server.accessToken,
digestBuilder: (chunk: Buffer) => {
return 'sha1=' + sha1(chunk, 'base64')
}
})
})
})
after(async function () {

View File

@ -482,8 +482,17 @@ export class VideosCommand extends AbstractCommand {
size: number
contentLength?: number
contentRangeBuilder?: (start: number, chunk: any) => string
digestBuilder?: (chunk: any) => string
}) {
const { pathUploadId, videoFilePath, size, contentLength, contentRangeBuilder, expectedStatus = HttpStatusCode.OK_200 } = options
const {
pathUploadId,
videoFilePath,
size,
contentLength,
contentRangeBuilder,
digestBuilder,
expectedStatus = HttpStatusCode.OK_200
} = options
const path = '/api/v1/videos/upload-resumable'
let start = 0
@ -505,6 +514,10 @@ export class VideosCommand extends AbstractCommand {
'Content-Length': contentLength ? contentLength + '' : chunk.length + ''
}
if (digestBuilder) {
Object.assign(headers, { digest: digestBuilder(chunk) })
}
const res = await got<{ video: VideoCreateResult }>({
url,
method: 'put',