From 276250f0a36e00373166d91d539e5220d6f158c7 Mon Sep 17 00:00:00 2001 From: Rigel Kent Date: Mon, 25 Oct 2021 17:42:20 +0200 Subject: prevent multiple post-process triggering of upload-resumable (#4175) * prevent multiple post-process triggering of upload-resumable * switch from 409 to 503 for upload being processed * Improve resumable upload check Co-authored-by: Chocobozzz --- server/controllers/api/videos/upload.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'server/controllers') diff --git a/server/controllers/api/videos/upload.ts b/server/controllers/api/videos/upload.ts index 55cb9cf20..02aadd426 100644 --- a/server/controllers/api/videos/upload.ts +++ b/server/controllers/api/videos/upload.ts @@ -7,6 +7,7 @@ import { uuidToShort } from '@server/helpers/uuid' import { createTorrentAndSetInfoHash } from '@server/helpers/webtorrent' import { getLocalVideoActivityPubUrl } from '@server/lib/activitypub/url' import { generateWebTorrentVideoFilename } from '@server/lib/paths' +import { Redis } from '@server/lib/redis' import { addMoveToObjectStorageJob, addOptimizeOrMergeAudioJob, @@ -94,7 +95,7 @@ uploadRouter.delete('/upload-resumable', uploadRouter.put('/upload-resumable', openapiOperationDoc({ operationId: 'uploadResumable' }), authenticate, - uploadxMiddleware, // uploadx doesn't use call next() before the file upload completes + uploadxMiddleware, // uploadx doesn't next() before the file upload completes asyncMiddleware(videosAddResumableValidator), asyncMiddleware(addVideoResumable) ) @@ -122,15 +123,20 @@ export async function addVideoLegacy (req: express.Request, res: express.Respons const videoInfo: VideoCreate = req.body const files = req.files - return addVideo({ res, videoPhysicalFile, videoInfo, files }) + const response = await addVideo({ res, videoPhysicalFile, videoInfo, files }) + + return res.json(response) } -export async function addVideoResumable (_req: express.Request, res: express.Response) { +export async function addVideoResumable (req: express.Request, res: express.Response) { const videoPhysicalFile = res.locals.videoFileResumable const videoInfo = videoPhysicalFile.metadata const files = { previewfile: videoInfo.previewfile } - return addVideo({ res, videoPhysicalFile, videoInfo, files }) + const response = await addVideo({ res, videoPhysicalFile, videoInfo, files }) + await Redis.Instance.setUploadSession(req.query.upload_id, response) + + return res.json(response) } async function addVideo (options: { @@ -225,13 +231,13 @@ async function addVideo (options: { Hooks.runAction('action:api.video.uploaded', { video: videoCreated }) - return res.json({ + return { video: { id: videoCreated.id, shortUUID: uuidToShort(videoCreated.uuid), uuid: videoCreated.uuid } - }) + } } async function buildNewFile (videoPhysicalFile: express.VideoUploadFile) { -- cgit v1.2.3