From 1984ac99574edacab322a894cb7159aefde071f6 Mon Sep 17 00:00:00 2001 From: gioelecerati Date: Sat, 14 Oct 2023 16:11:47 +0200 Subject: [PATCH] vod: specify content-length when creating presigned urls --- packages/api/src/controllers/asset.ts | 25 ++++++++++++++++++++----- packages/api/src/controllers/helpers.ts | 15 ++++++++++++--- packages/api/src/schema/db-schema.yaml | 2 ++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/packages/api/src/controllers/asset.ts b/packages/api/src/controllers/asset.ts index f35fea73d2..e4c7fd0e50 100644 --- a/packages/api/src/controllers/asset.ts +++ b/packages/api/src/controllers/asset.ts @@ -508,12 +508,17 @@ async function genUploadUrl( playbackId: string, objectStoreId: string, jwtSecret: string, - aud: string + aud: string, + contentLength?: number ) { const uploadedObjectKey = `directUpload/${playbackId}`; const os = await getActiveObjectStore(objectStoreId); - const presignedUrl = await getS3PresignedUrl(os, uploadedObjectKey); + const presignedUrl = await getS3PresignedUrl( + os, + uploadedObjectKey, + contentLength + ); const uploadToken = jwt.sign({ playbackId, presignedUrl, aud }, jwtSecret, { algorithm: "HS256", }); @@ -877,7 +882,8 @@ app.post( playbackId, vodObjectStoreId, jwtSecret, - jwtAudience + jwtAudience, + req.body.contentLength ); const ingests = await req.getIngest(); @@ -1049,7 +1055,6 @@ app.put("/upload/direct", async (req, res) => { jwtSecret, jwtAudience ); - // ensure upload exists and is pending await getPendingAssetAndTask(playbackId); @@ -1064,7 +1069,17 @@ app.put("/upload/direct", async (req, res) => { ); } }); - + proxy.on("error", function (err, req, proxyRes) { + console.error("Proxy error:", err); + if (!res.headersSent) { + res.status(403); + res.end(); + proxyRes.end(); + } else { + res.end(); + proxyRes.end(); + } + }); proxy.web(req, res, { target: uploadUrl, changeOrigin: true, diff --git a/packages/api/src/controllers/helpers.ts b/packages/api/src/controllers/helpers.ts index af98e58a30..5d95909285 100644 --- a/packages/api/src/controllers/helpers.ts +++ b/packages/api/src/controllers/helpers.ts @@ -223,13 +223,22 @@ export async function getObjectStoreS3Config( }; } -export async function getS3PresignedUrl(os: ObjectStore, objectKey: string) { +export async function getS3PresignedUrl( + os: ObjectStore, + objectKey: string, + contentLength?: number +) { const config = await getObjectStoreS3Config(os); const s3 = new S3Client(config); - const putCommand = new PutObjectCommand({ + let putCommandConfig = { Bucket: config.bucket, Key: objectKey, - }); + ContentLength: null, + }; + if (contentLength) { + putCommandConfig.ContentLength = contentLength; + } + const putCommand = new PutObjectCommand(putCommandConfig); const expiresIn = 12 * 60 * 60; // 12h in seconds return getSignedUrl(s3, putCommand, { expiresIn }); } diff --git a/packages/api/src/schema/db-schema.yaml b/packages/api/src/schema/db-schema.yaml index 5c52b848b9..fb6b6b7d1a 100644 --- a/packages/api/src/schema/db-schema.yaml +++ b/packages/api/src/schema/db-schema.yaml @@ -920,6 +920,8 @@ components: description: Object store ID where the asset is stored writeOnly: true example: 09F8B46C-61A0-4254-9875-F71F4C605BC7 + contentLength: + type: number catalystPipelineStrategy: $ref: "#/components/schemas/task/properties/params/properties/upload/properties/catalystPipelineStrategy" ipfs-file-info: