X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fobject-storage-proxy.ts;h=8e2cc4af985592b25a440d6cf3c3adbe42967c33;hb=4cf800a350972a078c074da6b31da2b98ab4b007;hp=6bff05f14052d9237cd35cecbe65d35114cfc5b0;hpb=09f3d81e0c8edebbe8f5698811ecfb165f942378;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/object-storage-proxy.ts b/server/controllers/object-storage-proxy.ts index 6bff05f14..8e2cc4af9 100644 --- a/server/controllers/object-storage-proxy.ts +++ b/server/controllers/object-storage-proxy.ts @@ -1,11 +1,7 @@ import cors from 'cors' import express from 'express' -import { PassThrough, pipeline } from 'stream' -import { logger } from '@server/helpers/logger' -import { StreamReplacer } from '@server/helpers/stream-replacer' import { OBJECT_STORAGE_PROXY_PATHS } from '@server/initializers/constants' -import { injectQueryToPlaylistUrls } from '@server/lib/hls' -import { getHLSFileReadStream, getWebTorrentFileReadStream } from '@server/lib/object-storage' +import { proxifyHLS, proxifyWebTorrentFile } from '@server/lib/object-storage' import { asyncMiddleware, ensureCanAccessPrivateVideoHLSFiles, @@ -13,9 +9,7 @@ import { ensurePrivateObjectStorageProxyIsEnabled, optionalAuthenticate } from '@server/middlewares' -import { HttpStatusCode } from '@shared/models' -import { buildReinjectVideoFileTokenQuery, doReinjectVideoFileToken } from './shared/m3u8-playlist' -import { GetObjectCommandOutput } from '@aws-sdk/client-s3' +import { doReinjectVideoFileToken } from './shared/m3u8-playlist' const objectStorageProxyRouter = express.Router() @@ -25,14 +19,14 @@ objectStorageProxyRouter.get(OBJECT_STORAGE_PROXY_PATHS.PRIVATE_WEBSEED + ':file ensurePrivateObjectStorageProxyIsEnabled, optionalAuthenticate, asyncMiddleware(ensureCanAccessVideoPrivateWebTorrentFiles), - asyncMiddleware(proxifyWebTorrent) + asyncMiddleware(proxifyWebTorrentController) ) objectStorageProxyRouter.get(OBJECT_STORAGE_PROXY_PATHS.STREAMING_PLAYLISTS.PRIVATE_HLS + ':videoUUID/:filename', ensurePrivateObjectStorageProxyIsEnabled, optionalAuthenticate, asyncMiddleware(ensureCanAccessPrivateVideoHLSFiles), - asyncMiddleware(proxifyHLS) + asyncMiddleware(proxifyHLSController) ) // --------------------------------------------------------------------------- @@ -41,75 +35,25 @@ export { objectStorageProxyRouter } -async function proxifyWebTorrent (req: express.Request, res: express.Response) { +function proxifyWebTorrentController (req: express.Request, res: express.Response) { const filename = req.params.filename - logger.debug('Proxifying WebTorrent file %s from object storage.', filename) - - try { - const { response: s3Response, stream } = await getWebTorrentFileReadStream({ - filename, - rangeHeader: req.header('range') - }) - - setS3Headers(res, s3Response) - - return stream.pipe(res) - } catch (err) { - return handleObjectStorageFailure(res, err) - } + return proxifyWebTorrentFile({ req, res, filename }) } -async function proxifyHLS (req: express.Request, res: express.Response) { +function proxifyHLSController (req: express.Request, res: express.Response) { const playlist = res.locals.videoStreamingPlaylist const video = res.locals.onlyVideo const filename = req.params.filename - logger.debug('Proxifying HLS file %s from object storage.', filename) - - try { - const { response: s3Response, stream } = await getHLSFileReadStream({ - playlist: playlist.withVideo(video), - filename, - rangeHeader: req.header('range') - }) - - setS3Headers(res, s3Response) - - const streamReplacer = filename.endsWith('.m3u8') && doReinjectVideoFileToken(req) - ? new StreamReplacer(line => injectQueryToPlaylistUrls(line, buildReinjectVideoFileTokenQuery(req, filename.endsWith('master.m3u8')))) - : new PassThrough() + const reinjectVideoFileToken = filename.endsWith('.m3u8') && doReinjectVideoFileToken(req) - return pipeline( - stream, - streamReplacer, - res, - err => { - if (!err) return - - handleObjectStorageFailure(res, err) - } - ) - } catch (err) { - return handleObjectStorageFailure(res, err) - } -} - -function handleObjectStorageFailure (res: express.Response, err: Error) { - if (err.name === 'NoSuchKey') { - logger.debug('Could not find key in object storage to proxify private HLS video file.', { err }) - return res.sendStatus(HttpStatusCode.NOT_FOUND_404) - } - - return res.fail({ - status: HttpStatusCode.INTERNAL_SERVER_ERROR_500, - message: err.message, - type: err.name + return proxifyHLS({ + req, + res, + playlist, + video, + filename, + reinjectVideoFileToken }) } - -function setS3Headers (res: express.Response, s3Response: GetObjectCommandOutput) { - if (s3Response.$metadata.httpStatusCode === HttpStatusCode.PARTIAL_CONTENT_206) { - res.status(HttpStatusCode.PARTIAL_CONTENT_206) - } -}